2017-02-21 106 views
2

Я недавно «научил» себя python, чтобы проанализировать данные для моих экспериментов. Как таковой я довольно невежественный по многим аспектам. Мне удалось сделать мой анализ работой для определенных файлов, но в некоторых случаях он ломается, и я думаю, что это результат ошибочного программирования.Как вычислить Delta F/F с помощью python?

В настоящее время я экспортирую файл, содержащий 3 массива numpy. Одним из этих массивов является мой сигнал (значения плавающего значения от -10 до 10). То, что я хочу сделать, - это нормализовать каждую дату в этом массиве до ряда значений, которые предшествуют этому. (т. е. значение 30001st должно иметь среднее значение из предшествующих 3000 значений, вычитаемых из него, а затем разность должна быть разделена на такое же среднее значение (предшествующие 3000 значений). Мои данные собираются со скоростью 100 Гц, чтобы получить нормализацию из ALST 30-х лет я должен использовать предшествующее 3000values ​​

как стоять это, как я сумел заставить его работать:.

это сохраняет сигнал в переменный фотосигнал

photosignal = np.array(seg.analogsignals[0], ndmin=1) 

теперь эта часть, которую я использую для получения дельта F/F над движущимся окном 30s

normalizedphotosignal = [(uu-(np.mean(photosignal[uu-3000:uu])))/abs(np.mean(photosignal[uu-3000:uu])) for uu in photosignal[3000:]] 

Ниже добавляет 3000 значений в начале, чтобы сохранить массив со ту же длину, так как позже я должен времени запереть его в другой список, который является тем же самым длина

holder =list(range(3000)) 
normalizedphotosignal = holder + normalizedphotosignal 

то, что я заметил, что в некоторых файлах этот код дает мне ошибку, потому что он говорит, что «срез» пуст, и поэтому он не может создать среднее.

Я думаю, может быть, есть лучший способ запрограммировать это, чтобы вообще избежать этой проблемы. Или это правильный способ подойти к этой проблеме?

Итак, я попробовал решение, но он довольно медленный, и тем не менее он все равно дает мне «ошибку в пустом месте». Подхожу скользящий среднего пост и нашел этот метод:

def running_mean(x, N): 
cumsum = np.cumsum(np.insert(x, 0, 0)) 
return (cumsum[N:] - cumsum[:-N])/N 

однако у меня возникают проблемы, вмещающий его на мой желаемый результат. а именно (средний уровень шума)/средний пробег

ответ

2

Ваш подход идет в правильном направлении. Однако вы допустили ошибку в своем понимании списка: вы используете uu в качестве своего индекса, тогда как uu - это элементы ваших входных данных photosignal.

Вы хотите что-то вроде этого:

normalizedphotosignal2 = np.zeros((photosignal.shape[0]-3000)) 
for i, uu in enumerate(photosignal[3000:]): 
    normalizedphotosignal2 = (uu - (np.mean(photosignal[i-3000:i])))/abs(np.mean(photosignal[i-3000:i])) 

Имейте в виду, что для-петли относительно медленно питона. Если производительность здесь является проблемой, вы можете попытаться избежать цикла for и использовать методы numpy (например, посмотрите на Moving average or running mean).

Надеюсь, это поможет.

+0

спасибо alot попробует его вместе со скользящими средними методами numpy, которые вы упомянули! –

+1

Где вы используете 'i'? Вы имели в виду использовать 'i-3000: i'? –

+0

@DavidCullen: Ты прав. Я забыл исправить ошибку, которую я решил исправить ... –

2

Хорошо, поэтому я, наконец, понял это благодаря вашей помощи и сообщениям, на которые вы ссылались.

Расчет за все мои данные (300 000 +) занимает около секунды!

Я использовал следующий код:

def runningmean(x,N): 
    cumsum =np.cumsum(np.insert(x,0,0)) 
    return (cumsum[N:] -cumsum[:-N])/N 

photosignal = np.array(seg.analogsignal[0], ndmin =1) 

photosignalaverage = runningmean(photosignal, 3000) 
holder = np.zeros(2999) 
photosignalaverage = np.append(holder,photosignalaverage) 

detalfsignal = (photosignal-photosignalaverage)/abs(photosignalaverage) 

Фотосигнал сохраняет свой необработанный сигнал в Numpy массиве. Photosignalaverage использует cumsum для вычисления среднего значения для каждого datapoint в photignal. Затем я добавляю первые значения 2999 как 0, для maintian - тот же размер списка, что и мой фотосигнал.

Затем я использую базовые вычисления numpy, чтобы получить сигнал дельта F/F.

Еще раз спасибо за отзыв, был действительно полезен!