7

私は頻繁にnumpy.where関数を使用して、いくつかのプロパティを持つ行列のインデックスのタプルを収集します。例えば

import numpy as np
X = np.random.rand(3,3)
>>> X
array([[ 0.51035326,  0.41536004,  0.37821622],
   [ 0.32285063,  0.29847402,  0.82969935],
   [ 0.74340225,  0.51553363,  0.22528989]])
>>> ix = np.where(X > 0.5)
>>> ix
(array([0, 1, 2, 2]), array([0, 2, 0, 1]))

ixは、行と列のインデックスを含むndarrayオブジェクトのタプルになりましたが、部分式X> 0.5には、どのセルが>0.5プロパティを持っているかを示す単一のブール行列が含まれています。それぞれの表現には独自の利点があります。

ixオブジェクトを取得し、後で必要になったときにブール形式に戻すための最良の方法は何ですか?例えば

G = np.zeros(X.shape,dtype=np.bool)
>>> G[ix] = True

同じことを達成するワンライナーはありますか?

4

3 に答える 3

9

もしかしてこういうこと?

mask = np.zeros(X.shape, dtype='bool')
mask[ix] = True

しかし、 のような単純なものであれば、が非常にまばらであるか、 への参照がなくなっていない限りX > 0、おそらく実行したほうがよいでしょう。mask = X > 0maskX

于 2012-02-29T17:55:23.743 に答える
3

np.wheredocstringの下部は、np.in1dこれを使用することを提案しています。

>>> x = np.array([1, 3, 4, 1, 2, 7, 6])
>>> indices = np.where(x % 3 == 1)[0]
>>> indices
array([0, 2, 3, 5])
>>> np.in1d(np.arange(len(x)), indices)
array([ True, False,  True,  True, False,  True, False], dtype=bool)

(これは素晴らしいワンライナーですが、@Bi Rico のソリューションよりもはるかに遅いです。)

于 2014-09-05T11:31:42.970 に答える
2
mask = X > 0
imask = np.logical_not(mask)

例えば

編集:以前はとても簡潔でしたことをお詫びします。電話で物事に答えるべきではない:P

例で述べたように、ブールマスクを反転する方がよいでしょう。の結果から戻るよりもはるかに効率的/簡単ですwhere

于 2012-02-29T20:04:00.177 に答える