2

ナンパイでは、

    foo = np.array([[i+10*j for i in range(10)] for j in range(3)])
    array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9],
           [10, 11, 12, 13, 14, 15, 16, 17, 18, 19],
           [20, 21, 22, 23, 24, 25, 26, 27, 28, 29]])
    filter = np.nonzero(foo > 100)#nothing matches

    foo[:,filter]
    array([], shape=(3, 2, 0), dtype=int64)

    foo[:,0:0]
    array([], shape=(3, 0), dtype=int64)

filter2 = np.nonzero(np.sum(foo,axis=0) < 47)
foo[:,filter2]
array([[[ 0,  1,  2,  3,  4,  5]],

       [[10, 11, 12, 13, 14, 15]],

       [[20, 21, 22, 23, 24, 25]]])
foo[:,filter2].shape
(3, 1, 6)

一致するすべての列のすべての行に対して操作を実行する「フィルター」条件がありますが、フィルターが空の配列の場合、何らかの方法で foo[:,filter] が 3D 配列にブロードキャストされます。もう 1 つの例は filter2 です -> 再び、foo[:,filter2] は foo[:,(np.sum(foo,axis=0) < 47)] の結果を期待しているときに 3D 配列を提供します

ブール値を使用して正しい列/インデックスを見つけることと比較して、 np.nonzero の適切な使用例を誰かが説明できますか?

4

1 に答える 1

1

まず、foo[filter] == foo[filter.nonzero()]filterブール配列です。

予期しない結果が得られる理由を理解するには、Pythonがどのようにインデックスを作成するかについて少し理解する必要があります。Pythonで多次元インデックスを作成するには[]、コンマで区切ったインデックスを使用するか、タプルを使用します。だからfoo[1, 2, 3]と同じfoo[(1, 2, 3)]です。これを念頭に置いて、実行するとどうなるかを見てみましょうfoo[:, something]。私はあなたが取得しようとしていたあなたの例を信じていますがfoo[:, something[0], something[1]]、代わりにあなたは取得しfoo[(slice[None], (something[0], something[1]))]ました。

filterインデックス作成に使用しているだけの場合は、ゼロ以外の配列を使用する必要はなく、ブール配列をインデックスとして使用する必要があるため、これはすべてやや学術的ですが、必要な場合は、次のように実行できます。

foo[:, filter[0]]

# OR
index = (slice(None),) + filter.nonzero()
foo[index]
于 2012-11-25T02:37:54.857 に答える