2015-08-29 2 views
6

Я пытаюсь добавить два массива.Добавление 1-D массива в 3-мерный массив в Numpy

np.zeros((6,9,20)) + np.array([1,2,3,4,5,6,7,8,9]) 

Я хочу, чтобы получить что-то, что, как

array([[[ 1., 1., 1., ..., 1., 1., 1.], 
     [ 2., 2., 2., ..., 2., 2., 2.], 
     [ 3., 3., 3., ..., 3., 3., 3.], 
     ..., 
     [ 7., 7., 7., ..., 7., 7., 7.], 
     [ 8., 8., 8., ..., 8., 8., 8.], 
     [ 9., 9., 9., ..., 9., 9., 9.]], 

     [[ 1., 1., 1., ..., 1., 1., 1.], 
     [ 2., 2., 2., ..., 2., 2., 2.], 
     [ 3., 3., 3., ..., 3., 3., 3.], 
     ..., 
     [ 7., 7., 7., ..., 7., 7., 7.], 
     [ 8., 8., 8., ..., 8., 8., 8.], 
     [ 9., 9., 9., ..., 9., 9., 9.]], 

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

+0

Какая должна быть форма выходного массива? – Divakar

+0

Для этого примера необходимо сохранить форму 3-мерного массива, поэтому 6,9,20 – psh5017

+0

Вы не получите выход типа 'array ([[[1., 2., 3.,. .., 7., 8., 9.], ... 'с этой формой' (6,9,20) ', потому что последний размер в желаемом выходе, кажется, имеет 9 элементов, а не 20. – Divakar

ответ

6

Вы можете принести broadcasting в игру после расширения размеров второго массива с None или np.newaxis, как так -

np.zeros((6,9,20))+np.array([1,2,3,4,5,6,7,8,9])[None,:,None] 
+0

Отлично! !! Благодаря!!!!!!!!!!!!!!! – psh5017

0

Вы можете использовать плитку (но вы также должны swapaxes, чтобы получить правильную форму) ,

A = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9]) 
B = np.tile(A, (6, 20, 1)) 
C = np.swapaxes(B, 1, 2) 
4

Если я вас правильно понял, то лучше всего использовать это NumPy's Broadcasting. Вы можете получить то, что вы хотите со следующим:

np.zeros((6,9,20))+np.array([1,2,3,4,5,6,7,8,9]).reshape((1,9,1)) 

Я предпочитаю использовать в reshape method с помощью ломтика обозначения для индексов пути Divakar показывает, потому что я сделал справедливый бит работы манипулирует форму, как переменные, и это немного легче передать кортежи в переменных, чем срезы. Вы также можете сделать что-то вроде этого:

array1.reshape(array2.shape) 

Кстати, если вы действительно ищете что-то так просто, как массив, который работает от 0 до N-1 вдоль оси, проверьте mgrid. Вы можете получить свой выше выход только с

np.mgrid[0:6,1:10,0:20][1] 
Смежные вопросы