我正在使用numpy编写一个神经场,对于一个包含10000*10000个神经元的映射,我需要管理一个100*100个连接映射。
因此,我使用网格创建了我的连接地图,并尝试应用墨西哥帽子功能的改编。在这里,你有你可以尝试的代码:如果你放入taille = 60或taille = 70 (神经映射的宽度),它将工作(在我的PC上,这没问题),但是,如果你尝试使用taille = 100,你会得到一个MemoryError。
import numpy as np
def connection_map4(width, se1, se2, K, inh):
x = np.arange(0, width**2, 1)
y = np.arange(0, width**2, 1)
X,Y = np.meshgrid(x, y)
print "Meshgrid cree"
A1 = 1.0 + inh
A2 = inh
# exp(|x-xc|/b + |y-yc|) -> Mexican Hat equation
# 2D/1D transformation relation: i = width.y + x
# ligne = (X/witdh - Y/width)**2
ligne = (X-Y)/width ## empirically, it's the division that doesn't pass.
print "avant carre"
ligne *= ligne
print "ligne"
colonne = (X%width-Y%width)**2
print "colonne"
M1 = A1*np.exp(-( (colonne)/(2*se1**2) + (ligne)/(2*se2**2) ) )
print "Premiere operation finie"
M2 = -A2*np.exp(-( (colonne)/(2*(K*se1)**2) + (ligne)/(2*(K*se2)**2) ) )
print "Seconde operation finie"
return(M1+M2)
taille = 100
connection_map4(taille, 7.5, 4.0, 2.0, 2.0)根据经验,经过一些试验调试后,我已经分离了网格上的每个操作,似乎是除法和模数没有通过。
有没有解决这个问题的办法呢?我真的不想使用循环来减慢计算速度。
发布于 2012-06-27 21:24:31
对numpy数组的基本算术运算进行复制。
>>> a = numpy.arange(10)
>>> b = a + 1
>>> c = b + 1
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> b
array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
>>> c
array([ 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])在我的机器上,一个10000x10000的int数组占用800MB --几乎是1 MB。您有其中的两个,X和Y,减法操作生成另一个。然后组织又制造了另一个..。我想你可以看到这是怎么回事了。
我的建议是尝试就地执行您的操作。您可以通过使用相应的numpy内置函数并指定一个out值来完成此操作。
>>> d = numpy.subtract(c, 1, out=c)
>>> c
array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
>>> d[0] = 5
>>> c
array([ 5, 2, 3, 4, 5, 6, 7, 8, 9, 10])如您所见,d和c引用的是相同的数据。当然,实现相同效果的一种更容易的方法是使用就地操作。
>>> c -= 1
>>> c
array([4, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> d
array([4, 1, 2, 3, 4, 5, 6, 7, 8, 9])由于您不是在创建副本,因此这种方法应该会占用较少的内存。创建尽可能少的800MB数组--您已经有了两个数组(X和Y),所以您可能已经达到了计算机内存容量的上限。
发布于 2012-06-27 22:50:43
因此,即使我使用就地操作,我也会使用超过2 2GB的空间。事实上,我记得32位应用程序在Windows上不能使用超过2 2GB的RAM。所以我下载了64位的Python和64位的Numpy (可以在http://www.lfd.uci.edu/~gohlke/pythonlibs/找到)。请注意,Numpy正式不存在于64位中,这对于计算库来说是很奇怪的。现在它起作用了!我希望这能对其他人有用。
https://stackoverflow.com/questions/11225488
复制相似问题