2 回答

TA貢獻1802條經驗 獲得超5個贊
不要將數學中使用的維度的含義與 numpy 中的維度混淆。
你的第一個矩陣的形狀是 (5,3),這是正確的。它的維度為 2。
第二個向量不是 numpy 的 3x1 矩陣。它的形狀為 (3,),維度為 1:
wb0 = np.array([ 1.0, 1.0, 1.0])
numpy 的等效 3x1 矩陣如下:
wb1 = numpy.array([[1.0], [1.0], [1.0]])
print(wb1)
print("shape wb1",wb1.shape)
如您所見,這里我們有兩個維度來wb1比較wb0。雖然wb0在您看來是 3x1 矩陣,但對于 numpy,它是一個 (3,) 矩陣。
的 1x3 矩陣wb01如下:
wb2 = numpy.array([[1.0, 1.0, 1.0]])
print(wb2)
print("shape wb0",wb2.shape)
因此,numpy 中的維度和形狀不同于一般代數中用于矩陣的維度??梢栽谝韵戮€程中找到非常詳盡的解釋:Difference between numpy.array shape (R, 1) and (R,)
在您的情況下,numpy 能夠在 (5,3) 矩陣和 (3,) 矩陣之間進行矩陣乘法的原因是dot函數的實現:
如果 a 是 ND 數組且 b 是一維數組,則它是 a 和 b 的最后一個軸上的和積。
如果對 (5,3) 矩陣和 (3,1) 矩陣使用點函數,您會得到相同的結果:
import numpy
X = numpy.array([[4.6, 3.4, 1.4],
[6.5, 3.2, 5.1],
[5.7, 2.9, 4.2],
[6.6, 3., 4.4],
[6., 2.9, 4.5]])
print(X)
print(X.shape)
print("")
wb0 = numpy.array([0.0, 1.0, 1.0, 1.0])
print(wb0)
print("shape wb0",wb0.shape)
print()
w = numpy.array([[1.0], [1.0], [1.0]])
print(w)
print("shape w",w.shape)
print("")
print(numpy.dot(X,w))
唯一的區別是,在您的情況下,最終結果的形狀為 (5,),而在第二種情況下,結果的形狀為 (5,1)。

TA貢獻1843條經驗 獲得超7個贊
numpy.dot() 中的計算很大程度上取決于您的輸入變量。文檔字符串給出:
點(a,b,out=None)
[...]
如果
a
是 ND 數組并且是 1-D 數組,則它是 和 的最后一個軸上的和b
積。a
b
如果
a
和b
都是二維數組,則它是矩陣乘法,但最好使用 :func:matmul
ora @ b
。[...]
如果要使用矩陣乘法,則必須定義w
為二維數組:
wb0 = numpy.array([[0.0, 1.0, 1.0, 1.0]]) w = wb0[0,1:]
添加回答
舉報