Два существующих массива Numpy, условно заполняющих NaN - PullRequest
0 голосов
/ 25 сентября 2019

Для каждого компонента в большом наборе данных у меня есть два одинаковых массива одинаковой формы: необработанные данные и данные артефактов, которые хранятся в фрейме данных pandas, например:

sub run1 ... run4
0 [data, art] ... [data, art]
1 [data, art] ... [data, art]
2 [data, art] ... [data, art]
3 [data, art] ... [data, art]
4 [data, art] ... [data, art]

Например: запуск субъекта 11 имеет

data([[104.,  96.,  94., ...,  99.,  99.,  96.],
       [102.,  94.,  92., ..., 100.,  99.,  97.],
       [101.,  93.,  91., ...,  98.,  98.,  96.],
       ...,
       [ -8.,  -5., -12., ...,  -9.,   3.,  10.],
       [ -8.,  -5., -13., ..., -10.,   4.,  11.],
       [ -9.,  -5., -13., ..., -10.,   5.,  13.]])

и

artifact([[2., 2., 2., ..., 2., 2., 2.],
       [2., 2., 2., ..., 2., 2., 2.],
       [2., 2., 2., ..., 2., 2., 2.],
       ...,
       [0., 0., 0., ..., 0., 0., 0.],
       [0., 0., 0., ..., 0., 0., 0.],
       [0., 0., 0., ..., 0., 0., 0.]])

Когда значение в массиве артефактов не равно 0, я хотел бы заменить соответствующее местоположение в массиве данных на NaN.Это может быть сделано на месте или в новом массиве.Каждый пробег не обязательно одинаковой длины между предметами.

Ответы [ 2 ]

1 голос
/ 26 сентября 2019

Использование циклов в Pandas (как и ответ Клейтона) снижает производительность и затрудняет чтение кода.Когда бы ни было возможно, позвольте Pandas обработать итерацию для вас, как это:

def replace_values(item):
    """Operate on a single DataFrame cell
    """
    data = item[0]
    artifact = item[1]
    data[artifact == 0] = np.nan
    return [data, artifact]

df.applymap(replace_values)
0 голосов
/ 26 сентября 2019

спасибо за ваши предложения.Я думаю, что я нашел обходной путь, реализующий такие маски.

import numpy.ma as ma

def artifactEEG(df):
    for sub in df.index.values:
        for run in df.columns:
             mx = ma.masked_array(df.loc[sub][run][0], mask=df.loc[sub][run][1])
             df.loc[sub][run][0] = mx
    return(df)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...