Python 3.x 如何在NEST中创建环形网络?

Python 3.x 如何在NEST中创建环形网络?,python-3.x,nest-simulator,Python 3.x,Nest Simulator,我试图在NEST中开发一个简单的代码:一个由10个相同的神经元组成的网络,它们之间连接起来形成一个回路。我想使用数组来开发这段代码,但我得到了与参数类型不匹配相关的错误消息。下面我复制我的代码: #简单网络——初审 #由10个兴奋神经元组成的网络的第一个例子 #由IAF模型建模,这些模型连接在一个回路中 #每一个神经元都接受一个双倍的突触电流 #分别具有上升和下降时间的指数型 #0.5秒。和3秒。 #################################################

我试图在NEST中开发一个简单的代码:一个由10个相同的神经元组成的网络,它们之间连接起来形成一个回路。我想使用数组来开发这段代码,但我得到了与参数类型不匹配相关的错误消息。下面我复制我的代码:

#简单网络——初审
#由10个兴奋神经元组成的网络的第一个例子
#由IAF模型建模,这些模型连接在一个回路中
#每一个神经元都接受一个双倍的突触电流
#分别具有上升和下降时间的指数型
#0.5秒。和3秒。
###############################################################################
#导入必要的模块
进口派拉布
进口鸟巢
导入nest.graster\u打印
导入nest.voltage\u跟踪
将numpy作为np导入
###############################################################################
#创建节点
SetDefaults(“iaf_psc_alpha”,
{“C_m”:10.0,
“tau_m”:15.58,
“t_参考”:2.0,
“E_L”:-65.0,
“V_th”:-40.0,
“V_重置”:-65.0})
神经元=nest.Create(“iaf_psc_alpha”,10)
###############################################################################
#突触电流
exc=0.5
ini=3.0
Istim=0.0
Istim1=20.0
nest.SetStatus(神经元[:1],{“tau_syn_ex”:exc,“tau_syn_in”:ini,“I_e”:Istim1})
nest.SetStatus(神经元[1:],{“tau_syn_ex”:exc,“tau_syn_in”:ini,“I_e”:Istim})
###############################################################################
#输出设备
voltmeter1=nest.Create(“伏特计”)
nest.Connect(电压表1,神经元[1])
伏特计2=nest.Create(“伏特计”)
nest.Connect(电压表2,神经元[2])
voltmeter3=nest.Create(“伏特计”)
nest.Connect(电压表3,神经元[3])
spikes=nest.Create('spike\u detector')
###############################################################################
#回路中节点之间的兴奋性连接
重量=200.0
延迟=1.0
#“兴奋性”,
对于范围(1,9,1)内的i:
Connect(neurons[i],neurons[i+1],syn_spec={'weight':weight,'delay':delay})
Connect(neurons[10],neurons[1],syn_spec={'weight':weight',delay':delay})
###############################################################################
#尖峰检测器
嵌套连接(神经元、尖峰)
###############################################################################
#模拟和输出
nest.Simulate(400.0)
来自设备的嵌套电压跟踪(电压表1)
来自设备(电压表2)的嵌套电压跟踪
来自设备的嵌套电压跟踪(电压表3)
nest.voltage_trace.show()
nest.raster\u plot.from\u设备(尖峰,hist=True)
nest.光栅打印.show()

在Python数组中,索引从零开始,因此创建的十个神经元是
神经元[0]
神经元[9]
。要关闭环,您需要将最后一个神经元
神经元[9]
连接到第一个
神经元[0]
神经元[10]
不存在

另外请注意,由于第二个
Connect()
调用也是缩进的,因此位于
for
循环中,因此关闭环9次

如果您使用另一个Python特性,即从后面开始计算负索引,那么您的循环将变得非常简单。试着这样做:

for i in range(10):
    print(f"connect {(i-1)%10} -> {i}")
    nest.Connect([neurons[i-1]], [neurons[i]], syn_spec={'weight': weight, 'delay': delay})
(当然可以省略
print()
调用。我添加它只是为了显示发生了什么。)

如您所见,这会自动关闭您的铃声,您不需要额外的
Connect()
调用。在Python列表和numpy数组中,约定是
neurons[-1]
是数组的最后一个元素,
neurons[-2]
是最后一个元素之前的元素,等等。很好的效果是,你到处都可以看到
10
,并且很容易用神经元数量的变量替换。此外,还需要将
范围()
变得如此复杂

附加说明:对于长环,执行阵列切片可能要快得多:

nest.Connect(neurons[:-1], neurons[1:], syn_spec={'weight': weight, 'delay': delay})
nest.Connect([neurons[-1]], [neurons[0]], syn_spec={'weight': weight, 'delay': delay})

在这个变体中,您只需要两个connect调用(没有Python
for
loop!),因此大多数连接都可以由嵌套内核生成,而无需在每次synapse之后将控制权返回给Python。通常,调用越少,内核就越能利用并行化。

感谢您的宝贵意见。除此之外,我还想补充的是,在嵌套中,重要的是考虑<代码> Nest.Connect([NoM[I[1]),[NoM[i] ],,即双方括号,因为Connect命令也是巢中的其他命令,识别出一个处理的是神经元列表而不是一个简单的数字。(没有进一步方括号的表示法)。你是对的,在当前版本中,这仍然是必要的。你可以期待下一个版本,在那里你不需要记住任何东西;)–我还添加了一种将每个神经元连接到下一个神经元的优化方法。这可以在一次调用中完成(但不关闭环)。如果有任何答案解决了您的问题,请单击答案左侧投票下方的灰色复选标记接受。如果没有,请对其进行评论,解释答案不适用的原因,或要求澄清。您是否也遇到了特定错误?