web-dev-qa-db-ja.com

numpy配列のゼロ要素を効率的にカウントしますか?

numpy配列のゼロ要素の数を数える必要があります。 numpy.count_nonzero 関数を知っていますが、ゼロ要素をカウントするためのアナログはないようです。

私の配列はそれほど大きくありません(通常は1E5エレメント未満)が、操作は数百万回実行されます。

もちろんlen(arr) - np.count_nonzero(arr)を使用することもできますが、もっと効率的な方法があるのでしょうか。

現在私がそれをしている方法のMWEを以下に示します。

import numpy as np
import timeit

arrs = []
for _ in range(1000):
    arrs.append(np.random.randint(-5, 5, 10000))


def func1():
    for arr in arrs:
        zero_els = len(arr) - np.count_nonzero(arr)


print(timeit.timeit(func1, number=10))
19
Gabriel

もう少し速いアプローチは、 np.count_nonzero() を使用することですが、必要に応じて条件。

In [3]: arr
Out[3]: 
array([[1, 2, 0, 3],
      [3, 9, 0, 4]])

In [4]: np.count_nonzero(arr==0)
Out[4]: 2

In [5]:def func_cnt():
            for arr in arrs:
                zero_els = np.count_nonzero(arr==0)
                # here, it counts the frequency of zeroes actually

np.where を使用することもできますが、 np.count_nonzero() よりも低速です

In [6]: np.where( arr == 0)
Out[6]: (array([0, 1]), array([2, 2]))

In [7]: len(np.where( arr == 0))
Out[7]: 2

効率:(降順)

In [8]: %timeit func_cnt()
10 loops, best of 3: 29.2 ms per loop

In [9]: %timeit func1()
10 loops, best of 3: 46.5 ms per loop

In [10]: %timeit func_where()
10 loops, best of 3: 61.2 ms per loop
27
kmario23