2011-05-16 33 views
4

我想創建Python和NumPy的矩陣用下面的代碼:的Python Numpy.ndarray.shape限制

import numpy 

result=numpy.zeros((20,20,20,30,30,30)) 

numpy.save('result',result) 

我得到以下錯誤:

Traceback (most recent call last): 
File "numpy_memoryerror.py", 
line 5, in <module> 
    result=numpy.zeros((20,20,20,30,30,30)) 
MemoryError 

如果我使用更小的尺寸像這些:

result=numpy.ones((10,10,10,20,20,20)) 

然後代碼工作。

有人可以告訴我形狀元組的限制嗎?

+0

我在我的電腦上試用它,它會生成一個大小爲1.60 GB(1,728,000,096字節)的.npy文件。 – riza 2011-05-17 00:45:51

回答

6

它不是形狀元組的根本限制,也就是說你沒有足夠的內存(RAM)在你的系統上,因此MemoryError

再次20 * 20 * 20 * 30 * 30 * 30是2.16億個64位(8字節)浮點數或略多於1.6 GB的RAM。那麼當你運行腳本時,你有1.6 GB的RAM嗎? (不要忘記python,操作系統,其他正在運行的程序等使用的所有RAM)。如果您使用的是linux/unix,則可以通過在命令提示符處鍵入free -m來查看有多少空閒內存。在Windows中,您可以通過轉至任務管理器來查看可用內存。此外,一些操作系統限制了單個進程(如python)可以分配的內存量;例如,32位窗口僅爲每個進程提供2 GB的地址空間)。

將其與20 * 20 * 20 * 10 * 10 * 10進行比較,僅爲〜0.06 GB(或者僅爲內存的27倍)。

如果你並不需要8個字節的花車,你可以做

numpy.zeros(20,20,20,30,30,30, dtype='float32') 

這將減半使用單精度的內存佔用(32位)浮動。默認情況下,numpy使用dtype ='float64'。

粗略地說,一個32位浮點數有8位精度,64位浮點數有16位精度。這意味着對於32位浮點數,1 + 1e-8顯示爲1,對於64位浮點數,1 + 1e-16顯示爲1,但1 + 1e-15顯示爲具有64位浮點數的1.000000000000001,而不是32位浮點數。

+0

我用dtype ='float32'試過了,它可以工作,創建一個大約860mb的文件。但是,我運行Win 7 64位,我有4 GB的RAM,其中約2.2 GB可用。順便說一句,有一個ram機制交換(分頁),處理需要更多內存的進程。在這種情況下,它不起作用。 – mileski 2011-05-16 19:09:44

+1

@makmiler:請注意,對於'numpy'陣列,您需要有連續的內存。即使你有足夠的內存消耗,它也不一定會像需要的那樣大塊地連續。謝謝 – eat 2011-05-16 20:09:48

+0

@eat:Windows報告爲「可用」的內存是可分頁的,因此它可以分頁到一個連續的塊。 – 2011-05-16 20:37:03