[英]Effect of reshaping an numpy array from (2,) to (2,1)
我試圖通過python中的點積計算2個數組a
和b
的協方差矩陣,公式為a @ bT
。
打印形狀時,我的輸入數組的初始形式是(2,)
。 顯然,這個計算的結果是一個單一的標量,而不是我需要的協方差矩陣。
事實證明,我需要對數組進行a.reshape(2,1)
(即a.reshape(2,1)
)以接收所需的(2,2)
協方差矩陣。
現在我的問題是我不明白數組的重塑對數據有什么影響,更具體地說,為什么允許我這樣做並接收我想要的結果。
為什么我可以重塑數組以接收協方差矩陣,它背后的思考過程是什么?
我確實了解點積是如何工作的,但正如我所說,我不明白為什么我只能重塑數組以接收所需的結果維度。
我希望我讓我的問題可以理解,我在制定它時遇到了一些麻煩。
感謝任何幫助!
雖然reshape
不會改變數組的值,但它會影響數組與其他數組的交互方式。 像*
和@
這樣的運算符有處理各種形狀數組的規則。
In [221]: a, b = np.array([1,2]), np.array([3,4])
In [222]: a,b
Out[222]: (array([1, 2]), array([3, 4]))
一維數組的transpose
沒有任何改變。 它不會“添加”維度; 它只是顛倒了現有的尺寸:
In [223]: b.T
Out[223]: array([3, 4])
對於一matmul
數組, matmul
和dot
做“標量”或“點”積。 這清楚地記錄在案:
In [224]: a@(b.T)
Out[224]: 11
將數組重塑為(2,1)
。 現在轉置確實有所作為:
In [225]: a[:,None]
Out[225]:
array([[1],
[2]])
In [226]: b[:,None].T
Out[226]: array([[3, 4]])
這里我們有一個 (2,1) 和 (1,2),它做矩陣乘積,對大小為 1 的維度求和。 結果是 (2,2)。 再次明確記錄。
In [227]: a[:,None]@b[:,None].T
Out[227]:
array([[3, 4],
[6, 8]])
獲得該產品的其他方式:
In [228]: np.outer(a,b)
Out[228]:
array([[3, 4],
[6, 8]])
In [229]: a[:,None]*b
Out[229]:
array([[3, 4],
[6, 8]])
最后一種情況是 (2,1) 與 (2,) 的元素乘法。 broadcasting
規則適用。 仔細閱讀!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.