- パフォーマンスを実現するため
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]
に置き換えてください。
サンプル実行 -
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 [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)]
パフォーマンスのために
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項目を見つけるのですが。 もう1つの方法は、numpy.ndenumerate()を使用してheapq.nsmallest()アイテムを取得する前にヒープに入る座標と値のフラットなリストを生成することです。 –
投稿されたソリューションのいずれかがあなたのために機能しましたか? – Divakar