Как объединить 2D-массив в каждый 3D-массив? - PullRequest
1 голос
/ 27 апреля 2019

Я пытаюсь объединить один и тот же 2D-массив, A с формой (n, m), в каждый 2D-массив 3D-массива, B с формой (N, n, k).

Я пробовал со стеками и конкатенацией, но это не сработало из-за совпадения только одного измерения. Я попробовал следующий пример, чтобы проверить идею:

a = np.array([[1],[2],[3]])
b = np.ones((2,3,4))

np.hstack((a,b))

ValueError: all the input arrays must have same number of dimensions

Я ожидал следующего результата:

array([[[1., 1., 1., 1., 1.],
        [2., 1., 1., 1., 1.],
        [3., 1., 1., 1., 1.]],

       [[1., 1., 1., 1., 1.],
        [2., 1., 1., 1., 1.],
        [3., 1., 1., 1., 1.]])

Я знаю, что это можно сделать с помощью цикла for, но я ищу более компактное и оптимизированное решение.

Ответы [ 2 ]

0 голосов
/ 27 апреля 2019

В настоящее время у вас есть массив (3, 1), который вы хотите добавить к массиву (2, 3, 4), как если бы он был передан в (2, 3, 1).Это один из тех случаев, когда вам придется делать трансляцию самостоятельно.Если вы используете broadcast_to, вы получите объект, который не копирует исходные данные и как минимум подходит для копирования в новый массив:

c = np.broadcast_to(a, b.shape[0:1] + a.shape)
result = np.concatenate((c, b), axis=2)

https://ideone.com/ypDpyT

0 голосов
/ 27 апреля 2019

Я знаю, что это немного грязно, но это делает работу

a = np.array([[1],[2],[3]])
b = np.ones((2,3,4))
a=np.expand_dims(a,axis=0)
a=np.concatenate((a,a),axis=0)
np.dstack((a,b))
...