我正在使用 numpy 编写一个神经场,对于 100*100 个神经元的映射,我需要管理一个 10000*10000 的连接映射。
因此,我使用 meshgrid 创建连接图,并尝试应用墨西哥帽函数的改编版。在这里,您有可以尝试的代码:如果您输入 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)
凭经验,经过一些尝试调试,我将网格上的每个操作都分开了,似乎是除法和取模没有通过。
有解决办法吗?我真的不想使用循环并减慢计算速度。
最佳答案
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 的整数数组占用 800 MB——几乎是 1 GB。您有其中两个,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])
由于您没有创建副本,因此这种方法占用的内存应该较少。创建尽可能少的 800 MB 数组——您已经有两个(X
和 Y
),因此您可能已经达到了计算机内存容量的上限.
关于python - NumPy / python : Meshgrid division operation: MemoryError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11225488/