6

2 つの ndarray a と b を追加するときとの間numpy.add(a,b)に違いはありますか? a+bドキュメントによると、これnumpy.add「アレイ ブロードキャストに関しては x1 + x2 に相当する」とのことです。. しかし、私はこれが何を意味するのか理解していませんnumpy.add(numpy.array([1,2,3]),4)

4

2 に答える 2

9

Python 構文でa+bは、 に変換されa.__add__(b)ます。 a.__add__型のオブジェクトの加算を実装するメソッドですa。数値にはそのような方法があり、リストにも ( [1,3]+[4])、文字列にも ( 'abc'+'d') あります。

numpyは、そのクラス (少なくとも数値型) に対して__add__(およびその他の標準__...メソッド) を実装しています。ndarraydtypes

これはすべて標準の Python でありnumpy、これまでずっと使用されてきました。

np.addですufunc。そのドキュメントを見てください -outパラメータとBinary ufuncs:セクションを見てください。これは関数であり、 (および) にない、 などreduceのメソッドがいくつかあります。reduceata.__add__+

2 つの配列または数値があり、それらを合計したい場合、自然なことは , を使用すること+ですa+bnp.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__

于 2016-08-03T16:59:32.390 に答える
0

add()ライブラリが改善され、通常の数学演算子が追加されたのが最初だったと思います。

ところで、Python 3.5 と numpy でも同じことがわかります。ここでは、行列の乗算を operator で実行できます@dot()それ以前は、配列の行列多重化は、配列のメソッドによってのみ行うことができました。

ブロードキャストとは、配列全体に数値を追加するなど、サイズの異なる配列間で操作を実行できることを意味します。これは、配列の演算子でも機能します。

配列に数値を追加することは、ブロードキャスト機能のほんの一例です。これについては、 Broadcastingで詳しく読むことができます 。これは、メモリとコーディングを節約する非常に優れた機能ですが、最初に読んだだけでは理解するのは簡単ではありません。

于 2016-08-03T15:31:07.053 に答える