source

Python에서 numpynd array의 non-NaN 요소 수 계산

manysource 2023. 10. 7. 12:02

Python에서 numpynd array의 non-NaN 요소 수 계산

numpind 배열 행렬에서 non-NaN 원소의 개수를 계산해야 합니다.파이썬에서 이것을 어떻게 효율적으로 할 수 있을까요?이를 달성하기 위한 간단한 코드는 다음과 같습니다.

import numpy as np

def numberOfNonNans(data):
    count = 0
    for i in data:
        if not np.isnan(i):
            count += 1
    return count 

이것에 내장된 기능이 numpy에 있습니까?저는 빅 데이터 분석을 하고 있기 때문에 효율성이 중요합니다.

도와주셔서 감사합니다!

np.count_nonzero(~np.isnan(data))

~다음에서 반환되는 부울 행렬을 반전합니다.np.isnan.

np.count_nonzero0\false이 아닌 값을 카운트합니다..sum동일한 결과를 제공해야 합니다.하지만 아마도 더 명확하게 사용할 수 있을 것입니다.count_nonzero

테스트 속도:

In [23]: data = np.random.random((10000,10000))

In [24]: data[[np.random.random_integers(0,10000, 100)],:][:, [np.random.random_integers(0,99, 100)]] = np.nan

In [25]: %timeit data.size - np.count_nonzero(np.isnan(data))
1 loops, best of 3: 309 ms per loop

In [26]: %timeit np.count_nonzero(~np.isnan(data))
1 loops, best of 3: 345 ms per loop

In [27]: %timeit data.size - np.isnan(data).sum()
1 loops, best of 3: 339 ms per loop

data.size - np.count_nonzero(np.isnan(data))여기서 가장 빠른 것 같습니다다른 데이터는 다른 상대 속도 결과를 제공할 수 있습니다.

쓰기가 빠른 대안

가장 빠른 선택은 아니지만 성능이 문제가 되지 않는다면 다음을 사용할 수 있습니다.

sum(~np.isnan(data)).

성능:

In [7]: %timeit data.size - np.count_nonzero(np.isnan(data))
10 loops, best of 3: 67.5 ms per loop

In [8]: %timeit sum(~np.isnan(data))
10 loops, best of 3: 154 ms per loop

In [9]: %timeit np.sum(~np.isnan(data))
10 loops, best of 3: 140 ms per loop

배열이 희소한지 여부를 확인하려면 nan 값의 비율을 얻는 데 도움이 될 수 있습니다.

np.isnan(ndarr).sum() / ndarr.size

해당 비율이 임계값을 초과하는 경우 희소 배열(예: https://sparse.pydata.org/en/latest/ )을 사용합니다.

하지만 좀 더 느린 대안은 색인을 통해 작업하는 것입니다.

np.isnan(data)[np.isnan(data) == False].size

In [30]: %timeit np.isnan(data)[np.isnan(data) == False].size
1 loops, best of 3: 498 ms per loop 

의 이중 사용.np.isnan(data)그리고.==오퍼레이터가 좀 오버킬을 할 수도 있어서 완성도를 위해서만 답을 올렸습니다.

len([i for i in data if np.isnan(i) == True])

언급URL : https://stackoverflow.com/questions/21778118/counting-the-number-of-non-nan-elements-in-a-numpy-ndarray-in-python