細說NumPy數組的四種乘法,帶你走進向量運算的奇妙世界

2021-02-13 Python作業輔導員

當孔乙己說回字有四樣寫法的時候,相信各位都是這樣的表情吧?


但是,如果孔乙己說NumPy數組有四種乘法的時候,各位大約就是這樣的表情了吧?

實際上,NumPy數組乘法遠不止四種。為了在寫作和閱讀時保持清晰的邏輯和清醒的頭腦,本文僅對四種最常見的數組乘法給出詳細說明,並用一道數學題來演示向量點乘和叉乘的用法。

1. 星乘(*)先聲明一下:星乘這個說法,是我自己創造的,因為我實在不知道數組的這種乘法有沒有其他高大上的名字,只好用運算符來表示了。所謂數組星乘,就是數組的對應元素相乘,這也是初學NumPy的同學最早接觸到的數組乘法。

>>> import numpy as np
>>> a = np.array([1,2,3])
>>> b = np.array([4,5,6])
>>> a*b
array([ 4, 10, 18])

>>> 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]])

即使兩個數組的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)在數學上,向量點乘就是兩個向量的對應位相乘後求和,因此向量點乘得到的是標量。

向量點乘的幾何意義是兩個向量的模之積再乘以二者夾角的餘弦值。這意味著,如果兩個向量互相垂直,則其點積為零。反過來說,兩個不為零的向量的點積等於零,則兩個向量垂直。numpy.dot()函數提供了點乘運算。對於一維數組,NumPy的點乘就是向量點乘,其結果是一個標量。對於多維數組,則需要滿足一定條件才能實現點乘,且其結果不再是標量,而是一個多維數組。比如,NumPy的矩陣相乘,就是二維數組的點乘,參與點乘的第一個數組的列數必須等於第二個數組的行數。

>>> 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)在百度和知乎上,有很多人說叉積就是外積,也有人提出不同意見。我在這裡僅使用叉乘或叉積等確定無誤的概念,以免誤人子弟。在數學上,二維平面的向量叉乘,其結果是以兩個向量為邊的菱形的面積,三維空間的向量叉乘,其結果仍然是一個向量,且垂直於相乘的兩個向量,也就是參與相乘的兩個向量決定的平面的法向量。nunpy.cross()函數可以實現向量(一維數組)叉乘,也可以實現二維或三維數組的叉乘。

>>> 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()函數。從字面看,outer()函數更像是求外積,但從實際效果看,更像是笛卡爾直積,因此我這裡用了「外乘」而不是「外積」。那麼,outer()函數究竟能做什麼呢?

>>> 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]])

數組A外乘數組B,返回一個二維數組,這個二維數組的第i行是數組A的第i個元素星乘數組B。5. 判斷兩條直線是否相交假設abcd是歐氏空間中不重合的四個點,如何判斷過點ab的直線和過點cd的直線是否相交?如果使用空間解析幾何的方式來解決問題,對於一般程式設計師來說將是一個難題。不過,如果你熟悉NumPy,理解點積(np.dot)和叉積(np.cross)的話,解決這個問題就變得非常容易了。具體思路是這樣的:

>>> def is_orthogonal(a, b, c, d):
        ab = np.array(b) - np.array(a)
        cd = np.array(d) - np.array(c)
        ac = np.array(c) - np.array(a)
        orth = np.cross(ab, cd)
        return orth.any() and np.dot(orth, ac) == 0

