MemoryError使用numpy argsort

时间:2015-05-07 15:13:52

标签: python python-2.7 numpy anaconda

我正在尝试对一个大的numpy数组进行排序。它是一个4维“float16”阵列,具有形状(450,470,10,470)(994,050,000个元素)。加载时,数组大小约为2 GB,我使用64位linux(和64位python),所以我应该可以使用我所有的8GB内存而没有问题,但是一旦我尝试使用argsort,我得到一个MemoryError。

代码如下:

import numpy as np

score = np.load('score.npy')
aaarg = np.argsort(score, axis=None)[:-21:-1]

我的目标是获得数组中最大的20个元素的索引。我也尝试使用argpartition而不是argsort,但我遇到了同样的问题。有什么出路吗?

我正在使用带有numpy 1.9.2的python 2.7.9(Anaconda 2.2.0) 感谢。

1 个答案:

答案 0 :(得分:1)

首先应该指出的是>>> [n for n in range(2, 500) if str(n) == str(n)[::-1] and (2**n-1)%n == 1] [2, 3, 5, 7, 11, 101, 131, 151, 181, 191, 313, 353, 373, 383] 返回一个索引数组,这些索引将数据索引到一个有序数组中。例如:

(2**n-1)%n == 1

如果您正在使用64位python&,那么argsort的dtype将为int64。 numpy所以让我们做一些数学。 994,050,000 * 8bytes / 1024 ** 3字节/ GB = 7.4 GB。这不包括a = np.random.random(100) idx = a.argsort() b = a[idx] 数组或任何系统/ python开销。

虽然您应该能够进行就地排序,但您无法在大小合适的数组内存中使用argsort。