2011-08-18 6 views
15

a + b의 내용으로 채워지는 numpy 1 차원 배열 c이 있습니다. PyOpenCL을 사용하는 기기에서 우선 a + b을 실행합니다.numpy 배열의 모든 값이 같은지 테스트

numpy 슬라이싱을 사용하여 파이썬에서 c 결과 배열의 정확성을 신속하게 결정하고 싶습니다.

내가 현재

def python_kernel(a, b, c): 
    temp = a + b 
    if temp[:] != c[:]: 
     print "Error" 
    else: 
     print "Success!" 

이 무엇 그러나 나는 오류 얻을 :

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

을하지만 단지 값이 0

하지 여부를 결정합니다 a.any 또는 a.all 보인다

numpy 배열 temp에있는 모든 스케일러가 모든 값과 동일한 지 테스트하려는 경우 어떻게해야합니까? numpy 배열 c?

+2

'all_values_are_same = 전체 (your_array [0] == your_array) '무슨가 수행하는 각각의 값이 상기 제 1 값을 동일한 경우 부울 목록을 반환하고, 그들 모두가 사실이라고 단언합니다. –

답변

49

NumPy의 기능 중 numpy.array_equal(a1, a2)[docs]을 사용하지 않는 이유는 무엇입니까?

+3

array_equal()의 소스 코드를 확인할 수 있으며 equal()을 호출하기 때문에 전체 불린 벡터도 생성됩니다. – HYRY

7

if np.any(a+b != c): 또는 이와 동등하게 if np.all(a+b == c):의 비교 결과로 any을 호출 할 수 있습니다. a+b != cdtype=bool의 배열을 만든 다음 any은 해당 배열을보고 어떤 구성원이 True인지 확인합니다.

>>> import numpy as np 
>>> a = np.array([1,2,3]) 
>>> b = np.array([4,5,2]) 
>>> c = a+b 
>>> c 
array([5, 7, 5]) # <---- numeric, so any/all not useful 
>>> a+b == c 
array([ True, True, True], dtype=bool) # <---- BOOLEAN result, not numeric 
>>> all(a+b == c) 
True 

하지만, Amber's solution이 전체 부울 결과 배열을 만들 필요가 없기 때문에 아마도 더 빠른, 모든 것을 가졌어요.

10

np.allclose은 데이터 유형이 부동 소수 인 경우 좋은 선택입니다. np.array_equal이 항상 제대로 작동하지는 않습니다. 예를 들어

import numpy as np 
def get_weights_array(n_recs): 
    step = - 0.5/n_recs 
    stop = 0.5 
    return np.arange(1, stop, step) 

a = get_weights_array(5) 
b = np.array([1.0, 0.9, 0.8, 0.7, 0.6]) 

결과 :

>>> a 
array([ 1. , 0.9, 0.8, 0.7, 0.6]) 
>>> b 
array([ 1. , 0.9, 0.8, 0.7, 0.6]) 
>>> np.array_equal(a, b) 
False 
>>> np.allclose(a, b) 
True 

>>> import sys 
>>> sys.version 
'2.7.3 (default, Apr 10 2013, 05:13:16) \n[GCC 4.7.2]' 
>>> np.version.version 
'1.6.2' 
+0

이것은 np.array_equal 폭탄이 부유하고 있다는 것을 알고 두통을 안겨주었습니다. 감사합니다! – Gabriel

+1

일반적인 부동 소수점 정밀도 오류입니다. 나는 여기에서 잘못 작동하기 때문에'array_equal'을 비난하지 않을 것이다. 그것은 그것이하기로되어있는 일을합니다. 예,'allclose'는 당신이하고자하는 것에 대한 올바른 선택입니다. – Michael

관련 문제