インデックスを取得し、advanced-indexing
を使用して、分割された配列を取得します。したがって
、寸法の任意の数の一般的ndarrayための任意の一般的な軸に沿った実装、そうのようになる -
def partition_results(a, k, axis=-1):
idx = np.argpartition(a, k, axis=axis)
index_arr = list(np.ix_(*[range(i) for i in a.shape]))
index_arr[axis] = idx
return idx, a[index_arr]
np.ix_
は、タスクを達成するために私達に「広がるアウト」レンジアレイを与えますadvanced-indexing
。これらの範囲配列は、argpartition
インデックス配列内の軸の長さに対応するすべての次元をカバーするために必要です。最後のインデックス配列を除くインデックス配列はargpartition
インデックスです。この設定は、このような索引付け操作に必要です。
そうは、np.argpartition
とnp.partition
への2つの別々の呼び出しを使用してのアプローチでは、我々はそれを持っているでしょう、そうのように -
def partition_results_exclusive_way(a, k):
idx = np.argpartition(a, k, axis=-1)
part_arr = np.partition(a, k, axis=-1)
return idx , part_arr
私たちは、次のセクションの性能と価値検証の上、比較のためにそれを使用します。
サンプル実行およびランタイムテスト -
In [496]: a = np.random.rand(20,20,20,20,20)
In [502]: A0, B0 = partition_results_exclusive_way(a, 10)
In [503]: A1, B1 = partition_results(a, 10)
In [504]: np.allclose(A0,A1)
Out[504]: True
In [505]: np.allclose(B0,B1)
Out[505]: True
In [506]: %timeit partition_results_exclusive_way(a, 10)
10 loops, best of 3: 92.6 ms per loop
In [507]: %timeit partition_results(a, 10)
10 loops, best of 3: 76 ms per loop
パフォーマンス番号にもう少し解剖、レッツ・時間別にargpartition
とpartition
- だから、
In [509]: %timeit np.argpartition(a, 10, axis=-1)
10 loops, best of 3: 49.6 ms per loop
In [510]: %timeit np.partition(a, 10, axis=-1)
10 loops, best of 3: 43.6 ms per loop
、advanced-indexing
操作はの半分の周りに私たちを負けまし私たちが持っていたのはnp.partition
です。私たちは間違いなくそこに救います!
ありがとうございました! IndexError:シェイプの不一致:インデックス配列をブロードキャストできませんでした – Ant
@Ant 3Dアレイのみで作業しているのですか、一般的なndarray(dim数)のソリューションをお探しですか? – Divakar
私は一般的なndarrayを探しています。次元が4または5を超えるとは思っていませんが、確かに3より大きくなる可能性があります:) – Ant