Как добавить разные размеры массивов NumPy и положить Na в пустом месте - PullRequest
1 голос
/ 24 апреля 2019

Я хочу добавить новую строку в пустой массив 2d, скажем, если массив 1 имеет размеры (2, 5), а массив 2 - это разновидность строки (которая имеет 3 значения или столбцы) формы (3,) мой результирующий массив должен выглядеть следующим образом (3, 10), а последние два индекса в 3-й строке должны быть NA.

arr1 = array([[9, 4, 2, 6, 7],
              [8, 5, 4, 1, 3]])

arr2 = array([3, 1, 5])

after some join or concat operation

arr1_arr2 = array([[9, 4, 2, 6, 7],
                   [8, 5, 4, 1, 3], 
                   [3, 1, 5, np.nan, np.nan]])

Я пробовал numpy append concat функции, но они не работают таким образом.

1 Ответ

1 голос
/ 24 апреля 2019

Вы можете объединять массивы только с одинаковым количеством измерений (это можно разрешить с помощью широковещательной передачи) и с таким же количеством элементов, за исключением оси объединения.

Таким образом, вам нужно добавить / объединить пустой массивправильной формы и заполните ее значениями arr2.

# concatenate an array of the correct shape filled with np.nan
arr1_arr2 = np.concatenate((arr1, np.full((1, arr1.shape[1]), np.nan)))
# fill concatenated row with values from arr2
arr1_arr2[-1, :3] = arr2

Но в целом это всегда хороший совет, НЕ добавлять / объединять и т. д. массивы.Если это возможно, попробуйте заранее угадать правильную форму конечного массива и создайте пустой массив (или заполненный np.nan) конечной формы, который будет заполнен в процессе.Например:

arr1_arr2 = np.full((3, 5), np.nan)
arr1_arr2[:-1, :] = arr1
arr1_arr2[-1, :arr2.shape[0]] = arr2

Если это только одна операция добавления / объединения и она не критична для производительности, то можно объединить / добавить, в противном случае предпочтительнее полное предварительное распределение.

Если многие массивы должны быть объединены, и все массивы для объединения имеют одинаковую форму, это будет наилучший способ сделать это:

arr1 = np.array([[9, 4, 2, 6, 7],
                 [8, 5, 4, 1, 3]])
# some arrays to concatenate:
arr2 = np.array([3, 1, 5])
arr3 = np.array([5, 7, 9])
arr4 = np.array([54, 1, 99])
# make array of all arrays to concatenate:
arrs_to_concat = np.vstack((arr2, arr3, arr4))
# preallocate result array filled with nan
arr1_arr2 = np.full((arr1.shape[0] + arrs_to_concat.shape[0], 5), np.nan)
# fill with values:
arr1_arr2[:arr1.shape[0], :] = arr1
arr1_arr2[arr1.shape[0]:, :arrs_to_concat.shape[1]] = arrs_to_concat

С точки зрения производительности это может быть хорошей идеей для большие массивы для использования np.empty для предварительного выделения окончательного массива и заполнения только оставшейся фигуры с помощью np.nan.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...