python - NumPy / python : Meshgrid division operation: MemoryError

标签 python numpy division

我正在使用 numpy 编写一个神经场,对于 100*100 个神经元的映射,我需要管理一个 10000*10000 的连接映射。

因此,我使用 meshgrid 创建连接图,并尝试应用墨西哥帽函数的改编版。在这里,您有可以尝试的代码:如果您输入 taille = 60taille = 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。您有其中两个,XY,减法运算生成另一个。然后这个部门又做了一个……我想你可以看到这是怎么回事。

我的建议是尝试就地进行操作。您可以通过使用相应的 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])

如您所见,dc 指的是相同的数据。当然,实现相同效果的更简单方法是使用就地操作。

>>> 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 数组——您已经有两个(XY),因此您可能已经达到了计算机内存容量的上限.

关于python - NumPy / python : Meshgrid division operation: MemoryError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11225488/

相关文章:

python - 将 python 列表增加 mod x_i 的量,其中 x_i 取决于位置

java - Java中 double 的加法和除法

c - C 中计算可整除数字的递归函数

linux - NASM 除法使用变量而不是实际值

python - 为什么使用 packed *args/**kwargs 而不是传递 list/dict?

python - 使用 open() 内部循环理解 - 获取目录中所有文件的文本内容列表

python - 根据行中的值合并 Pandas 数据框

python - 在 Pandas 列中获得第一和第二高的值

python - 使用字典的 'get' 方法来选择大小写。为什么它总是选择错误的东西?

python - 使用 matplotlib *没有* TCL