2011-08-18 63 views
15

我有一个numpy一维数组c,应该填充 a + b的内容。我首先在使用PyOpenCL的设备上执行a + b测试numpy数组中的所有值是否相等

我想快速确定结果数组c在Python中使用numpy切片的正确性。

这是我目前有

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

但似乎a.anya.all将刚刚确定的值是否不为0

如果我想测试numpy数组temp中的所有缩放器是否等于numpy array c

+2

'all_values_are_same =所有(your_array [0] == your_array):'什么,做是如果每个值等于所述第一值返回布尔的列表,并声称所有这些都是真实的。 –

回答

49

为什么不直接使用NumPy的功能中的numpy.array_equal(a1, a2)[docs]

+3

你可以检查array_equal()的源代码,并且因为它调用equal(),它也创建整个布尔向量。 – HYRY

7

您可以在比较结果上拨打anyif np.any(a+b != c):或等效地if np.all(a+b == c):a+b != c创建了一个dtype=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数据类型是浮点数。 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

相关问题