2016-07-27 5 views
2

複数のargの等価性をテストしたい(つまり、すべてのargが等しい場合はTrue、少なくとも1つの引数が異なる場合はFalseを返す)。Numpyで複数引数の等価性をテストする

2つのだけの引数を扱うことができるnumpy.equalように、私は軽減しようとしているだろうが、それは、明らかに、失敗します。

reduce(np.equal, (4, 4, 4)) # return False because... 
reduce(np.equal, (True, 4)) # ... is False 

答えて

2
あなたは、アレイ内で一意の項目の長さが1であるかどうかを確認するために np.uniqueを使用することができます

項目のすべてがあなたの項目のいずれか(例えば最初の1)と同等であるかどうかを確認するために
np.unique(array).size == 1 

またはnp.all()

np.all(array == array[0]) 

デモ:

>>> a = np.array([1, 1, 1, 1]) 
>>> b = np.array([1, 1, 1, 2]) 

>>> np.unique(a).size == 1 
True 
>>> np.unique(b).size == 1 
False 
>>> np.all(a==a[0]) 
True 
>>> np.all(b==b[0]) 
False 
+0

2番目の方法では、最初の要素が他の要素と異なるかどうかはわかりません。 – Learner

+0

@Learnerすべてのアイテムが等しいかどうかをチェックしたいだけです。 – Kasramvd

1

numpy_indexedパッケージには、このための組み込み関数があります。多次元配列でも動作することに注意してください。つまり、イメージのスタックがすべて同じかどうかを確認するために使用できます。

import numpy_indexed as npi 
npi.all_equal(array) 
1

argsが浮動小数点値の場合、等価性テストでは丸め誤差のために奇妙な結果が生じる可能性があります。あなたはより堅牢なアプローチを使用する必要があります。この場合、例えばnumpy.allcloseのために:

In [636]: x = [2./3., .2/.3] 

In [637]: x 
Out[637]: [0.6666666666666666, 0.6666666666666667] 

In [638]: xarr = np.array(x) 

In [639]: np.unique(xarr).size == 1 
Out[639]: False 

In [640]: np.all(xarr == xarr[0]) 
Out[640]: False 

In [641]: reduce(np.allclose, x) 
Out[641]: True 

注:reduceはもはやPythonの3の組み込み関数であるので、のPython 3のユーザが文from functools import reduceを含める必要はありません。

+0

私の引数は整数ですが、私はあなたの答えに留意します。 – floflo29

関連する問題