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 |