Numpy乘法解惑

numpy中數(shù)據(jù)格式有arraymat,乘法有普通乘號xdot,對于初學(xué)者(本人也是初學(xué)者)來說太容易迷糊了。下面記錄一點心得。

先說結(jié)論:dot是遵循矩陣乘法的法則;普通乘號x遵循的法則既有矩陣乘法法則,也有逐元素相乘的法則,具體看相乘的兩個數(shù)組的數(shù)據(jù)類型。


普通乘號X

1.array相乘
當(dāng)兩個array格式的數(shù)組相乘時,結(jié)果實際上是逐元素相乘。

In [60]: a = np.array([1, 2, 3, 4])

In [61]: b = np.array([2, 2, 3, 3])

In [62]: a * b
Out[62]: array([ 2,  4,  9, 12])

-----------------------------
In [63]: b = np.array([2])

In [64]: a * b
Out[64]: array([2, 4, 6, 8])
-----------------------------------
In [70]: b = np.array([2, 3])

In [71]: b
Out[71]: array([2, 3])

In [72]: a
Out[72]: 
array([[1, 2],
       [3, 4]])

In [73]: a * b # 此時相當(dāng)于將b擴(kuò)展成array([[2, 3],[2, 3]])
Out[73]: 
array([[ 2,  6],
       [ 6, 12]])
--------------------------------
In [74]: b.shape = (2, 1)

In [75]: b
Out[75]: 
array([[2],
       [3]])

In [76]: b * a # 此時相當(dāng)于將b擴(kuò)展成array([[2, 2], [3, 3]])
Out[76]: 
array([[ 2,  4],
       [ 9, 12]])

In [77]: a * b
Out[77]: 
array([[ 2,  4],
       [ 9, 12]])

2.mat相乘
當(dāng)兩個mat格式的數(shù)組相乘時,結(jié)果遵循矩陣相乘法則。

3.array與mat相乘
當(dāng)arraymat格式的數(shù)組相乘時,結(jié)果遵循矩陣相乘法則。

In [83]: a
Out[83]: 
array([[1, 2],
       [3, 4]])

In [84]: b = np.mat('[2 2];[3 3]')

In [85]: b
Out[85]: 
matrix([[2, 2],
        [3, 3]])

In [86]: a * b # 注意a * b的結(jié)果與b * a的結(jié)果不一致
Out[86]: 
matrix([[ 8,  8],
        [18, 18]])

In [87]: b * a
Out[87]: 
matrix([[ 8, 12],
        [12, 18]])

---------------------------------
In [90]: a
Out[90]: 
matrix([[1, 2],
        [3, 4]])

In [91]: b = np.array([2, 3])

In [92]: b
Out[92]: array([2, 3])

In [93]: a * b # 注意此時出錯了,因為不符合矩陣相乘法則
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-93-50927f39610b> in <module>()
----> 1 a * b

/usr/local/lib/python3.6/site-packages/numpy/matrixlib/defmatrix.py in __mul__(self, other)
    341         if isinstance(other, (N.ndarray, list, tuple)) :
    342             # This promotes 1-D vectors to row vectors
--> 343             return N.dot(self, asmatrix(other))
    344         if isscalar(other) or not hasattr(other, '__rmul__') :
    345             return N.dot(self, other)

ValueError: shapes (2,2) and (1,2) not aligned: 2 (dim 1) != 1 (dim 0)

In [94]: b * a
Out[94]: matrix([[11, 16]])

dot

dot實際上采用的就是矩陣的乘法規(guī)則,不管是什么數(shù)據(jù)格式。如下示例:
1.array相乘

In [2]: a = np.array([[1, 2], [3, 4]])

In [3]: a
Out[3]: 
array([[1, 2],
       [3, 4]])

In [4]: b = np.array([[2, 3], [2, 3]])

In [5]: b
Out[5]: 
array([[2, 3],
       [2, 3]])

In [6]: a.dot(b) # 此時就是矩陣a x 矩陣b的結(jié)果
Out[6]: 
array([[ 6,  9],
       [14, 21]])

下面再舉一個反常的例子:

In [7]: b = np.array([2, 3])

In [8]: a.dot(b)
Out[8]: array([ 8, 18])

如何理解這個例子呢?若按照矩陣的乘法法則,則a x b 應(yīng)該會報錯啊。實際上,此時的a.dot(b)可以理解為a x b.T的結(jié)果,再轉(zhuǎn)置回來,如下所示:

In [9]: c = b.reshape((2, 1))

In [10]: c
Out[10]: 
array([[2],
       [3]])

In [11]: a.dot(c)
Out[11]: 
array([[ 8],
       [18]])

In [12]: np.mat(a) * c
Out[12]: 
matrix([[ 8],
        [18]])

2.其余mat相乘及mat與array相乘,都是遵循矩陣的乘法法則。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一.NumPy的引入 標(biāo)準(zhǔn)安裝的Python中用列表(list)保存一組值,可以用來當(dāng)作數(shù)組使用,不過由于列...
    wlj1107閱讀 1,134評論 0 2
  • 先決條件 在閱讀這個教程之前,你多少需要知道點python。如果你想從新回憶下,請看看Python Tutoria...
    舒map閱讀 2,725評論 1 13
  • NumPy是Python中關(guān)于科學(xué)計算的一個類庫,在這里簡單介紹一下。 來源:https://docs.scipy...
    灰太狼_black閱讀 1,331評論 0 5
  • 首頁 資訊 文章 資源 小組 相親 登錄 注冊 首頁 最新文章 IT 職場 前端 后端 移動端 數(shù)據(jù)庫 運維 其他...
    Helen_Cat閱讀 4,152評論 1 10
  • 小時候的愛情 那么單純 喜歡一個人喜歡就是喜歡 沒有任何其他原因 盡管不帥但在你眼中確是最帥 每次下課后的幾分鐘相...
    黑白頁閱讀 340評論 0 0

友情鏈接更多精彩內(nèi)容