4

numpy.nonzero / numpy.flatnonzero によって返されるインデックスの順序について疑問に思っています。

それに関するドキュメントには何も見つかりませんでした。それはただ言う:

A[nonzero(flag)] == A[flag]

ほとんどの場合、これで十分ですが、ソートされたインデックスのリストが必要な場合もあります。返されたインデックスが 1 次元の場合に並べ替えられることは保証されていますか、それとも明示的に並べ替える必要がありますか? (同様の質問は、ブール配列(A [flag])で選択するだけで返される要素の順序であり、ドキュメントに従って同じでなければなりません。)

例: フラグ内の True 要素間の「ギャップ」を見つける:

flag=np.array([True,False,False,True],dtype=bool)
iflag=flatnonzero(flag)
gaps= iflag[1:] - iflag[:-1]

ありがとう。

4

1 に答える 1

1

integersを使用した高度な (または「派手な」) インデックス作成の仕様を考えるとA[nonzero(flag)] == A[flag]、1 次元のケースで値が低いものから高いものへと並べ替えられるという保証でもあります。ただし、より高い次元では、結果は (「ソート」されている間) 予想とは異なる構造になります。

要するに、整数indの 1 次元配列とインデックス付けされる 1 次元配列が与えられると、 に対して定義されxたすべての有効な要素について次のようになります。iind

result[i] = x[ind[i]]

resultの形を取り、で示されるインデックスindに の値を含みます。これは、が の元の順序を維持し、が と同じである場合、常にソートされた順序でインデックスを生成する必要があると推測できることを意味します。xindx[flag]xx[nonzero(flag)]x[flag]nonzero(flag)

唯一の問題は、多次元配列の場合、インデックスがインデックス付けされる次元ごとに個別の配列として格納されることです。言い換えれば、

x[array([0, 1, 2]), array([0, 0, 0])]

に等しい

array([x[0, 0], x[1, 0], x[2, 0]])

値は引き続きソートされますが、各次元は独自の配列に分割されます。(結果として、ブロードキャストで興味深いことができますが、それはこの回答の範囲を超えています。)

この推論の唯一の問題は、非常に驚​​いたことに、ブール値のインデックス付けが配列の元の順序を保持することを保証する明示的なステートメントを見つけることができないことです。とはいえ、私は経験上、そうであると確信しています。より一般的には、 の逆バージョンを返すのは信じられないほどひねくれた行為です。x[[True, True, True]]x

于 2013-03-14T15:02:46.480 に答える