2 つの ndarray a と b を追加するときとの間numpy.add(a,b)
に違いはありますか? a+b
ドキュメントによると、これnumpy.add
は「アレイ ブロードキャストに関しては x1 + x2 に相当する」とのことです。. しかし、私はこれが何を意味するのか理解していませんnumpy.add(numpy.array([1,2,3]),4)
。
2 に答える
Python 構文でa+b
は、 に変換されa.__add__(b)
ます。 a.__add__
型のオブジェクトの加算を実装するメソッドですa
。数値にはそのような方法があり、リストにも ( [1,3]+[4]
)、文字列にも ( 'abc'+'d'
) あります。
numpy
は、そのクラス (少なくとも数値型) に対して__add__
(およびその他の標準__...
メソッド) を実装しています。ndarray
dtypes
これはすべて標準の Python でありnumpy
、これまでずっと使用されてきました。
np.add
ですufunc
。そのドキュメントを見てください -out
パラメータとBinary ufuncs:
セクションを見てください。これは関数であり、 (および) にない、 などreduce
のメソッドがいくつかあります。reduceat
a.__add__
+
2 つの配列または数値があり、それらを合計したい場合、自然なことは , を使用すること+
ですa+b
。 np.add
いくつかの特別な場合に役立ちます
たとえば、2 つのリストに何が起こるかを比較します。
In [16]: [1,2,3]+[4]
Out[16]: [1, 2, 3, 4] # default list concatenation
In [17]: np.add([1,2,3],[4])
Out[17]: array([5, 6, 7]) # convert lists to arrays and sum
または 2D ブロードキャストを使用した例:
In [19]: np.add([[1],[2],[3]],[4,1])
Out[19]:
array([[5, 2],
[6, 3],
[7, 4]])
In [20]: np.array([1,2,3])[:,None]+np.array([4,1])
Out[20]:
array([[5, 2],
[6, 3],
[7, 4]])
そしてあなたの例:
In [21]: numpy.add(numpy.array([1,2,3]),4)
Out[21]: array([5, 6, 7])
In [22]: numpy.array([1,2,3])+4
Out[22]: array([5, 6, 7])
「アレイ放送で言えば1倍+2倍に相当」つまり、どちらも機能し、同じことを行います。
broadcasting
は別の主題です。
==================
@
演算子とnp.matmul
並列はまったく同じではありません。この@
演算子は、Python インタープリターに最近追加されたものです。__matmul__
定義されている場合は、メソッドへの呼び出しに変換されます。新しいnumpy
バージョンにはそのような定義があります。ただし、メソッドは Python の数値またはリストに対して定義されていません。np.matmul
同じコードを参照する関数バージョン もあります。x.dot
との組み合わせもありますがnp.dot
、Python で認識される演算子 or はありませんx.__dot__
。
add()
ライブラリが改善され、通常の数学演算子が追加されたのが最初だったと思います。
ところで、Python 3.5 と numpy でも同じことがわかります。ここでは、行列の乗算を operator で実行できます@
。dot()
それ以前は、配列の行列多重化は、配列のメソッドによってのみ行うことができました。
ブロードキャストとは、配列全体に数値を追加するなど、サイズの異なる配列間で操作を実行できることを意味します。これは、配列の演算子でも機能します。
配列に数値を追加することは、ブロードキャスト機能のほんの一例です。これについては、 Broadcastingで詳しく読むことができます 。これは、メモリとコーディングを節約する非常に優れた機能ですが、最初に読んだだけでは理解するのは簡単ではありません。