проблема в конкатенации массивов в цикле - PullRequest
0 голосов
/ 01 февраля 2019

У меня есть многомерная матрица (10 * 59 * 2000), и я хочу объединить свои 10 испытаний в сигнале.Финальная матрица должна выглядеть примерно так (590 * 2000).Я пробовал несколько методов.

, когда я использую следующий код, я получаю сообщение об ошибке:

M = np.array([])
for i in range(0, 10)):
    m1 = raw._data[i]
    M = np.concatenate(([M, m1]), axis = 0)

ValueError: все входные массивы должны иметь одинаковое количество измерений

Когда я использую другой код, который предложил Здесь , я получаю ту же ошибку

M = np.empty((59, 2000))
for i in range(0, 10):
    m1 = raw._data[i]
    M = np.append(M, [m1], axis = 0)

Но когда я изменяю [m1] на m1, я могу получить хороший результатно вместо (590 * 2000) результат (649 * 2000) - то, что пустой массив (59 * 2000), который я создал в первой строке, добавил к моей окончательной матрице.

M = np.append(M, m1, axis = 0)

Не могли бы вы дать мне знать, как я могу объединить эти массивы в цикле, чтобы сделать мой целевой массив (590 * 2000)?

Ответы [ 2 ]

0 голосов
/ 02 февраля 2019

Если мы должны выполнить итеративную конкатенацию:

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 имеет однородное числовое содержимое.

0 голосов
/ 01 февраля 2019

Я предполагаю, что ваша форма - это 10 испытаний, 59 каналов ЭЭГ и 2000 временных точек.

Требуется объединить измерение времени с результирующей формой 59, 20 * 2000.

np.concatenate(multi_trial, axis=1)
# or
np.hstack(multit_trial)

Что это делает: разбить multi_trial на первую ось (пробная).Со всеми массивами, которые он получает, один (канал, время) массив для каждого испытания, склейте их вместе вдоль второй оси, временной.

...