arumport在numpy.array上作为生成器

时间:2017-02-24 22:04:54

标签: python-3.x numpy generator

我是python的新手,所以我可能做错了。我先解释一下我想要的东西。

我有一个巨大的1d numpy.array有一些值,我需要知道前n个最小值的索引。我需要它们以供以后计算。我当然可以做ind = numpy.argsort(hugearray)[:n]之类的事情。

问题在于,事先我不知道我需要多少索引,我的计算是迭代的并且逐个获取索引直到有足够的计算。

另一件事是,我想要一个懒惰的argsort来避免创建新的整数argsorted值并防止不必要的搜索,所以我想到了一个生成器。但我真的不知道怎么用numpy.array来做。

UPD:来自hpaulj的答案,我试图创建一个生成器:

def gargsort(arr):
    arr=arr.copy()
    for i in range(len(arr)):
        k = np.argmin(arr)
        arra[k] = np.iinfo(arr[k]).max
        yield k

可能有可能做得更好吗?

1 个答案:

答案 0 :(得分:0)

如果n不是太大,这里的迭代方法似乎比argsort快:

In [135]: arr = np.arange(200000)
In [136]: np.random.shuffle(arr)
In [137]: def foo(arr):
     ...:     arr=arr.copy()
     ...:     alist=[]
     ...:     for i in range(10):
     ...:         k=np.argmin(arr)
     ...:         alist.append(k)
     ...:         arr[k]=200000
     ...:     return alist
     ...: 
In [138]: foo(arr)
Out[138]: [176806, 180397, 139992, 151809, 59931, 59866, 130026, 191357, 84166, 130359]
In [139]: np.argsort(arr)[:10]
Out[139]: 
array([176806, 180397, 139992, 151809,  59931,  59866, 130026, 191357,
        84166, 130359], dtype=int32)
In [140]: timeit np.argsort(arr)[:10]
100 loops, best of 3: 15.8 ms per loop
In [141]: timeit foo(arr)
1000 loops, best of 3: 1.69 ms per loop

(如果需要,我稍后会发表评论)。