43

Numpy、nonzero(a)where(a)およびargwhere(a)a、numpy 配列であり、すべてが配列のゼロ以外のインデックスを返すようです。これら 3 つの呼び出しの違いは何ですか?

  • ドキュメントargwhereには次のように書かれています:

    np.argwhere(a)と同じnp.transpose(np.nonzero(a))です。

    の出力を転置するだけの関数全体があるのはなぜnonzeroですか? それが非常に便利で、別の機能に値するのはいつですか?

  • where(a)との違いはnonzero(a)?彼らはまったく同じ結果を返しませんか?

4

2 に答える 2

15

nonzeroargwhereどちらも、要素が配列内のどこにあるかに関する情報を提供しますTruewhere投稿したフォームと同じように機能nonzeroしますが、2 番目のフォームがあります。

np.where(mask,a,b)

これは、条件式の numpy の「ufunc」バージョンと大まかに考えることができます。

a[i] if mask[i] else b[i]

a(およびの適切なブロードキャストを使用b)。

と の両方 nonzeroを持つ限りargwhere、それらは概念的に異なります。 nonzeroインデックス作成に使用できるオブジェクトを返すように構造化されています。これは、0 がまばらな場合、ブール マスク全体を作成するよりも軽量になる可能性があります。

mask = a == 0  # entire array of bools
mask = np.nonzero(a)

これで、そのマスクを使用して他の配列などにインデックスを付けることができます。ただし、このままでは、どのインデックスが 0 要素に対応するかを把握するのは概念的にあまり適切ではありません。そこにargwhere出番です。

于 2013-04-12T16:58:38.547 に答える
10

別の結果を転置する別の便利な関数を持つことの有用性についてはコメントできませんが、wherevsについてはコメントできnonzeroます。最も単純な使用例でwhereは、実際には と同じnonzeroです。

>>> np.where(np.array([[0,4],[4,0]]))
(array([0, 1]), array([1, 0]))
>>> np.nonzero(np.array([[0,4],[4,0]]))
(array([0, 1]), array([1, 0]))

また

>>> a = np.array([[1, 2],[3, 4]])
>>> np.where(a == 3)
(array([1, 0]),)
>>> np.nonzero(a == 3)
(array([1, 0]),)

whereある条件がでnonzeroある場合に配列から要素を取り出したい場合と、その条件が である場合に配列から要素を取り出したい場合とは異なります。aTruebFalse

>>> a = np.array([[6, 4],[0, -3]])
>>> b = np.array([[100, 200], [300, 400]])
>>> np.where(a > 0, a, b)
array([[6, 4], [300, 400]])

nonzero繰り返しますが、彼らが に機能を追加した理由を説明することはできませんwhereが、これは少なくとも 2 つの違いを説明しています。

編集:最初の例を修正しました...私のロジックは以前は間違っていました

于 2013-04-12T16:54:11.790 に答える