首頁 >後端開發 >Python教學 >NumPy 的 (R, 1) 和 (R,) 形狀有什麼差別,如何解矩陣乘法問題?

NumPy 的 (R, 1) 和 (R,) 形狀有什麼差別,如何解矩陣乘法問題?

Susan Sarandon
Susan Sarandon原創
2024-12-04 14:13:11351瀏覽

What's the Difference Between NumPy's (R, 1) and (R,) Shapes, and How Can Matrix Multiplication Issues Be Resolved?

NumPy 中 (R, 1) 和 (R,) 形狀有何不同?

在 NumPy 中,一維數組可以用兩種方式表示:作為形狀 (R, 1)(數字列表)或作為形狀(R,)(列表的列表)。這兩種形狀代表相同的基礎數據,但它們對矩陣乘法有不同的意義。

當您將兩個矩陣相乘時,它們的形狀必須相容。如果一個矩陣的形狀為 (R, 1),而另一個矩陣的形狀為 (R,),NumPy 將引發錯誤,因為形狀未對齊。這是因為 (R, 1) 是二維形狀,而 (R,) 是一維形狀。

要修正此錯誤,您可以明確重塑其中一個矩陣。例如:

import numpy as np

M = np.array([[1, 2, 3], [4, 5, 6]])
ones = np.ones((M.shape[0], 1))

result = np.dot(M[:,0].reshape((M.shape[0], 1)), ones)

在此範例中,我們使用 reshape() 方法將 M 的第一列(形狀 (R,))重塑為形狀 (R, 1)。這使得兩個矩陣的形狀相容,並且可以成功執行乘法。

是否有更好的方法可以在不顯式重塑的情況下完成上述範例?

是的,有更好的方法可以完成上述範例,而無需明確重塑。一種方法是使用帶有 axis 參數的 sum() 方法。例如:

import numpy as np

M = np.array([[1, 2, 3], [4, 5, 6]])
ones = np.ones((M.shape[0], 1))

result = np.dot(M[:,0], ones) + M[:,1:]

在此範例中,我們使用 sum() 方法對 M 的第一列與其餘列求和。這給了我們一個與 M 形狀相同的矩陣。然後我們可以執行乘法而不會出現任何錯誤。

在不明確重塑的情況下執行上述範例的另一種方法是使用 Broadcast() 函數。例如:

import numpy as np

M = np.array([[1, 2, 3], [4, 5, 6]])
ones = np.ones((M.shape[0], 1))

result = np.dot( np.broadcast_to(M[:,0], M.shape), ones)

在這個例子中,我們使用broadcast()函數將M的第一列廣播到M的形狀。這使得兩個矩陣的形狀相容,乘法可以執行成功。

以上是NumPy 的 (R, 1) 和 (R,) 形狀有什麼差別,如何解矩陣乘法問題?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn