我是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
可能有可能做得更好吗?
答案 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
(如果需要,我稍后会发表评论)。