2011-08-18 13 views
15

a + bの内容で満たされると思われるnumpyの1次元配列cがあります。私はPyOpenCLを使って最初にデバイスでa + bを実行しています。numpy配列内のすべての値が等しいかどうかのテスト

numpyスライスを使用して、Pythonで結果配列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()

をしかし、a.anya.allだけの値が0

ないかどうかを判断します思えます

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()を呼び出すため、booleanベクトル全体も作成されます。 – 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はおそらく高速です。 np.arrayデータ型が浮動小数点数の場合は、

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

関連する問題