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


221

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

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


1
Pandas도 이에 대한 문서제공합니다
Greg

답변:


164

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


2
네가 옳아. 원래 코드가 정확했습니다. 버그는 코드 어딘가에있는 것으로 보입니다.
Homunculus Reticulli

2
훌륭한 설명. 그러나 NumPy는 매우 비효율적이라는 것을 의미합니다. 부울 배열을 모두 완전히 평가하는 반면 효율적인 구현은 단일 루프 내에서 cond1 (i) && d2 (i)를 평가하고 cond1이 true가 아니면 cond2를 건너 뜁니다.
Joachim W

@JoachimWuttke는 : 비록 np.allnp.any단락시킬 수 있으며, 전달 된 인자는 이전에 평가 np.all또는 np.any단락 할 수있는 기회를 갖는다. 더 나은 결과를 얻으려면 현재 이와 비슷한 특수 C / Cython 코드를 작성 해야합니다 .
unutbu

47

나는 같은 문제가 있었다 (즉, 다중 조건으로 인덱싱, 특정 날짜 범위에서 데이터를 찾는 중). (a-b).any()또는 (a-b).all()적어도 나를 위해 작동하지 않는 것 같다.

또는 원하는 기능에 완벽하게 작동하는 다른 솔루션을 찾았 습니다 (하나 이상의 요소가있는 배열의 진실 값은 배열을 색인화하려고 할 때 모호합니다 ).

위의 제안 된 코드를 사용하는 대신 단순히 사용하는 numpy.logical_and(a,b)것이 좋습니다. 여기에서 코드를 다음과 같이 다시 작성할 수 있습니다.

selected  = r[numpy.logical_and(r["dt"] >= startdate, r["dt"] <= enddate)]

34

예외의 이유는 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 설명서에서 찾을 수 있습니다.


2

pandasNA의 문제가 해결되었을 때 NA 값을 가질 때 계산을 시도하고 있었다면 솔루션을 실행해야했습니다.

df = df.dropna()

그 후 계산에 실패했습니다.


0

이 유형의 오류 메시지는 또한 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 ()을 사용하십시오.


-6

this => numpy.array (r) 또는 numpy.array (yourvariable) 다음에 명령을 사용하여 원하는 것을 비교하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.