6

タイプ numpy.ndarray の 1 次元配列があり、その最大エントリのインデックスを知りたいです。最大値を見つけた後、使用しました

peakIndex = numpy.where(myArray==max)

ピークのインデックスを見つけます。しかし、インデックスの代わりに、私のスクリプトは吐き出します

peakIndex = (array([1293]),)

コードで整数 1293 だけを吐き出したいのですが、出力をクリーンアップするにはどうすればよいですか?

4

2 に答える 2

7

を使用する代わりに、 を使用numpy.whereできますnumpy.argmax

peakIndex = numpy.argmax(myArray)

numpy.argmax最大値の最初の出現の平坦化されたインデックスである単一の数値を返します。が多次元の場合myArray、平坦化されたインデックスをインデックス タプルに変換することができます。

peakIndexTuple = numpy.unravel_index(numpy.argmax(myArray), myArray.shape)
于 2012-07-07T18:06:17.743 に答える
2

配列の最大値を見つけるには、array.max() メソッドを使用できます。これはおそらく、別の回答で説明されている for ループよりも効率的です。これは、pythonic ではないことに加えて、実際には python で記述されていません。(配列から項目を 1 つずつ取り出して比較したい場合は、ndenumerate を使用できますが、配列のパフォーマンス上の利点の一部が犠牲になります)

numpy.where() が結果をタプルとして生成する理由は、複数の位置が最大値に等しい可能性があるためです...そして、単純なもの (array[0] の取得など) をバグが発生しやすくするエッジケースです。Per配列内の何かの最初のインデックスを返す Numpy 関数はありますか?

「結果は、最初にすべての行インデックス、次にすべての列インデックスを持つタプルです」。

この例では 1 次元配列を使用しているため、提供された配列から直接必要な結果が得られます。これは 1 つの要素 (インデックスの 1 つの配列) を持つタプルで、ind_1d[0] を直接反復処理できますが、読みやすくするためだけにリストに変換しました。

>>> peakIndex_1d
array([ 1. ,  1.1,  1.6,  1. ,  1.6,  0.8])
>>> ind_1d = numpy.where( peakIndex_1d == peakIndex_1d.max() )
(array([2, 4]),)
>>> list( ind_1d[0] )
[2, 4]

最大値に等しい 3 つの値を持つ 2 次元配列の場合、次を使用できます。

>>> peakIndex
array([[ 0. ,  1.1,  1.5],
       [ 1.1,  1.5,  0.7],
       [ 0.2,  1.2,  1.5]])
>>> indices = numpy.where( peakIndex == peakIndex.max() )
>>> ind2d = zip(indices[0], indices[1])
[(0, 2), (1, 1), (2, 2)]
于 2012-07-07T18:00:42.287 に答える