2016-08-03 8 views

答えて

1

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

numpyは、(少なくとも数値dtypesため)そのndarrayクラス__add__(および他の標準__...方法)を実施しています。

これはすべて標準のPythonで、numpyです。

np.addufuncです。そのドキュメントを見てください。outパラメータとBinary ufuncs:セクションを参照してください。関数なので、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]) 

"アレイ放送に関してx1 + x2と同等です。"つまり、彼らは働き、同じことをします。

broadcastingが別の件名です。

==================は@オペレータとnp.matmulパラレルは全く同じではありません。 @オペレータは、最近のPythonインタープリタに追加されたものです。定義されている場合は__matmul__メソッドへの呼び出しに変換されます。新しいnumpyバージョンにはそのような定義があります。しかし、このメソッドはPythonの数値やリストには定義されていません。同じコードを参照する関数バージョンnp.matmulもあります。 x.dotnp.dotの組み合わせもありますが、Pythonで認識される演算子はありません。x.__dot__です。

+0

詳細な回答ありがとうございました。 もし私がこの権利を持っていれば、numpy.addはufuncなので+ bよりも速いです(もしaとbがndarrayであることが保証されていれば)。 – Manu

+1

1つがufuncであり、もう1つのメソッドが速度を変えるべきでないという事実。これはユーザーインターフェイスの問題であり、スピードの問題ではありません。 add(add.reduceatのように)の追加機能が必要でない限り、私は '+'を使います。 – hpaulj

0

私はadd()はまず、ライブラリは通常の算術演算子を改善し、得られたと信じています。

ところで、私たちは、行列の乗算は、オペレータ@で行うことができるのPython 3.5とnumpyの、と今同じことを目撃。これに先立って、配列の配列マルチは、配列のdot()メソッドによってのみ実行できます。

放送は、配列全体に番号を追加するなど、サイズの異なる配列間で操作を実行できることを意味します。これは配列の演算子でも機能します。

数字を配列に追加することは、放送能力のごくわずかな例です。あなたはそれについてもっと読むことができますBroadcasting これはメモリとコーディングを節約する非常にクールな機能ですが、最初の読書では分かりにくいです。 Pythonの構文、a+b

関連する問題