Замена значений заливки в двумерном массиве значениями из одномерного массива

1

Моя цель - заполнить 2D-массив значениями из массива 1D, который точно соответствует шаблону значений в 2D-массиве. Например:

array_a = 
([[nan,nan,0],
 [0,nan,0],
 [nan,0,0], 
 [0,0,nan]])

array_b = 
([0.324,0.254,0.204,
0.469,0.381,0.292,
0.550])

И я хочу это сделать:

array_c = 
([[nan,nan,0.324],
 [0.254,nan,0.204],
 [nan,0.469,0.381], 
 [0.292,0.550,nan]])

Количество значений, которые должны быть заполнены в array_a, будет точно соответствовать количеству значений в array_b. Основная проблема заключается в том, что я хочу иметь значения nan в соответствующем порядке по всему массиву, и я не уверен, как лучше всего это сделать.

  • 1
    выровняйте массив array_a, получите индексы элементов non nan, замените элементы этих индексов на array_b и измените форму обратно
  • 0
    @ Базинга, нет необходимости выравнивать или менять форму. Логическое индексирование выравнивается автоматически.
Показать ещё 1 комментарий
Теги:
numpy
python-3.x

3 ответа

3
Лучший ответ

boolean indexing делает работу красиво:

Найдите nan:

In [229]: mask = np.isnan(array_a)
In [230]: mask
Out[230]: 
array([[ True,  True, False],
       [False,  True, False],
       [ True, False, False],
       [False, False,  True]])

boolean mask, применяемая к массиву, создает 1d-массив:

In [231]: array_a[~mask]
Out[231]: array([0., 0., 0., 0., 0., 0., 0.])

Используйте тот же массив в set контексте:

In [232]: array_a[~mask]=array_b
In [233]: array_a[~mask]
Out[233]: array([0.324, 0.254, 0.204, 0.469, 0.381, 0.292, 0.55 ])
In [234]: array_a
Out[234]: 
array([[  nan,   nan, 0.324],
       [0.254,   nan, 0.204],
       [  nan, 0.469, 0.381],
       [0.292, 0.55 ,   nan]])
2

Вы также можете сделать:

np.place(array_a, array_a == 0, array_b)

array_a

array([[  nan,   nan, 0.324],
       [0.254,   nan, 0.204],
       [  nan, 0.469, 0.381],
       [0.292, 0.55 ,   nan]])
1

Это должно сделать трюк, хотя может быть предварительно написанное решение или понимание списка, чтобы сделать то же самое.

import numpy as np
b_index = 0
array_c = np.zeros(np.array(array_a).shape)
for row_index, row in enumerate(array_a):
    for col_index, col in enumerate(row):
        if not np.isnan(col):
            array_c[row_index, col_index] = array_b[b_index]
            b_index += 1
        else:
            array_c[row_index, col_index] = np.nan

>>> print(array_c)
[[  nan   nan 0.324]
 [0.254   nan 0.204]
 [  nan 0.469 0.381]
 [0.292 0.55    nan]]

Ещё вопросы

Сообщество Overcoder
Наверх
Меню