2012-06-27 85 views
2

我正在用numpy編程一個神經區域,並且對於100 * 100神經元的地圖,我需要管理一個10000 * 10000連接圖。Numpy/Python:Meshgrid除法操作:MemoryError

所以我用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) 

根據經驗,有些試驗調試後,我已經分居的meshgrid每個操作,並且它似乎是分裂和不通過模。

是否有解決方案使這個部門?我真的不想使用循環並減慢計算速度。

+0

另一種解決方案是使用'Cython'或fortran使用'f2py'將這個函數封裝在C中。這兩個選項都不是特別漂亮,但是它會在內存上更輕,因爲您可以使用循環。 – mgilson

回答

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的int數組佔用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),因此您可能已經在推動計算機內存容量的上限。

+0

感謝您的回答,所以這可以解釋當我抑制分裂時「行* =行」通過。 但是,我不明白的是,我有8GB的RAM。所以我不明白爲什麼Windows不希望我使用超過2GB的Python。 (因爲,對於100 * 100神經映射,它是Windows停止我的程序)。我們可以允許更多的內存來蟒蛇環境? – user1485163

3

因此,即使當我使用就地操作時,我也使用了2GB以上的內存。事實上,我記得32位應用程序在Windows上不能使用超過2GB的RAM。所以我下載了64位的Python和64位的Numpy(在http://www.lfd.uci.edu/~gohlke/pythonlibs/找到)。請注意,Numpy在64位中不存在officialy,這對計算庫很奇怪。它現在起作用了! 我希望這對其他人有用。