2012-09-28 2 views
11

var (다른 수의 배열) 요소가> = 0 인 경우 rbs의 모든 요소를 ​​새 배열에 넣으려고합니다. < = .1. 내가 잘못 뭘하는지에둘 이상의 요소가있는 배열의 진리 값은 배열을 색인 할 때 애매합니다.

ValueError: The truth value of an array with more than one element is ambiguous. 
Use a.any() or a.all()` 

rbs = [ish[4] for ish in realbooks] 
for book in realbooks: 
    var -= float(str(book[0]).replace(":", "")) 
    bidsred = rbs[(var <= .1) and (var >=0)] 

아이디어 : 나는 다음 코드를 시도 할 때이 오류를 얻을?

+0

어떤 줄에서 오류가 발생합니까? 또한 실제로 실행되도록 코드의 형식을 지정하십시오. –

+0

var의 값을 출력하면 도움이됩니다. 추측 해 보면, 문제는 줄이고있는 문자열/float/text replaced 변수에 있습니다 ... 원래의 데이터는 그 일련의 연산을 요구하는 것처럼 보입니까? – abought

답변

27

대답, 당신은 하나를 사용해야합니다

c[a & b] 

또는

c[np.logical_and(a, b)] 
,

이유는 and 키워드가 두 개의 부울 사이를 테스트하기 위해 Python에서 사용되기 때문입니다. 어떻게 배열이 부울이 될 수 있습니까? 항목의 75 %가 True 인 경우 True 또는 False입니까? 따라서 numpy는 두 항목을 비교하지 않습니다.

따라서 논리 함수를 사용하여 요소 별 (np.logical_and) 또는 이진 연산자 &에서 두 개의 부울 배열을 비교해야합니다.

또한 인덱싱을 위해 인덱싱 할 배열과 동일한 크기의 부울 배열이 필요합니다. 그리고 은 배열이어야합니다. 대신 의 목록을 사용할 수 없습니다 : 이유는 부울 배열을 사용하면 NumPy가 반환 할 요소를 알려주기 때문입니다. True/False의 목록을 사용하는 경우 NumPy는이를 1/0의 정수 (즉 인덱스)로 해석합니다. 즉, 배열의 두 번째 또는 첫 번째 요소를 가져옵니다. 네가 원하는게 아니야.당신이 추측 할 수 당신이 항목을 선택, 두 개의 부울 배열 a 또는 색인에 대한 b을 사용하려는 경우

지금,하는 중 a 또는 b이 True, 당신은

c[np.logical_or(a,b)] 

또는

을 사용하십시오
c[a | b] 
8

Numpy 배열과 관련된 비교 식에 Python 부울 연산자 (not, and, or)를 사용하려고하면 대개 다음과 같은 오류 메시지가 나타납니다.

>>> x = np.arange(-5, 5) 
>>> (x > -2) and (x < 2) 
Traceback (most recent call last): 
    File "<ipython-input-6-475a0a26e11c>", line 1, in <module> 
    (x > -2) and (x < 2) 
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 
이러한 비교는, 파이썬에서 다른 비교 반대로, 논리 값의 배열보다는 하나의 논리 값을 생성 (하지만 어쩌면 당신은 이미 것을 알고 있었다) 때문이다

:에 대한 해결책의

>>> x > -2 
array([False, False, False, False, True, True, True, True, True, True], dtype=bool) 
>>> x < 2 
array([ True, True, True, True, True, True, True, False, False, False], dtype=bool) 

부분을 당신의 문제가 아마도 을 np.logical_and으로 바꿔서 np.bool의 두 배열을 통해 AND 연산을 브로드 캐스팅합니다.

>>> np.logical_and(x > -2, x < 2) 
array([False, False, False, False, True, True, True, False, False, False], dtype=bool) 
>>> x[np.logical_and(x > -2, x < 2)] 
array([-1, 0, 1]) 

그러나, 부울 이러한 배열은 일반 파이썬 목록에 인덱스로 사용할 수 없습니다, 그래서 당신은 배열에 그 변환해야 : 나는 이전에 코멘트에 말했듯

rbs = np.array([ish[4] for ish in realbooks])