2016-05-30 21 views
0

這個問題可能非常簡單,但對於我的生活我無法弄清楚。基本上,我有一個神經元,其電壓正在建模,但我有隨機接收來自其他神經元的輸入尖峯。所以我的一位朋友幫助創建了一個基本上具有一些興奮性神經元的函數,該函數提供隨機增加電壓的隨機泊松尖峯,並且一些抑制性神經元提供下降尖峯來降低電壓。我已經包含下面的代碼。基本上,我試圖找出如何做的步驟是如何使迭代步驟中的I_syn項工作。我通常會認爲只寫I_syn[i-1],但給我一個錯誤:在ODE集成中引入一個函數

'function' object has no attribute '__getitem__'. 

所以我敢肯定,這個問題是非常簡單的,但它是我不知道如何克服的一個問題。我如何獲得這個程序來正確迭代I_syn的術語,這樣我就可以做一個ODE的基本迭代方案,同時包含之前在代碼中定義的函數?這很重要,因爲在不久的將來我可能會有更復雜的神經元方程,所以事先編寫函數然後根據需要將它們調用到迭代步驟會更好。謝謝!

from numpy import * 
from pylab import * 

## setup parameters and state variables 
T  = 50     # total time to simulate (msec) 
dt  = 0.125    # simulation time step (msec) 
time = arange(0, T+dt, dt) # time array 
t_rest = 0     # initial refractory time 

## LIF properties 
Vm  = zeros(len(time)) # potential (V) trace over time 
Rm  = 1     # resistance (kOhm) 
Cm  = 10     # capacitance (uF) 
tau_m = Rm*Cm    # time constant (msec) 
tau_ref = 4     # refractory period (msec) 
Vth  = 1     # spike threshold (V) 
V_spike = 0.5     # spike delta (V) 

## Stimulus 
I  = 1.5     # input current (A) 
N = 1000 
N_ex = 0.8*N #(0..79) 
N_in = 0.2*N #(80..99) 
G_ex = 0.1 
K = 4 

def I_syn(spks, t): 
    """ 
    Synaptic current 
    spks = [[synid, t],] 
    """ 
    if len(spks) == 0: 
     return 0 

    exspk = spks[spks[:,0]<N_ex] # Check for all excitatory spikes 
    delta_k = exspk[:,1] == t # Delta function 
    if np.any(delta_k) > 0: 
     h_k = np.random.rand(len(delta_k)) < 0.90 # probability of successful transmission 
    else: 
     h_k = 0 

    inspk = spks[spks[:,0] >= N_ex] #Check remaining neurons for inhibitory spikes 
    delta_m = inspk[:,1] == t #Delta function for inhibitory neurons 
    if np.any(delta_m) > 0: 
     h_m = np.random.rand(len(delta_m)) < 0.90 
    else: 
     h_m = 0 

    isyn = C_m*G_ex*(np.sum(h_k*delta_k) - K*np.sum(h_m*delta_m)) 

    return isyn 

## iterate over each time step 
for i, t in enumerate(time): 
    if t > t_rest: 
     Vm[i] = Vm[i-1] + (-Vm[i-1] + I_syn*Rm)/tau_m * dt 
    if Vm[i] >= Vth: 
    Vm[i] += V_spike 
    t_rest = t + tau_ref 

## plot membrane potential trace 
plot(time, Vm) 
title('Leaky Integrate-and-Fire Example') 
ylabel('Membrane Potential (V)') 
xlabel('Time (msec)') 
ylim([0,2]) 
show() 

回答

0

I_syn就是這麼使用I_syn[i-1]將拋出這個錯誤的函數:

'function' object has no attribute '__getitem__' 

如果你正在尋找的是從函數返回值,那麼你應該首先調用它,然後訪問你想要什麼。

# pass related arguments as well since the function expects it 
I_syn(arg1, arg2)[i-1] 
+0

所以我試着I_syn(spks,t)[i-1],並得到spks沒有定義的錯誤。我試着只用I_syn(t)[i-1],而我得到「I_syn()只需要2個參數(給出1)」。我認爲最好的選擇是定義「spks」,但我不確定我應該如何恰當地解決這個問題 – Brenton

+0

看來您需要首先理解基礎知識。當你在函數中傳遞'spks'時,它是否已經定義了某處?我想這不是,這就是爲什麼你得到這個錯誤。首先定義'spks',就像函數期望的那樣。然後,用參數調用函數。 – AKS

+0

好吧,我想我明白你說的要做什麼,除非我不確定函數期望spks是什麼,因爲我認爲它基本上充當參數。因此,spks應該基本上是事先列出的1000個神經元和它們發生的時間(我相信這就是它的寫法),但我不知道如何定義函數的外部(對不起,我是一個真正的新手在這) – Brenton