7

配列のゼロ要素と非ゼロ要素の両方のインデックスを見つける必要があります。

別の言い方をすれば、 から補数を見つけたいのですnumpy.nonzero()

これを行う方法は次のとおりです。

indices_zero = numpy.nonzero(array == 0)
indices_nonzero = numpy.nonzero(array != 0)

ただし、これは配列を 2 回検索することを意味し、大きな配列の場合は効率的ではありません。numpy を使用してこれを行う効率的な方法はありますか?

4

3 に答える 3

7

use の範囲が既にあると仮定するとnumpy.arange(len(array))、論理インデックスを取得して保存するだけです。

bindices_zero = (array == 0)

次に、実際に整数インデックスが必要なときに実行できます

indices_zero = numpy.arange(len(array))[bindices_zero]

また

indices_nonzero = numpy.arange(len(array))[~bindices_zero]
于 2012-11-28T09:52:51.507 に答える
3

ブール索引付けを使用できます。

In [82]: a = np.random.randint(-5, 5, 100)

In [83]: a
Out[83]: 
array([-2, -1,  4, -3,  1, -2,  2, -1,  2, -1, -3,  3, -3, -4,  1,  2,  1,
        3,  3,  0,  1, -3, -4,  3, -5, -1,  3,  2,  3,  0, -5,  4,  3, -5,
       -3,  1, -1,  0, -4,  0,  1, -5, -5, -1,  3, -2, -5, -5,  1,  0, -1,
        1,  1, -1, -2, -2,  1,  1, -4, -4,  1, -3, -3, -5,  3,  0, -5, -2,
       -2,  4,  1, -4, -5, -1,  3, -3,  2,  4, -4,  4,  2, -2, -4,  3,  4,
       -2, -4,  2, -4, -1,  0, -3, -1,  2,  3,  1,  1,  2,  1,  4])

In [84]: mask = a != 0

In [85]: a[mask]
Out[85]: 
array([-2, -1,  4, -3,  1, -2,  2, -1,  2, -1, -3,  3, -3, -4,  1,  2,  1,
        3,  3,  1, -3, -4,  3, -5, -1,  3,  2,  3, -5,  4,  3, -5, -3,  1,
       -1, -4,  1, -5, -5, -1,  3, -2, -5, -5,  1, -1,  1,  1, -1, -2, -2,
        1,  1, -4, -4,  1, -3, -3, -5,  3, -5, -2, -2,  4,  1, -4, -5, -1,
        3, -3,  2,  4, -4,  4,  2, -2, -4,  3,  4, -2, -4,  2, -4, -1, -3,
       -1,  2,  3,  1,  1,  2,  1,  4])

In [86]: a[-mask]
Out[86]: array([0, 0, 0, 0, 0, 0, 0])
于 2012-11-28T07:47:02.173 に答える
1

これを達成するための組み込みのnumpyメソッドについてはわかりませんが、昔ながらのforループを使用できると思います。何かのようなもの:

indices_zero = []
indices_nonzero = []

for index in xrange(len(array)):
    if array[index] == 0:
        indicies_zero.append(index)
    else:
        indicies_nonzero.append(index)

このようなものは、1 回ループするだけで、目的を達成するはずです。

于 2012-11-28T06:15:26.737 に答える