numpy 배열에 0만 포함되어 있는지 테스트
다음과 같이 0을 사용하여 numpy 배열을 초기화합니다.
np.zeros((N,N+1))
그러나 주어진 n*n numpy 배열 행렬의 모든 요소가 0인지 확인하려면 어떻게 해야 합니까?
메소드는 모든 값이 실제로 0이면 True를 반환하기만 하면 됩니다.
여기에 게시된 다른 답변은 효과적이지만 가장 명확하고 효율적으로 사용할 수 있는 기능은 다음과 같습니다.
>>> all_zeros = not np.any(a)
또는
>>> all_zeros = not a.any()
- 이것이 보다 선호됩니다.
numpy.all(a==0)
더 적은 RAM을 사용하기 때문입니다. (이것은 임시 어레이를 필요로 하지 않습니다.)a==0
기간.) -
또한, 그것은 보다 빠릅니다.numpy.count_nonzero(a)
0이 아닌 첫 번째 요소가 발견되면 즉시 돌아올 수 있기 때문입니다.- 편집 : @Rachel이 댓글에서 지적했듯이,
np.any()
더 이상 "단락" 논리를 사용하지 않기 때문에 소규모 어레이에서는 속도 이점을 볼 수 없습니다.
- 편집 : @Rachel이 댓글에서 지적했듯이,
numpy.count_nonzero를 확인하십시오.
>>> np.count_nonzero(np.eye(4))
4
>>> np.count_nonzero([[0,1,7,0,0],[3,0,0,2,19]])
5
배열이 a인 경우 여기서 np.all을 사용합니다.
>>> np.all(a==0)
다른 답변에서 알 수 있듯이, 만약 당신이 그것을 안다면, 당신은 진실/거짓 평가를 이용할 수 있습니다.0
배열에서 유일하게 잘못된 요소일 수 있습니다.배열에 참 요소가 없는 경우 배열의 모든 요소는 거짓입니다.*
>>> a = np.zeros(10)
>>> not np.any(a)
True
하지만, 대답은 다음과 같이 주장했습니다.any
부분적으로 단락으로 인해 다른 옵션보다 빠릅니다.2018년 기준으로 Numpy'sall
그리고.any
단락하지 마십시오.
이런 종류의 작업을 자주 수행하면 다음을 사용하여 단락 버전을 만드는 것이 매우 쉽습니다.numba
:
import numba as nb
# short-circuiting replacement for np.any()
@nb.jit(nopython=True)
def sc_any(array):
for x in array.flat:
if x:
return True
return False
# short-circuiting replacement for np.all()
@nb.jit(nopython=True)
def sc_all(array):
for x in array.flat:
if not x:
return False
return True
이것들은 단락이 아닐 때에도 Numpy 버전보다 더 빠른 경향이 있습니다. count_nonzero
가장 느립니다.
성능을 확인하기 위한 일부 입력:
import numpy as np
n = 10**8
middle = n//2
all_0 = np.zeros(n, dtype=int)
all_1 = np.ones(n, dtype=int)
mid_0 = np.ones(n, dtype=int)
mid_1 = np.zeros(n, dtype=int)
np.put(mid_0, middle, 0)
np.put(mid_1, middle, 1)
# mid_0 = [1 1 1 ... 1 0 1 ... 1 1 1]
# mid_1 = [0 0 0 ... 0 1 0 ... 0 0 0]
확인:
## count_nonzero
%timeit np.count_nonzero(all_0)
# 220 ms ± 8.73 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%timeit np.count_nonzero(all_1)
# 150 ms ± 4.56 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
### all
# np.all
%timeit np.all(all_1)
%timeit np.all(mid_0)
%timeit np.all(all_0)
# 56.8 ms ± 3.41 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
# 57.4 ms ± 1.76 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
# 55.9 ms ± 2.13 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
# sc_all
%timeit sc_all(all_1)
%timeit sc_all(mid_0)
%timeit sc_all(all_0)
# 44.4 ms ± 2.49 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
# 22.7 ms ± 599 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
# 288 ns ± 6.36 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
### any
# np.any
%timeit np.any(all_0)
%timeit np.any(mid_1)
%timeit np.any(all_1)
# 60.7 ms ± 1.38 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
# 60 ms ± 287 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
# 57.7 ms ± 1.12 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
# sc_any
%timeit sc_any(all_0)
%timeit sc_any(mid_1)
%timeit sc_any(all_1)
# 41.7 ms ± 1.24 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
# 22.4 ms ± 1.51 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
# 287 ns ± 12.7 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
도움이 되는all
그리고.any
동등성:
np.all(a) == np.logical_not(np.any(np.logical_not(a)))
np.any(a) == np.logical_not(np.all(np.logical_not(a)))
not np.all(a) == np.any(np.logical_not(a))
not np.any(a) == np.all(np.logical_not(a))
이것은 효과가 있을 거예요.
def check(arr):
if np.all(arr == 0):
return True
return False
배열의 모든 요소가 0보다 크거나 같은 경우.저는 사용 합계가 가장 빠른 방법이라고 생각합니다.
test = np.ones((128, 128, 128))
%%timeit
not np.any(test)
>>> 1.46 ms ± 9.09 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%%timeit
np.sum(test) == 0
>>> 646 µs ± 3.19 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
1e-15를 0으로 분류하려는 경우:
def all_zero( numpy_array ):
return np.allclose( numpy_array, np.zeros_like(numpy_array) )
만약 당신이 다른 numpy 함수에 대한 경고를 피하기 위해 모든 0을 테스트하고 있다면, 블록을 제외하고는, 당신이 관심있는 작업, 즉 작업 전에 0에 대한 테스트를 수행해야 하는 것을 절약할 수 있습니다.
try: # removes output noise for empty slice
mean = np.mean(array)
except:
mean = 0
언급URL : https://stackoverflow.com/questions/18395725/test-if-numpy-array-contains-only-zeros
'code' 카테고리의 다른 글
IndexError: 목록 인덱스가 범위를 벗어남, 데이터베이스에서 항목 1개를 가져오는 동안 오류가 발생했습니다. (0) | 2023.07.17 |
---|---|
플라스크에 저장하지 않고 파일 데이터 읽기 (0) | 2023.07.17 |
Apache POI와 함께 Excel 템플릿 사용 (0) | 2023.07.17 |
이 앱은 Firebase 인증을 사용할 수 있는 권한이 없습니다.Firebase 콘솔에서 올바른 패키지 이름과 SHA-1이 구성되어 있는지 확인하십시오. (0) | 2023.07.07 |
application.properties outside jar 파일 방법 (0) | 2023.07.07 |