首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Numpy/Python:网格划分操作: MemoryError

Numpy/Python:网格划分操作: MemoryError
EN

Stack Overflow用户
提问于 2012-06-27 19:47:51
回答 2查看 1K关注 0票数 2

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

因此,我使用网格创建了我的连接地图,并尝试应用墨西哥帽子功能的改编。在这里,你有你可以尝试的代码:如果你放入taille = 60taille = 70 (神经映射的宽度),它将工作(在我的PC上,这没问题),但是,如果你尝试使用taille = 100,你会得到一个MemoryError。

代码语言:javascript
复制
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)

根据经验,经过一些试验调试后,我已经分离了网格上的每个操作,似乎是除法和模数没有通过。

有没有解决这个问题的办法呢?我真的不想使用循环来减慢计算速度。

EN

回答 2

Stack Overflow用户

发布于 2012-06-27 21:24:31

对numpy数组的基本算术运算进行复制。

代码语言:javascript
复制
>>> 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。您有其中的两个,XY,减法操作生成另一个。然后组织又制造了另一个..。我想你可以看到这是怎么回事了。

我的建议是尝试就地执行您的操作。您可以通过使用相应的numpy内置函数并指定一个out值来完成此操作。

代码语言:javascript
复制
>>> 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引用的是相同的数据。当然,实现相同效果的一种更容易的方法是使用就地操作。

代码语言:javascript
复制
>>> 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数组--您已经有了两个数组(XY),所以您可能已经达到了计算机内存容量的上限。

票数 6
EN

Stack Overflow用户

发布于 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位中,这对于计算库来说是很奇怪的。现在它起作用了!我希望这能对其他人有用。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11225488

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档