Я был не прав.Когда вы зададите размеры как (256,-1,16)
, numpy сделает для вас деление и заменит -1
на 30
.Обратите внимание, что это может произойти только для отрицательного целого числа (я тестировал с -1
, -2
, -3
).Поэтому
np.reshape(data,(256,-1,16))
вернет массив размером 256 x 30 x 16
и да, все готово.
РЕДАКТИРОВАТЬ: для ваших данных, как сказано:
Первые 7680 выборок представляют 1-й канал, затем 7680 - 2-й канал и т. Д.
Правильный способ изменить его:
np.reshape(data, (16, 7680))
Затем вы хотите разделить эти 7680.выборок до 30 испытаний, каждый канал содержит 256 выборок.Это просто:
np.reshape(data, (16, 30, 256))
# or just simply
np.reshape(data, (16, -1, 256)) # as numpy will do division for you
Если вы хотите разделить 256 сэмплов на некоторый кластер сэмплов, сделайте следующее:
np.reshape(data, (16, 30, number_of_clusters, size_of_each_cluster))
Не забудьте всегда идти извневнутрь , сначала поместите номер кластера, а затем его размер.
EDIT2: Вы сказали, что хотите, чтобы набор из 30 испытаний, для каждого, содержал двумерный массив с 16 столбцами в виде16 электродов и 256 строк по 256 точек за 2 секунды.
Вот код:
temp = np.reshape(data, (7680,16), order='F')
output = temp.reshape((30,256,16))
, чтобы использовать 1-строчный код:
data.reshape((7680,16), order='F').reshape((30,256,16))
Объяснение: Перед питономизменяет ли ваш массив, он сначала выравнивает его (если еще нет).Затем он помещает каждый элемент в новый массив один за другим.
По умолчанию order='C'
, что означает, что элементы будут помещаться строка за строкой сверху вниз (так же, как мы пишем и читаем),В то время как order='F'
означает, что элементы будут помещаться столбец за столбцом слева направо.
Сначала ваши данные поступают с 7680 точками из канала 1.Вот почему я использую order='F'
.