Если мы должны выполнить итеративную конкатенацию:
In [84]: rdata = np.arange(24).reshape(4,3,2)
In [85]: M = np.empty((0,2), int)
...: for i in range(4):
...: M = np.concatenate((M, rdata[i,:,:]),axis=0)
...:
In [86]: M
Out[86]:
array([[ 0, 1],
[ 2, 3],
[ 4, 5],
[ 6, 7],
[ 8, 9],
[10, 11],
[12, 13],
[14, 15],
[16, 17],
[18, 19],
[20, 21],
[22, 23]])
Я получаю то же самое с rdata.reshape(12,2)
и с
In [89]: M = []
...: for i in range(4):
...: M.append(rdata[i,:,:])
...: M = np.concatenate(M, axis=0)
Даже при этом небольшом примере список добавляется в 2+ раза быстреечем конкатенация массива.
Мне не нужно итерировать - просто передайте rdata
для конкатенации.Он рассматривает трехмерный массив как список двумерного массива:
np.concatenate(rdata, axis=0)
Обратите внимание, что я использую concatenate
.Я не могу сказать достаточно плохих слов о np.append
.Это нормально, если вы хотите добавить скаляр в конец 1d-массива, но для всего остального его сложнее использовать и вводить пользователей в заблуждение разными способами.concatenate
принимает целый список предметов, append
просто принимает 2.
Существуют и другие обложки для concatenate
, которые полезны по-своему.np.stack
, пожалуй, лучший.Но в долгосрочной перспективе вы не будете использовать «стеки» правильно, если не поймете, как манипулировать измерениями и использовать concatenate
напрямую.
MATLAB позволяет наращивать массив постепенно.Я подозреваю, однако, что в фоновом режиме он делает много того же нового копирования массива, что делает numpy
.Списки Python лучше, потому что они не включают в себя копии.Список добавления просто добавляет указатель на буфер списков, так что это быстро и просто.Быстрый поиск в сети показывает, что даже в MATLAB динамическое расширение матрицы не рекомендуется;большинство рекомендует предварительно выделить матрицу.
numpy concatenate из списка немного похож на MATLAB cell2mat
.cell
, как и list
, может содержать объекты разных видов, в то время как matrix
имеет однородное числовое содержимое.