如何克服numpy.unique的MemoryError问题

5

我正在使用Numpy 1.11.1版本,需要处理一个二维数组

my_arr.shape = (25000, 25000)

所有的值都是整数,我需要一个独特的数组值列表。当使用lst = np.unique(my_arr)时,我得到了以下结果:
Traceback (most recent call last):
  File "<pyshell#38>", line 1, in <module>
    palette = np.unique(arr)
  File "c:\Python27\lib\site-packages\numpy\lib\arraysetops.py", line 176, in unique
    ar = np.asanyarray(ar).flatten()
MemoryError

我的电脑只有8GB的内存,但我尝试另一台16GB内存的机器,结果是相同的。监控内存和CPU使用情况并没有显示问题与RAM或CPU有关。

原则上,我知道数组由哪些值组成,但如果输入发生变化怎么办...另外,如果我想将数组的值替换为另一个值(比如说所有的2都替换成0),它是否也需要大量的RAM?


Python 32位还是64位? - fzzle
1
Python 2.7.12 32位版本 - TomGeo
听起来就是你的问题。不要使用32位的Python。另外,尝试使用尽可能小的整数;也许每个值只需要一个字节? - Eelco Hoogendoorn
1
好的,我可以进行64位的更改。 手头上所有的数组只由0、1或2组成 - 只是它们的形状非常巨大。 - TomGeo
1
切换到64位将允许您每个进程使用超过1GB的内存。使用my_arr.astype(np.int8)将为您节省另外4倍的内存空间。 - Eelco Hoogendoorn
你最终解决了这个问题吗?使用64位是否有效,还是你必须想出其他办法? - jpmc26
1个回答

0

Python 32位无法访问超过4 GiB RAM(通常约为2.5 GiB)的内存。显而易见的答案是使用64位版本。如果这不起作用,另一个解决方案是使用numpy.memmap并将数组内存映射到存储在磁盘上的文件中。


2
我仍然在使用64位和numpy.memmap时遇到了MemoryError。该数组是形状为(8465,103114)的float类型,仅比OP的数组略大一些。(它来自地理光栅。) - jpmc26

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接