回答:
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])
np.zeros((3,))
たとえば、3つの長いベクトルを作成するため。これはパラメータの解析を簡単にするためだと思います。そうでなければ、np.zeros(3,0,dtype='int16')
vsのような何かnp.zeros(3,3,3,dtype='int16')
を実装するのは面倒です。
where
タプルを返しますndarray
。各タプルは入力の次元に対応しています。この場合、入力は配列なので、出力は1-tuple
です。xが行列だった場合、それは次のようになり2-tuple
、そのために
あります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)
次のコマンドを使用して、スカラー条件を検索できます。
>>> a = np.asarray([0,1,2,3,4])
>>> a == 0 # or whatver
array([ True, False, False, False, False], dtype=bool)
これは、配列を条件のブールマスクとして返します。
a[a==0] = epsilon
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
条件をチェックするためのメソッドの推奨される使用法であるため、これは受け入れられる答えであるはずです。
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]))
1次元配列で作業している場合は、構文上の砂糖があります。
>>> x = numpy.array([1,0,2,0,3,0,4,5,6,7,8])
>>> numpy.flatnonzero(x == 0)
array([1, 3, 5])
numpy.flatnonzero(numpy.logical_or(numpy.logical_or(x==0, x==2), x==7))
私はそれを次のように行います:
>>> 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])
where()
タプルを返すのですか?numpy.where(x == 0)[1]
範囲外です。それに結合されているインデックス配列は何ですか?