2つ以上の引数に対するNumpyの「論理和」 質問する

2つ以上の引数に対するNumpyの「論理和」 質問する

Numpy のlogical_or関数は、比較に 2 つ以上の配列を必要としません。 3 つ以上の配列の結合を見つけるにはどうすればよいですか? (Numpy に関してもlogical_and、3 つ以上の配列の交差を取得する場合も同じ質問ができます。)

ベストアンサー1

もしあなたが尋ねているのがnumpy.logical_orの場合、いいえ、ドキュメントに明示的に記載されているように、パラメータはx1, x2と、オプションで のみですout

numpy.logical_orx1, x2[, out]) =<ufunc 'logical_or'>


もちろん、logical_or次のように複数の呼び出しを連鎖させることもできます。

>>> x = np.array([True, True, False, False])
>>> y = np.array([True, False, True, False])
>>> z = np.array([False, False, False, False])
>>> np.logical_or(np.logical_or(x, y), z)
array([ True,  True,  True,  False], dtype=bool)

NumPyでこのような連鎖を一般化する方法は、reduce:

>>> np.logical_or.reduce((x, y, z))
array([ True,  True,  True,  False], dtype=bool)

もちろん、これは別々の配列ではなく1つの多次元配列でも機能します。実際、それが意味使用するもの:

>>> xyz = np.array((x, y, z))
>>> xyz
array([[ True,  True, False, False],
       [ True, False,  True, False],
       [False, False, False, False]], dtype=bool)
>>> np.logical_or.reduce(xyz)
array([ True,  True,  True,  False], dtype=bool)

しかし、同じ長さの1次元配列3つのタプルは配列のようなNumPy 用語では、2D 配列として使用できます。


NumPy 以外では、Python の も使用できますreduce

>>> functools.reduce(np.logical_or, (x, y, z))
array([ True,  True,  True,  False], dtype=bool)

しかし、NumPyの とは異なりreduce、Pythonの は頻繁に必要になるわけではありません。ほとんどの場合、より簡単な方法があります。たとえば、複数のPythonor演算子を連結するには、 を使わずreduceoperator.or_使用しますanyない通常は明示的なループを使用する方が読みやすくなります。

そして実際NumPyのanyこの場合にも使用できますが、それほど簡単ではありません。軸を明示的に指定しないと、配列ではなくスカラーになります。つまり、

>>> np.any((x, y, z), axis=0)
array([ True,  True,  True,  False], dtype=bool)

ご想像のとおり、logical_and類似しています。連鎖したりnp.reducefunctools.reduce置き換えたりすることができますall明示的な を使用しますaxis

他の操作はどうでしょうか?logical_xorall? もう一度、同じ処理を行います…ただし、この場合は適用される/タイプの関数はありませんany。(何と呼びますか? odd?)

おすすめ記事