Как использовать numpy.dstack в цикле? - PullRequest
0 голосов
/ 04 ноября 2018

Я пытаюсь заполнить массив с помощью 2D-массивов с помощью np.dstack.

m1 = np.array([[1,1],[1,1]])
m2 = np.array([[2,2],[2,2]])
m3 = np.array([[3,3],[3,3]])

lst = m1
lst = np.dstack((lst,m2))
lst = np.dstack((lst,m3))

Какой правильный способ сделать это в цикле? Я ищу что-то вроде

lst = np.empty(...)
for _
    lst = np.dstack((lst,variable2Darray))

Ответы [ 3 ]

0 голосов
/ 04 ноября 2018

Нет необходимости делать это в цикле for, вы можете добавить переменное количество матриц в кортеж, который вы передаете np.dstack, например:

>>> np.dstack((m1, m2, m3))
array([[[1, 2, 3],
        [1, 2, 3]],

       [[1, 2, 3],
        [1, 2, 3]]])
0 голосов
/ 04 ноября 2018

Как показали другие ответы, вы можете поместить массивы в список и объединить их в новый массив одним вызовом:

In [173]: m1 = np.array([[1,1],[1,1]])
     ...: m2 = np.array([[2,2],[2,2]])
     ...: m3 = np.array([[3,3],[3,3]])
     ...: 
     ...: 
In [174]: alist = [m1,m2,m3]
In [175]: np.stack(alist)
Out[175]: 
array([[[1, 1],
        [1, 1]],

       [[2, 2],
        [2, 2]],

       [[3, 3],
        [3, 3]]])

У numpy первая ось - самая внешняя. В отличие от MATLAB последняя ось является самой внешней. Таким образом, stack (или np.array(alist)) является естественным эквивалентом. Но если вам нужно присоединиться к ним по новой внутренней оси, используйте:

In [176]: np.stack(alist,axis=2)        # or np.dstack(alist)
Out[176]: 
array([[[1, 2, 3],
        [1, 2, 3]],

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

Или, если вы создаете массивы по одному, используйте добавление в список:

In [177]: alist = []
In [178]: for a in m1,m2,m3:
     ...:     alist.append(a)

Возможно, самая близкая вещь к вашему MATLAB:

In [181]: arr = np.zeros((2,2,3),int)
In [183]: for i,m in enumerate([m1,m2,m3]):
     ...:     arr[:,:,i] = m

for i=1:10 
    var = some2Dmatrix 
    A(:,:,i) = var;
end

В отличие от MATLAB numpy не просто добавляет слой при индексировании сверх текущего размера. Я также подозреваю, что код MATLAB на самом деле скрывает некоторый дорогостоящий код изменения размера матрицы. Это не то, что я делал много лет назад, когда профессионально использовал MATLAB.

Но чтобы ответить на вопрос, на который мы не хотим отвечать:

In [185]: arr = np.zeros((2,2,0),int)   # your empty(?)
In [187]: for m in (m1,m2,m3):
     ...:     arr = np.concatenate((arr, m[:,:,None]), axis=2)    
In [188]: arr.shape
Out[188]: (2, 2, 3)

Если вы не понимаете деталей этой итерации, вам, вероятно, не следует пытаться создать массив большего размера с повторными concatenate (или dstack). Вы должны получить правильную начальную форму arr и правильную форму массива итераций. Плюс это делает новый arr с каждой петлей. Это дороже, чем добавление в список.

0 голосов
/ 04 ноября 2018

Вам не нужна петля. Вам нужен список или кортеж массивов:

m1 = np.array([[1,1],[1,1]])
m2 = np.array([[2,2],[2,2]])
m3 = np.array([[3,3],[3,3]])

arrays = m1, m2, m3 # A tuple of arrays
lst = np.dstack(arrays) # Stack them all
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...