2015-09-30 15 views
8

numpy配列が2つ等しいかどうかをテストしたいので、np.allclose関数を使用しています。唯一の問題は、2次元行列と等しい要素の3次元行列が与えられた場合、Trueを返します。2つのnumpy配列が等しいかどうかをテストします。形状を含めて

import numpy as np 

x = np.array([[3.14159265, -0.1], [-0.1, 0.1]]) 

y = np.array([[math.pi, -0.1], [-0.1, 0.1]]) 

z1 = np.array([[[3.14159265, -0.1], [-0.1, 0.1]], 
       [[3.14159265, -0.1], [-0.1, 0.1]]]) 
z2 = np.array([[[math.pi, -0.1], [-0.1, 0.1]], 
       [[math.pi, -0.1], [-0.1, 0.1]]]) 


np.allclose(x,y) 
# Returns true, as expected 

np.allclose(x,z1) 
# Also returns true, even though matrices are different shapes. Unwanted. 

は今、私は約np.array_equal、要素と形状を比較すると知っているが、構成要素は、それらが等しい場合にのみ、接近している場合、それは私がテストすることはできません。例えば、

np.array_equal(x,y) 

戻り

私はそれがこのケースで(x,z1)ため(x,y)(z1,z2)が、偽のためにtrueを返します使用することができる機能がありますFalse

+4

もう1つのチェックを追加することはどうでしょうか? '(x.shape == z1.shape)&np.allclose(x、z1)'? – Divakar

答えて

9

何が起こっているのは、allcloseが入力をブロードキャストしていることです。これにより、broadcasting rulesに続く類似の形状のアレイ(例えば、3および[3, 3, 3])との比較が可能になる。あなたの目的のために


、形状だけでなく、値をチェックしますこれは、具体的にnp.testing.assert_allcloseまたはassert_array_almost_equalnumpy.testingの機能を見てみましょう。 (私はこれら2つの違いを覚えていませんが、浮動小数点の違いを計算する方法に関係しています)

これらは、アサートベースの単体テストを使用している場合に特に便利です。

numpy.testing.assert_*関数のほとんど(すべて?)は、配列の形状と値の等価性をチェックします。

In [1]: import numpy as np 

In [2]: np.testing.assert_allclose([1], [[1]]) 

得られます:

AssertionError: 
Not equal to tolerance rtol=1e-07, atol=0 

(shapes (1,), (1, 1) mismatch) 
x: array([1]) 
y: array([[1]]) 

これらの機能について知るための別の有用な(そしてそれができるよう、現在だけでなく文書化されていない)ものは、彼らが "NaNを比較することである。例えば

sを等しくする。例えば

、これは成功します:

In [3]: np.testing.assert_allclose([np.nan], [np.nan]) 

numpy.allcloseが同じ場合のFalseを返しますが:

In [4]: np.allclose([np.nan], [np.nan]) 
Out[4]: False 
サイドノートでは

numpy.isclose(ただしallcloseequal_nan kwargを持っていますこれを制御する。

+0

私はアサルトベースのユニットテストを行っているので、これは完全に機能します。ありがとう –

+0

np.testing.assert_allclose(1、[1、1])とそれに類するものはまだ通ります:単一フロート(numpyスカラー、 'np.array(1)')は依然としてブロードキャストされています。おそらく、これらは 'shape'属性(または空のタプル)を持たないからです。 – Evert

関連する問題