[python] ValueError : 둘 이상의 요소가있는 배열의 실제 값이 모호합니다. a.any () 또는 a.all ()을 사용하십시오.

방금 코드에서 논리적 버그를 발견하여 모든 종류의 문제가 발생했습니다. 논리 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 ()을 사용하십시오.

비트 단위 연산을 사용할 때 비슷한 오류가 발생하지 않은 이유는 무엇입니까?



답변

rnumpy (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).

그러나 boolon 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).

요소 현명한 에 대한 상응 andnp.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 설명서에서 찾을 수 있습니다.


답변

pandasNA의 문제가 해결되었을 때 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) 다음에 명령을 사용하여 원하는 것을 비교하십시오.


답변