NumPy изменяя данные ЭЭГ в каналах и исследованиях - PullRequest
0 голосов
/ 04 июля 2019

Я работаю над набором данных электроэнцефалограммы. Набор данных измеряется с использованием 16 электродов. Каждый предмет данных имеет массив данных формы 122880 точек. Канал 1 измеряет 7680 точек данных, канал 2 измеряет 7680 и то же самое до 16 каналов.
7680 * 16 = 122800

Я изменил данные, используя

np.reshape(data,(7680,16).

Теперь я хочу, чтобы каждые 7680 точек данных из каждого канала разделялись далее на 256 точек данных. Поэтому я использую

np.reshape(data,(256,-1,16)

Дайте мне знать, это правильный подход. На самом деле я хочу 0-7680 элемент в первом канале, чем 7680-7680 * 2 в канале 2 и т. Д.
Теперь, если я возьму только один канал, у него 7680 баллов, я хочу, чтобы эти 7680 баллов преобразились в 30 испытаний, например, в каждом испытании 256 элементов

1 Ответ

1 голос
/ 04 июля 2019

Я был не прав.Когда вы зададите размеры как (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'.

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