방금 코드에서 논리적 버그를 발견하여 모든 종류의 문제가 발생했습니다. 논리 AND 대신 비트 AND 를 실수로 수행했습니다 .
코드를 다음에서 변경했습니다.
r = mlab.csv2rec(datafile, delimiter=',', names=COL_HEADERS)
mask = ((r["dt"] >= startdate) & (r["dt"] <= enddate))
selected = r[mask]
에:
r = mlab.csv2rec(datafile, delimiter=',', names=COL_HEADERS)
mask = ((r["dt"] >= startdate) and (r["dt"] <= enddate))
selected = r[mask]
놀랍게도 다소 비밀스러운 오류 메시지가 나타납니다.
ValueError : 둘 이상의 요소가있는 배열의 실제 값이 모호합니다. a.any () 또는 a.all ()을 사용하십시오.
비트 단위 연산을 사용할 때 비슷한 오류가 발생하지 않은 이유는 무엇입니까?
답변
r
numpy (rec) array입니다. 그래서 r["dt"] >= startdate
또한 (부울) 배열입니다. numpy 배열의 경우 &
연산은 요소 단위와 두 부울 배열 중 하나를 반환합니다.
이 의미 할 수 다음 NumPy와 개발자는 아무도 일반적으로 부울 맥락에서 배열을 평가하는 방법을 이해하지 있었다 느꼈다 True
경우 어떤 요소가있다
True
거나 말 수있는 True
경우 모든 요소가 True
, 또는 True
배열의 길이가 제로가 아닌 경우, 단지 세 개의 이름을을 가능성.
사용자마다 요구와 가정이 다를 수 있으므로 NumPy 개발자는 추측을 거부하고 대신 부울 컨텍스트에서 배열을 평가하려고 할 때마다 ValueError를 제기하기로 결정했습니다. and
두 개의 numpy 배열에 적용 하면 두 배열이 부울 컨텍스트 ( __bool__
Python3 또는 __nonzero__
Python2에서 호출)로 평가됩니다 .
원래 코드
mask = ((r["dt"] >= startdate) & (r["dt"] <= enddate))
selected = r[mask]
맞습니다. 그러나을 원하면 또는 and
대신에을 a and b
사용하십시오 .(a-b).any()
(a-b).all()
답변
나는 같은 문제가 있었다 (즉, 다중 조건으로 인덱싱, 특정 날짜 범위에서 데이터를 찾는 중). (a-b).any()
또는 (a-b).all()
적어도 나를 위해 작동하지 않는 것 같다.
또는 원하는 기능에 완벽하게 작동하는 다른 솔루션을 찾았 습니다 (하나 이상의 요소가있는 배열의 진실 값은 배열을 색인화하려고 할 때 모호합니다 ).
위의 제안 된 코드를 사용하는 대신 단순히 사용하는 numpy.logical_and(a,b)
것이 좋습니다. 여기에서 코드를 다음과 같이 다시 작성할 수 있습니다.
selected = r[numpy.logical_and(r["dt"] >= startdate, r["dt"] <= enddate)]
답변
예외의 이유는 and
암시 적으로 호출하기 때문 bool
입니다. 먼저 왼쪽 피연산자에서 (왼쪽 피연산자가이면 True
) 오른쪽 피연산자에서. 따라서 x and y
와 같습니다 bool(x) and bool(y)
.
그러나 bool
on a numpy.ndarray
(하나 이상의 요소를 포함하는 경우)는 본 예외를 throw합니다.
>>> import numpy as np
>>> arr = np.array([1, 2, 3])
>>> bool(arr)
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
bool()
전화는 암시에 and
,뿐만 아니라에서 if
, while
, or
, 다음 예제 중 하나는 실패합니다 있도록 :
>>> arr and arr
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
>>> if arr: pass
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
>>> while arr: pass
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
>>> arr or arr
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
파이썬에는 bool
호출 을 숨기는 더 많은 함수와 명령문 2 < x < 10
이 있습니다. 예를 들어 또 다른 작성 방법입니다 2 < x and x < 10
. 그리고 and
의지는 전화합니다 bool
: bool(2 < x) and bool(x < 10)
.
요소 현명한 에 대한 상응 and
것 np.logical_and
유사하게 사용할 수있는, 기능 np.logical_or
에 대한 동등하게 or
.
부울 배열의 -와 비교가 좋아 <
, <=
, ==
, !=
, >=
와 >
NumPy와에 배열 부울 NumPy와 배열을 반환 – 당신은 또한 사용할 수있는 요소 현명한 비트 기능 (및 운영자) : np.bitwise_and
( &
연산자)
>>> np.logical_and(arr > 1, arr < 3)
array([False, True, False], dtype=bool)
>>> np.bitwise_and(arr > 1, arr < 3)
array([False, True, False], dtype=bool)
>>> (arr > 1) & (arr < 3)
array([False, True, False], dtype=bool)
및 bitwise_or
( |
연산자) :
>>> np.logical_or(arr <= 1, arr >= 3)
array([ True, False, True], dtype=bool)
>>> np.bitwise_or(arr <= 1, arr >= 3)
array([ True, False, True], dtype=bool)
>>> (arr <= 1) | (arr >= 3)
array([ True, False, True], dtype=bool)
논리 및 이진 함수의 전체 목록은 NumPy 설명서에서 찾을 수 있습니다.
답변
pandas
NA의 문제가 해결되었을 때 NA 값을 가질 때 계산을 시도하고 있었다면 솔루션을 실행해야했습니다.
df = df.dropna()
그 후 계산에 실패했습니다.
답변
이 유형의 오류 메시지는 또한 if-statement
배열이있는 위치 (예 : bool 또는 int)에서 비교가 수행되는 동안 표시 됩니다. 예를 들어 :
... code snippet ...
if dataset == bool:
....
... code snippet ...
이 절은 데이터 셋을 배열로 가지고 있으며 bool은 “open door”입니다 … True
또는 False
.
함수가 랩핑 된 경우 오류 유형없이 메시지 try-statement
와 함께 수신됩니다 except Exception as error:
.
요소가 두 개 이상인 배열의 실제 값은 모호합니다. a.any () 또는 a.all ()을 사용하십시오.
답변
this => numpy.array (r) 또는 numpy.array (yourvariable) 다음에 명령을 사용하여 원하는 것을 비교하십시오.