web-dev-qa-db-ja.com

np.dotは自動的にベクトルを転置しますか?

私は株のポートフォリオの最初と2次の瞬間を計算しようとしています(すなわち、予想された復帰および標準偏差)。

expected_returns_annual
Out[54]: 
           ticker
adj_close  CNP       0.091859
           F        -0.007358
           GE        0.095399
           TSLA      0.204873
           WMT      -0.000943
dtype: float64

type(expected_returns_annual)
Out[55]: pandas.core.series.Series



weights = np.random.random(num_assets)
weights /= np.sum(weights)
returns = np.dot(expected_returns_annual, weights)
 _

だから通常予想された収益はによって計算されます

(x1、...、xn '*(r1、...、rn)

x1、...、xnは、すべての重みが1に合計しなければならないという制約を持つ重みです。

今私はNumpy Dot関数について少し疑問に思います。

returns = np.dot(expected_returns_annual, weights)
 _

returns = np.dot(expected_returns_annual, weights.T)
 _

同じ結果を与えます。

私は重みの形も体重をテストしました。

weights.shape
Out[58]: (5,)
weights.T.shape
Out[59]: (5,)
 _

重み付けの形状は(、5)ではなく(5、)でなければなりませんが、numpyは等しいように表示されます(私もTransposeも試しましたが、同じ結果があります)。

誰もが、numpyがこのように振る舞う理由を知っていますか?私の意見では、np.dot製品は自動的にベクトルをベクトルしてベクトル製品がうまく機能します。あれは正しいですか?

トムを尊重します

6
Tom

私は少し前に同じ質問をしました。マトリックスの1つが1次元であると、Numpyが自動的に実行しようとしているものを把握します。

ドキュメント ドット関数の場合、適用されたロジックの説明がより具体的です。

AとBの両方が1Dアレイである場合、それは(複素共役なしで)ベクトルの内積である。

AとBの両方が2Dアレイである場合、それは行列乗算ですが、MATMULまたはABを使用することが好ましいです。

AまたはBのいずれかが0~D(スカラー)の場​​合、それはNUMPY(A、B)を乗算して使用することと同等であるか、またはa * Bが好ましい。

AがN-Dアレイで、Bが1-Dアレイである場合は、AとBの最後の軸の上の合計製品です。

AがN - Dアレイであり、bがM - Dアレイである場合(ここで、m> = 2)、それはBの最後の軸とBの2番目の軸の上の合計積である。

1
Dominique Paul

Nampyでは、Transpose .Tはディメンションの順序を逆にします。つまり、一次元配列weightsには何もしません。

これはMATLABから来る人々のための混乱の一般的な源であり、一次元配列が存在しない。参照 numpy配列を転置する これについての以前の議論のために。

np.dot(x,y)高次元配列の整理は複雑な挙動を持ちますが、2つの一次元アレイが2つの1次元配列を給紙した場合のその動作は非常に簡単です。代わりに行と列のマトリックス製品として同等の結果を取得したい場合は、次のようなものを書く必要があります。

np.asscalar(x @ y[:, np.newaxis])

yに末尾の寸法を追加すると、1つの要素配列を乗算してからスカラに変換します。しかし、np.dot(x,y)はずっと速く効率的であるため、それを使用するだけです。


編集:実際には、これは私の部分の愚かでした。もちろん、TELの優れた回答が指摘しているため、1次元配列については、1次元配列についてx @ yに等しい動作を取得するためのMatrix乗算np.dotを書くことができます。

1
macroeconomist