我正在尝试对一个大的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) 感谢。
答案 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。