- 성능
r,c = np.unravel_index(a.ravel().argsort()[:4], a.shape)
out = zip(r,c,a[r,c])
을 np.argpartition
을 사용하는 것이 좋습니다. 따라서 a.ravel().argsort()[:4]
을 np.argpartition(a.ravel(), range(4))[:4]
으로 바꾸십시오.
샘플 실행 - 일반적인 경우에 대한
In [285]: a
Out[285]:
array([[ inf, 1., 3., 2., 1.],
[ inf, inf, 2., 3., 2.],
[ inf, inf, inf, 5., 4.],
[ inf, inf, inf, inf, 1.],
[ inf, inf, inf, inf, inf]])
In [286]: out
Out[286]: [(0, 1, 1.0), (0, 4, 1.0), (3, 4, 1.0), (0, 3, 2.0)]
-
R,C = np.triu_indices(a.shape[1],1)
idx = a[R,C].argsort()[:4]
r,c = R[idx], C[idx]
out = zip(r,c,a[r,c])
샘플 실행 - 성능
In [351]: a
Out[351]:
array([[ 68., 67., 81., 23., 16.],
[ 84., 83., 20., 66., 48.],
[ 58., 72., 98., 63., 30.],
[ 61., 40., 1., 86., 22.],
[ 29., 95., 38., 22., 95.]])
In [352]: out
Out[352]: [(0, 4, 16.0), (1, 2, 20.0), (3, 4, 22.0), (0, 3, 23.0)]
, np.argpartition
을 사용하는 것이 좋습니다. 따라서 a[R,C].argsort()[:4]
을 np.argpartition(a[R,C], range(4))[:4]
으로 대체하십시오.
가능한 복제본 http://stackoverflow.com/questions/30577375/have-numpy-argsort-return-an-array-of-2d-indices 'np.dstack (np.unravel_index (np.argsort (tri .ravel()), arr.shape))' 왼쪽에 값이 압축되어 있습니다. – 3novak
이것은 도움이 될 수 있습니다 : http://stackoverflow.com/a/10337643/149076 ... 가장 작은 것보다는 가장 큰 K 항목을 찾는 것입니다. 또 다른 방법은 numpy.ndenumerate()를 사용하여 heapq.nsmallest() 항목을 가져 오기 전에 힙에 병합하는 좌표 및 값의 평면 목록을 생성하는 것입니다. –
게시 된 솔루션 중 어느 것이 적합합니까? – Divakar