NumPy配列でゼロに等しい要素のインデックスを見つける


144

NumPyには、オブジェクトnonzero()内の非ゼロ要素のインデックスを識別するための効率的な関数/メソッドがありndarrayます。要素のインデックス取得するための最も効率的な方法は何でやるゼロの値を持っていますか?

回答:


226

numpy.where()が私のお気に入りです。

>>> x = numpy.array([1,0,2,0,3,0,4,5,6,7,8])
>>> numpy.where(x == 0)[0]
array([1, 3, 5])

16
Pythonを思い出そうとしています。なぜwhere()タプルを返すのですか? numpy.where(x == 0)[1]範囲外です。それに結合されているインデックス配列は何ですか?
Zhubarb 2014年

@Zhubarb-インデックスのほとんどの使用はタプルです- np.zeros((3,))たとえば、3つの長いベクトルを作成するため。これはパラメータの解析を簡単にするためだと思います。そうでなければ、np.zeros(3,0,dtype='int16')vsのような何かnp.zeros(3,3,3,dtype='int16')を実装するのは面倒です。
mtrw 2014年

5
番号。sのwhereタプルを返しますndarray。各タプルは入力の次元に対応しています。この場合、入力は配列なので、出力は1-tupleです。xが行列だった場合、それは次のようになり2-tuple、そのために
シプリアンTomoiagă

1
numpy 1.16以降のドキュメントでnumpy.wherenumpy.nonzeroは、where引数を1つだけ使用するのではなく、直接使用することを特に推奨しています。
jirassimok

@jirassimok質問のとおり、非ゼロを使用してゼロを見つけるにはどうすればよいですか?
mLstudent33

28

ありますnp.argwhere

import numpy as np
arr = np.array([[1,2,3], [0, 1, 0], [7, 0, 2]])
np.argwhere(arr == 0)

見つかったすべてのインデックスを行として返します。

array([[1, 0],    # Indices of the first zero
       [1, 2],    # Indices of the second zero
       [2, 1]],   # Indices of the third zero
      dtype=int64)

23

次のコマンドを使用して、スカラー条件を検索できます。

>>> a = np.asarray([0,1,2,3,4])
>>> a == 0 # or whatver
array([ True, False, False, False, False], dtype=bool)

これは、配列を条件のブールマスクとして返します。


1
あなたはゼロの要素にアクセスするためにこれを使用することができます:a[a==0] = epsilon
クワントメトロポリス

17

nonzero()これFalseも一種のゼロなので、条件のブールマスクで使用して使用することもできます。

>>> x = numpy.array([1,0,2,0,3,0,4,5,6,7,8])

>>> x==0
array([False, True, False, True, False, True, False, False, False, False, False], dtype=bool)

>>> numpy.nonzero(x==0)[0]
array([1, 3, 5])

mtrwの方法とまったく同じですが、質問との関連性が高くなります;)


これはnonzero条件をチェックするためのメソッドの推奨される使用法であるため、これは受け入れられる答えであるはずです。
sophros

5

numpy.nonzeroを使用してゼロを見つけることができます。

>>> import numpy as np
>>> x = np.array([1,0,2,0,3,0,0,4,0,5,0,6]).reshape(4, 3)
>>> np.nonzero(x==0)  # this is what you want
(array([0, 1, 1, 2, 2, 3]), array([1, 0, 2, 0, 2, 1]))
>>> np.nonzero(x)
(array([0, 0, 1, 2, 3, 3]), array([0, 2, 1, 1, 0, 2]))

4

1次元配列で作業している場合は、構文上の砂糖があります。

>>> x = numpy.array([1,0,2,0,3,0,4,5,6,7,8])
>>> numpy.flatnonzero(x == 0)
array([1, 3, 5])

これは、条件が1つしかない限り問題なく機能します。「x == numpy.array(0,2,7)」を検索するにはどうすればよいですか?結果はarray([1,2,3,5,9])になります。しかし、どうすればこれを入手できますか?
MoTSCHIGGE 2014

これを行うには、次のようにしますnumpy.flatnonzero(numpy.logical_or(numpy.logical_or(x==0, x==2), x==7))
。– Dusch

1
import numpy as np

x = np.array([1,0,2,3,6])
non_zero_arr = np.extract(x>0,x)

min_index = np.amin(non_zero_arr)
min_value = np.argmin(non_zero_arr)

1

私はそれを次のように行います:

>>> x = np.array([[1,0,0], [0,2,0], [1,1,0]])
>>> x
array([[1, 0, 0],
       [0, 2, 0],
       [1, 1, 0]])
>>> np.nonzero(x)
(array([0, 1, 2, 2]), array([0, 1, 0, 1]))

# if you want it in coordinates
>>> x[np.nonzero(x)]
array([1, 2, 1, 1])
>>> np.transpose(np.nonzero(x))
array([[0, 0],
       [1, 1],
       [2, 0],
       [2, 1])
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.