細說NumPy數(shù)組的四種乘法的使用
當孔乙己說回字有四樣寫法的時候,相信各位都是這樣的表情吧?
但是,如果孔乙己說NumPy數(shù)組有四種乘法的時候,各位大約就是這樣的表情了吧?
實際上,NumPy數(shù)組乘法遠不止四種。為了在寫作和閱讀時保持清晰的邏輯和清醒的頭腦,本文僅對四種最常見的數(shù)組乘法給出詳細說明,并用一道數(shù)學題來演示向量點乘和叉乘的用法。
1. 星乘(*)
先聲明一下:星乘這個說法,是我自己創(chuàng)造的,因為我實在不知道數(shù)組的這種乘法有沒有其他高大上的名字,只好用運算符來表示了。所謂數(shù)組星乘,就是數(shù)組的對應元素相乘,這也是初學NumPy的同學最早接觸到的數(shù)組乘法。
>>> import numpy as np >>> a = np.array([1,2,3]) >>> b = np.array([4,5,6]) >>> a*b array([ 4, 10, 18])
對于多維數(shù)組,星乘的規(guī)則也是一樣。
>>> a = np.arange(6).reshape((2,3)) >>> b = np.arange(6,12).reshape((2,3)) >>> a array([[0, 1, 2], [3, 4, 5]]) >>> b array([[ 6, 7, 8], [ 9, 10, 11]]) >>> a*b array([[ 0, 7, 16], [27, 40, 55]])
即使兩個數(shù)組的shape不一樣,只要滿足特定條件,同樣可以用星號相乘,且滿足交換律。
>>> a = np.arange(6).reshape((2,3)) >>> b = np.array([1,2,3]) >>> a array([[0, 1, 2], [3, 4, 5]]) >>> b array([1, 2, 3]) >>> a*b array([[ 0, 2, 6], [ 3, 8, 15]]) >>> b*a array([[ 0, 2, 6], [ 3, 8, 15]])
2. 點乘(np.dot)
在數(shù)學上,向量點乘就是兩個向量的對應位相乘后求和,因此向量點乘得到的是標量。
向量點乘的幾何意義是兩個向量的模之積再乘以二者夾角的余弦值。這意味著,如果兩個向量互相垂直,則其點積為零。反過來說,兩個不為零的向量的點積等于零,則兩個向量垂直。
numpy.dot()函數(shù)提供了點乘運算。對于一維數(shù)組,NumPy的點乘就是向量點乘,其結果是一個標量。對于多維數(shù)組,則需要滿足一定條件才能實現(xiàn)點乘,且其結果不再是標量,而是一個多維數(shù)組。比如,NumPy的矩陣相乘,就是二維數(shù)組的點乘,參與點乘的第一個數(shù)組的列數(shù)必須等于第二個數(shù)組的行數(shù)。
>>> a = np.array([1,0,0]) >>> b = np.array([0,1,0]) >>> np.dot(a,b) # 向量a和向量b相互垂直,其點積為0 0 >>> a = np.arange(6).reshape((2,3)) >>> b = np.arange(6,18).reshape((3,4)) >>> np.dot(a,b) # 滿足點乘條件 array([[ 38, 41, 44, 47], [128, 140, 152, 164]]) >>> np.dot(b,a) # 不滿足點乘條件 Traceback (most recent call last): File "<pyshell#38>", line 1, in <module> np.dot(b,a) File "<__array_function__ internals>", line 6, in dot ValueError: shapes (3,4) and (2,3) not aligned: 4 (dim 1) != 2 (dim 0)
3. 叉乘(np.cross)
在百度和知乎上,有很多人說叉積就是外積,也有人提出不同意見。我在這里僅使用叉乘或叉積等確定無誤的概念,以免誤人子弟。在數(shù)學上,二維平面的向量叉乘,其結果是以兩個向量為邊的菱形的面積,三維空間的向量叉乘,其結果是仍然是一個向量,且垂直于相乘的兩個向量,也就是參與相乘的兩個向量決定的平面的法向量。nunpy.cross()函數(shù)可以實現(xiàn)向量(一維數(shù)組)叉乘,也可以實現(xiàn)二維或三維數(shù)組的叉乘。
>>> a = np.array([2,0]) >>> b = np.array([2,2]) >>> np.cross(a,b) # 平面向量叉乘,其結果是以兩個向量為邊的菱形的面積 array(4) >>> a = np.array([1,0,0]) >>> b = np.array([0,1,0]) >>> np.cross(a,b) # x軸叉乘y軸,得到z軸 array([0, 0, 1]) >>> np.cross(b,a) # 叉乘交換順序,得到反向的法向量 array([ 0, 0, -1])
4. 外乘(np.outer)
這里的外乘,類似于星乘,并不是通用的概念,也是我自己編造的一個說法,來源于numpy.outer()函數(shù)。從字面看,outer()函數(shù)更像是求外積,但從實際效果看,更像是笛卡爾直積,因此我這里用了“外乘”而不是“外積”。那么,outer()函數(shù)究竟能作什么呢?
>>> a = np.array([1,2,3]) >>> b = np.array([4,5,6,7]) >>> np.outer(a,b) array([[ 4, 5, 6, 7], [ 8, 10, 12, 14], [12, 15, 18, 21]])
數(shù)組A外乘數(shù)組B,返回一個二維數(shù)組,這個二維數(shù)組的第i行是數(shù)組A的第i個元素星乘數(shù)組B。
5. 判斷兩條直線是否相交
假設abcd是歐氏空間中不重合的四個點,如何判斷過點ab的直線和過點cd的直線是否相交?如果使用空間解析幾何的方式來解決問題,對于一般程序員來說將是一個難題。不過,如果你熟悉NumPy,理解點積(np.dot)和叉積(np.cross)的話,解決這個問題就變得非常容易了。具體思路是這樣的:
計算向量ab和向量cd的叉積,得到向量orth如果orth的每一個元素都是零,則表示直線ab平行于直線cd,二者不可能相交;否則,orth就同時垂直于向量ab和向量cd計算向量orth和向量ac的點積,得到標量dp如果dp為零,表示向量orth垂直于向量ac,此時直線ab和直線cd在同一個平面上,且一定相交于某點
以上思路寫成代碼如下。
>>> a = np.array([1,2,3]) >>> b = np.array([4,5,6,7]) >>> np.outer(a,b) array([[ 4, 5, 6, 7], [ 8, 10, 12, 14], [12, 15, 18, 21]])
到此這篇關于細說NumPy數(shù)組的四種乘法的使用的文章就介紹到這了,更多相關NumPy數(shù)組乘法內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
python3 使用OpenCV計算滑塊拼圖驗證碼缺口位置(場景示例)
這篇文章主要介紹了python3 使用OpenCV計算滑塊拼圖驗證碼缺口位置,本文通過場景示例給大家詳細介紹,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-08-08Numpy中np.random.rand()和np.random.randn() 用法和區(qū)別詳解
這篇文章主要介紹了Numpy中np.random.rand()和np.random.randn() 用法和區(qū)別詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-10-10python matplotlib 畫dataframe的時間序列圖實例
今天小編就為大家分享一篇python matplotlib 畫dataframe的時間序列圖實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-11-11python中json格式數(shù)據輸出的簡單實現(xiàn)方法
下面小編就為大家?guī)硪黄猵ython中json格式數(shù)據輸出的簡單實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-10-10