6

配列を反復処理したり、配列をマスクしたりせずに、numpy 配列内のゼロ以外の要素の長さを取得することは可能ですか? 速度は、長さを計算する主な目標です。

基本的に、のようなものlen(array).where(array != 0)です。

答えが変わると、各行はゼロから始まります。配列の対角線はゼロで埋められます。

4

2 に答える 2

16

非ゼロ要素の総数 (および非ゼロ行の総数ではない) を意味すると仮定すると、次のようになります。

In [12]: a = np.random.randint(0, 3, size=(100,100))

In [13]: timeit len(a.nonzero()[0])
1000 loops, best of 3: 306 us per loop

In [14]: timeit (a != 0).sum()
10000 loops, best of 3: 46 us per loop

またはさらに良い:

In [22]: timeit np.count_nonzero(a)
10000 loops, best of 3: 39 us per loop

この最後のcount_nonzeroは、配列が小さい場合にもうまく動作するように見えますが、sumトリックはそれほど多くありません。

In [33]: a = np.random.randint(0, 3, size=(10,10))

In [34]: timeit len(a.nonzero()[0])
100000 loops, best of 3: 6.18 us per loop

In [35]: timeit (a != 0).sum()
100000 loops, best of 3: 13.5 us per loop

In [36]: timeit np.count_nonzero(a)
1000000 loops, best of 3: 686 ns per loop
于 2012-09-17T00:49:58.967 に答える
3

len(np.nonzero(array)[0])?

  • np.nonzero長さが初期配列の次元数に等しいインデックスのタプルを返します
  • 最初の次元に沿ったインデックスだけを取得します[0]
  • その長さを計算しますlen
于 2012-09-17T00:49:41.427 に答える