42

numpy配列/行列の列のすべての値が同じかどうかを確認したいと思います。ufuncを使用しようとしましたが、すべての場合に機能するとreduceは限りません。 equal

In [55]: a = np.array([[1,1,0],[1,-1,0],[1,0,0],[1,1,0]])

In [56]: a
Out[56]: 
array([[ 1,  1,  0],
       [ 1, -1,  0],
       [ 1,  0,  0],
       [ 1,  1,  0]])

In [57]: np.equal.reduce(a)
Out[57]: array([ True, False,  True], dtype=bool)

In [58]: a = np.array([[1,1,0],[1,0,0],[1,0,0],[1,1,0]])

In [59]: a
Out[59]: 
array([[1, 1, 0],
       [1, 0, 0],
       [1, 0, 0],
       [1, 1, 0]])

In [60]: np.equal.reduce(a)
Out[60]: array([ True,  True,  True], dtype=bool)

2番目のケースの中央の列もに評価されるのにTrue、なぜそうなるのFalseでしょうか。

助けてくれてありがとう!

4

3 に答える 3

72
In [45]: a
Out[45]: 
array([[1, 1, 0],
       [1, 0, 0],
       [1, 0, 0],
       [1, 1, 0]])

各値を最初の行の対応する値と比較します。

In [46]: a == a[0,:]
Out[46]: 
array([[ True,  True,  True],
       [ True, False,  True],
       [ True, False,  True],
       [ True,  True,  True]], dtype=bool)

列のすべての値がTrueの場合、その列は共通の値を共有します。

In [47]: np.all(a == a[0,:], axis = 0)
Out[47]: array([ True, False,  True], dtype=bool)

の問題は、以下np.equal.reduceに適用されたときに何が起こるかをマイクロ分析することで確認できます[1, 0, 0, 1]

In [49]: np.equal.reduce([1, 0, 0, 1])
Out[50]: True

最初の2つの項目は、1等しい0かどうかがテストされ、結果はFalse次のようになります。

In [51]: np.equal.reduce([False, 0, 1])
Out[51]: True

ここFalseで、0が等しいかどうかがテストされ、結果はTrue次のようになります。

In [52]: np.equal.reduce([True, 1])
Out[52]: True

ただしTrue、と1は等しいため、合計結果はTrueであり、これは望ましい結果ではありません。

問題は、reduceのような「グローバル」テストが必要なのに、結果を「ローカル」に蓄積しようとすることですnp.all

于 2013-02-13T18:55:11.883 に答える
9

ubuntuのすばらしい説明reduceがあれば、問題を解決するために使用できますがbitwise_andbitwise_orではなくに適用する必要がありますequal。結果として、これは浮動小数点配列では機能しません。

In [60]: np.bitwise_and.reduce(a) == a[0]
Out[60]: array([ True, False,  True], dtype=bool)

In [61]: np.bitwise_and.reduce(b) == b[0]
Out[61]: array([ True, False,  True], dtype=bool)

基本的に、列の各要素のビットを比較しています。同一のビットは変更されません。異なるビットはゼロに設定されます。このように、1ビットではなくゼロを持つ数値は減少した値を変更します。bitwise_andビットが削除されるのではなく導入される場合をトラップしません:

In [62]: c = np.array([[1,0,0],[1,0,0],[1,0,0],[1,1,0]])

In [63]: c
Out[63]: 
array([[1, 0, 0],
       [1, 0, 0],
       [1, 0, 0],
       [1, 1, 0]])

In [64]: np.bitwise_and.reduce(c) == c[0]
Out[64]: array([ True,  True,  True], dtype=bool)

2番目の列は明らかに間違っています。bitwise_or新しいビットをトラップするために使用する必要があります。

In [66]: np.bitwise_or.reduce(c) == c[0]
Out[66]: array([ True, False,  True], dtype=bool)

最終回答

In [69]: np.logical_and(np.bitwise_or.reduce(a) == a[0], np.bitwise_and.reduce(a) == a[0])
Out[69]: array([ True, False,  True], dtype=bool)

In [70]: np.logical_and(np.bitwise_or.reduce(b) == b[0], np.bitwise_and.reduce(b) == b[0])
Out[70]: array([ True, False,  True], dtype=boo

In [71]: np.logical_and(np.bitwise_or.reduce(c) == c[0], np.bitwise_and.reduce(c) == c[0])
Out[71]: array([ True, False,  True], dtype=bool)

この方法は、ubunutが提案しているを使用するよりも制限が厳しく、洗練されallていませんが、入力が膨大な場合に巨大な一時配列を作成しないという利点があります。一時配列は、行列の最初の行と同じ大きさである必要があります。

編集

このQ/Anumpyに提出したバグに基づいて、提供されたソリューションは、配列に0と1が含まれているためにのみ機能します。たまたま、示されている操作は、ではなく、でbitwise_and.reduce()あるため、0または1しか返すことができません。私はこの答えを修正し、答えが有効になることを期待して保持しています。bitwise_and.identity1-1numpy

編集

実際、すぐにnumpyに変更されるようです。確かにbitwise_and.identity、そしておそらく削減するオプションのパラメータ。

編集

皆さん朗報です。のIDは、バージョンの時点でにnp.bitwise_and設定されています。-11.12.0

于 2016-01-19T14:51:07.010 に答える
2

エレガントではありませんが、上記の例でも機能する可能性があります。

a = np.array([[1,1,0],[1,-1,0],[1,0,0],[1,1,0]])

各行とその上の行の違いを確認してください

np.diff(a,axis=0)==0 

array([[ True, False,  True],
       [ True, False,  True],
       [ True, False,  True]])    
于 2020-05-31T21:49:53.663 に答える