Как эффективно добавить столбец в многомерный массив с разными размерами? - PullRequest
0 голосов
/ 21 декабря 2018

Скажите, у меня есть эти два массива.

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

[[1. 1. 1. 1.]
[1. 1. 1. 1.]
[1. 1. 1. 1.]]]

b = np.ones(6) * 9
[9. 9. 9. 9. 9. 9.]

Вопрос.Как эффективно получить c таким, чтобы он выглядел следующим образом.

[[[1. 1. 1. 1. 9.]
[1. 1. 1. 1. 9.]
[1. 1. 1. 1. 9.]]

[[1. 1. 1. 1. 9.]
[1. 1. 1. 1. 9.]
[1. 1. 1. 1. 9.]]]

Я пытался использовать np.c_, np.column_stack и np.insert, но я изо всех сил пытаюсь выяснить, как получитьразмеры правильные.Я могу сделать это легко в 1D и 2D случае, но что-нибудь еще.: /

1 Ответ

0 голосов
/ 21 декабря 2018

a - (2,3,4).Для конкатенации по последней оси b должно быть (2,3,1) (или, в более общем случае (2,3, n)).b.reshape(2,3) поможет вам пройти часть пути, добавьте np.newaxis, чтобы получить остаток пути.Или включите 3-ю ось в форму: b.reshape(2,3,1).

In [21]: np.concatenate((a, b.reshape(2,3)[:,:,None]),-1)
Out[21]: 
array([[[1., 1., 1., 1., 9.],
        [1., 1., 1., 1., 9.],
        [1., 1., 1., 1., 9.]],

       [[1., 1., 1., 1., 9.],
        [1., 1., 1., 1., 9.],
        [1., 1., 1., 1., 9.]]])

np.c_ работает с тем же изменением формы, np.c_[a, b.reshape(2,3,1)].

np.c_ (или np.r_)принимает строковый параметр, который сообщает, как при необходимости расширять измерения.np.c_ является эквивалентом np.r_['-1,2,0',a, b.reshape(2,3)[:,:,None]].Этот строковый параметр немного сложен для понимания, но, поиграв с этим, я обнаружил, что это работает:

In [27]: np.c_['-1,3,0',a, b.reshape(2,3)]
Out[27]: 
array([[[1., 1., 1., 1., 9.],
        [1., 1., 1., 1., 9.],
        [1., 1., 1., 1., 9.]],

       [[1., 1., 1., 1., 9.],
        [1., 1., 1., 1., 9.],
        [1., 1., 1., 1., 9.]]])

Имейте в виду, что np.c_ использует np.concatenate (как и все функции «стека»), поэтомуIn [21] - самая прямая версия.Тем не менее некоторым людям нравится удобство формата np.c_.

(np.column_stack объединяется на оси 1; документы явно говорят о возврате 2d-массива. У вас есть 3D-случай.)

dstack (стек глубины) работает: np.dstack((a, b.reshape(2,3))).Он создает трехмерные массивы с:

In [49]: np.atleast_3d(b.reshape(2,3)).shape
Out[49]: (2, 3, 1)

, что в данном случае совпадает с тем, что делает строка '-1,3,0'.

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