相關焦點

  • NumPy基礎教程,帶你玩轉多維數組
    比如,你可以用 Python 的列表(list)來創建 NumPy 數組,其中生成的數組元素類型與原序列相同。, numpy.random.randn, fromfunction, fromfile (這些函數也可以創建數組,有時間可以嘗試解釋)輸出數組當你輸出一個數組時,NumPy 顯示這個數組的方式和嵌套列表是相似的。
  • 教程| Numpy的線性代數運算
    訪問flyai.club,一鍵創建你的人工智慧項目線性代數(如矩陣乘法、矩陣分解、行列式以及其他方陣數學等)是任何數組庫的重要組成部分。不像某些語言(如MATLAB),通過*對兩個二維數組相乘得到的是一個元素級的積,而不是一個矩陣點積。
  • 數據分析-numpy庫快速了解
    可用來存儲和處理大型矩陣,比Python自身的嵌套列表結構要高效的多,支持大量的維度數組與矩陣運算,此外也針對數組運算提供大量的數學函數庫。 數組對象可以去掉元素間運算所需的循環,使一維向量更像單個數據 設置專門的數組對象,經過優化,可以提升這類應用的運算速度觀察:科學計算中,一個維度所有數據的類型往往相同 數組對象採用相同的數據類型,有助於節省運算和存儲空間具體可以看下面一個例子:(來源嵩天老師案例)3.numpy庫怎麼使用先安裝numpy
  • 圖解NumPy,這是理解數組最形象的一份教程了
    import numpy as np創建數組我們可以通過傳遞一個 python 列表並使用 np.array()來創建 NumPy 數組(極大可能是多維數組)。除了「加」,我們還可以進行如下操作:通常情況下,我們希望數組和單個數字之間也可以進行運算操作(即向量和標量之間的運算)。比如說,我們的數組表示以英裡為單位的距離,我們希望將其單位轉換為千米。只需輸入 data * 1.6 即可:看到 NumPy 是如何理解這個運算的了嗎?這個概念叫做廣播機制(broadcasting),它非常有用。
  • NumPy ndarray數組的創建
    NumPy 封裝了一個新的數據類型 ndarray(N-dimensional Array),它是一個多維數組對象。該對象封裝了許多常用的數學運算函數,方便我們做數據處理、數據分析等。那麼,如何生成 ndarray 呢?
  • Numpy的ndarray:一種多維數組對象
    前言Numpy最重要的一個特點就是其N維數組對象(即ndarray),該對象是一個快速而靈活的大數據集容器。可以利用這種數組對整塊數據執行一些數學運算。模塊導入方式如下:import numpy as npndarray是一個通用的同構數據多維容器,也就是說,其中的所有元素必須是相同類型的。
  • python數據分析基礎之numpy
    支持高級大量的維度數組與矩陣運算,是學習數據挖掘的基礎,今天我們就來總結下numpy的一些基礎用法。首先,在講numpy之前,我先帶領大家預習下大學學習過的矩陣的基礎知識。1、矩陣的基本概念矩陣:由m×n個數排列成 的m行n列的數表,稱為m行n列矩陣。實矩陣:元素是實數的矩陣。復矩陣:元素是負數的矩陣。
  • 如何獲取numpy數組的真實地址?如何與ctypes數組共享內存?
    01如何獲取numpy數組元素的真實地址?在Python編程中,numpy是一個很好用的擴展程序庫,將其與SciPy庫和 Matplotlib繪圖庫一起使用,可構成一個強大的類似於Matlab的科學計算環境,有助於我們通過 Python 學習數據科學或者機器學習。在Python中,當你定義了一個numpy類型的數組後,它內部元素的真實地址如何獲得呢?
  • 看圖學NumPy:掌握n維數組基礎知識點,看這一篇就夠了
    向量運算算術運算是NumPy速度最引入注目的地方之一。NumPy的向量運算符已達到C++級別,避免了Python的慢循環。矩陣運算NumPy中曾經有一個專用的類matrix,但現在已棄用,因此下面將交替使用矩陣和2D數組兩個詞。矩陣初始化語法與向量相似:
  • Python數據分析之numpy數組全解析
    讀取外部數據的方法不止np.genfromtxt(),還有np.load(等,但numpy讀取外部數據的應用情況其實並不多,這裡不再細說。numpy中數組的數據類型 作為一個強大的科學計算庫,numpy中支持的數據類型遠不止Python原生的幾種數據類型。
  • 如何使用Numpy進行運算?
    numpy是python及其重要的計算包,那麼numpy是如何進行運算的,接下裡小編將具體進行介紹:1.Numpy數組運算Numpy數組運算(如根據布爾型數組進行過濾、標量乘法、應用數學函數等)都會保留索引和值之間的連結:如:@ In [7]: obj2[obj2>0]@ In [8]: obj2*2@ In [10]: np.exp(obj2)2.可使用部分字典參數的函數Series可被看成是索引值到數據值的一個映射
  • 一鍵獲取新技能,玩轉NumPy數據操作
    它極大地簡化了向量和矩陣的操作及處理。python的不少數據處理軟體包依賴於NumPy作為其基礎架構的核心部分(例如scikit-learn、SciPy、pandas和tensorflow)。除了數據切片和數據切塊的功能之外,掌握numpy也使得開發者在使用各數據處理庫調試和處理複雜用例時更具優勢。
  • Python學習第117課——numpy中dot的運用舉例
    【每天幾分鐘,從零入門python編程的世界!】上節我們學習了最基礎的matrix的運算,可能有小夥伴覺得這都要涉及高等數學知識了,確實如果你想做數據科學、做人工智慧,統計學、概率論等數學知識,尤其是算法是繞不過去的坎,但是不要怕!!!
  • 教程| 基礎入門:深度學習矩陣運算的概念和代碼實現
    而如果不了解矩陣的運算法則及意義,甚至我們都很難去理解一些如矩陣因子分解法和反向傳播算法之類的基本概念。同時由於特徵和權重都以向量儲存,那如果我們不了解矩陣運算,代碼實現將變得十分艱難。什麼是線性代數?在深度學習中,線性代數是一個強大的數學工具箱,它提供同時計算多維數組的方法。
  • 邊看圖,變學習,NumPy可視化初學教程
    向量運算算術是NumPy性能最耀眼的地方之一。向量運算符已經用c++重構,可使我們避免慢的Python循環。名稱np.around只是np.round為了避免round和Python函數幹擾,而引入的別名from numpy import *(對比常見的import numpy as np)。
  • Python學習第114課——numpy中ndarray的四則運算
    【每天幾分鐘,從零入門python編程的世界!】我們為什麼要學習numpy?numpy其實就是number+Python的簡寫,意思就是通過Python對數據進行處理。要對數據進行處理,就少不了最基本的加減乘除等操作。
  • 深度學習中的NumPy基礎
    import numpy as npa = np.array([1,2,3])a.shapea.dim此外,您可以直接從標準的 Python 列表創建。Numpy 數組是智能的。如果將 Python 列表傳遞給 array()函數,它將自動執行操作並返回 Numpy 數組。
  • Python編程:如何規範numpy中數組元素的列印輸出格式
    引言對於Python語言開發者,如果你經常處理大量數據運算的話,numpy是一個必不可少的程序擴展庫,它支持大維度數組與矩陣運算,提供了非常豐富的數學運算函數,並且,相對於Python自身提供的列表類型,它在運算速度上有著無與倫比的優勢。
  • 手把手教你學Numpy——常用API合集
    實際上numpy的內部會將高維數組轉化成一維之後再進行這個操作,我們可以reshape一下數組來進行驗證:這些只是api的基本用法,numpy當中支持的功能不僅如此。我們觀察一下這些函數會發現,它們的作用域都是一組數據,返回的是一組數據通過某種運算得到的結果。舉個例子,比如sum,是對一組數據的價格。std計算的是一組數據的標準差,這樣的函數我們稱為聚合函數。