在 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中文網其他相關文章!