2

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

所以我用meshgrid创建了我的连接图,并尝试应用墨西哥帽子功能的改编。在这里,你有你可以尝试的代码:如果你输入taille = 60or taille = 70(神经图的宽度),它会工作(在我的电脑上,没问题)但是,如果你尝试使用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)

根据经验,经过一些尝试调试,我已经将meshgrid上的每个操作分开了,似乎是除法和取模没有通过。

有没有解决方案来进行这种划分?我真的不想使用循环并减慢计算速度。

4

2 回答 2

6

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——几乎是一个千兆字节。你有两个,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),因此您可能已经在推动计算机内存容量的上限。

于 2012-06-27T13:24:31.393 回答
3

因此,即使我使用就地操作,我也使用了超过 2GB 的空间。事实上,我记得 32 位应用程序在 Windows 上使用的 RAM 不能超过 2GB。所以我下载了 64 位的 Python 和 64 位的 Numpy(可在http://www.lfd.uci.edu/~gohlke/pythonlibs/找到)。请注意,Numpy 在 64 位中不存在,这对于计算库来说很奇怪。它现在有效!我希望这对其他人有用。

于 2012-06-27T14:50:42.540 回答