日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

Python中的数学运算

發(fā)布時間:2023/12/20 python 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python中的数学运算 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、加減乘除運算

  • 張量(數(shù)組)之間的+、-、*、/,在python支持自動Broadcast機(jī)制。不過不是所有的張量之間都支持,需要進(jìn)行普適性判斷
    Broadcasting普適性判斷:
    首先將兩個shape靠右對齊,
    對于長度為1的維度,默認(rèn)這個數(shù)據(jù)普遍適合于當(dāng)前維度的其他位置;
    對于不存在的維度,則在增加新維度后默認(rèn)當(dāng)前數(shù)據(jù)也是普適于新維度的,從而可以擴(kuò)展為更多維度數(shù)、任意長度的張量形狀。
    若對齊之后shape對應(yīng)維度的值都大于1且不相等,則不滿足。例如:
  • a.shape:(2,32,32,4),b.shape:(2,1,32,4),c.shape:(2,32,4),d.shape:(2,32,32,2) a*b滿足普適性 b會自動擴(kuò)展為(2,32,32,4) a*c不滿足普適性 a*d不滿足普適性
  • 張量之間的加減乘除運算要求張量維度一樣或者滿足普適性原則(自動擴(kuò)展后維度一樣)
  • 張量之間的加減乘除運算都是逐元素的,滿足交換律
  • import numpu as np a = np.array([1,2,3]) b = np.array([2,2,3]) a*b:array([2, 4, 9]) b*a:array([2, 4, 9])
  • 可以通過np.sum和運算符*實現(xiàn)向量投影
  • a = np.array([1,2,3]) b = np.array([2,2,3]) c = np.sum(a*b,0)/np.linalg.norm(b) # 向量a在向量b上的投影
  • 可以通過np.sum和運算符*實現(xiàn)類似np.dot的效果,例如將多組向量批量旋轉(zhuǎn)到世界坐標(biāo)系
  • # dirs 是相機(jī)坐標(biāo)系的多組向量構(gòu)成的,dirs.shape:(1024,1024,3),即1024*1024組方向向量 # c2w 是由相機(jī)坐標(biāo)系變換到世界坐標(biāo)系的矩陣(視圖矩陣的逆矩陣) # c2w[:3, :3] 是視圖矩陣中旋轉(zhuǎn)矩陣的轉(zhuǎn)置 world_dirs = np.sum(dirs[..., np.newaxis, :] * c2w[:3, :3], -1) # 以上代碼實現(xiàn)效果類似于c2w@dirs,但由于dirs.shape是(1024,1024,3),雖然意義上是1024*1024組方向向量 # 但實際存儲是將dirs作為多維數(shù)組 # 所以c2w@dirs(屬于下面⑤):(3,3)X(1024,1024,3)不滿足普適性,不能用矩陣乘法

    二、矩陣相乘運算

  • 方式:可以通過@運算符;可以通過np.dot;可以通過tf.mutmul函數(shù)
  • 通過上述方式進(jìn)行運算時,若兩個張量均是二維矩陣則即是普通的矩陣乘法,而其他類型有所不同,具體如下:
    np.dot(a,b)
    ①如果a、b均是1維數(shù)組,則為向量內(nèi)積
    ②如果a、b均是2維數(shù)組,則均為矩陣乘法
    ③如果a或b是標(biāo)量,則與上述運算符*相同
    ④如果a是N(>=2)維數(shù)組,b是1維數(shù)組,進(jìn)行運算時,會首先將后面一項進(jìn)行自動轉(zhuǎn)置操作并將1維數(shù)組自動轉(zhuǎn)換為矩陣,之后再進(jìn)行矩陣乘法運算,最后結(jié)果還原成N階向量
    注意不滿足交換律,np.dot(a,b)和np.dot(b,a)結(jié)果都是N階向量,但向量元素值不一樣
    注意,在numpy中,若b.shape:(3,1)則代表b是一維矩陣,與向量不同,若此時a@b則屬于第二類,是矩陣乘法,結(jié)果為(N,1)的矩陣
    ⑤如果a是N(N>2)維數(shù)組,b是M(M>=2)維數(shù)組,則采用批量方式,選擇a和b的最后兩個維度進(jìn)行矩陣相乘,前面所有的維度都視作Batch維度。
    根據(jù)矩陣相乘的定義,𝑨和𝑩能夠矩陣相乘的條件是:
    a的倒數(shù)第一個維度長度(列)和b的倒數(shù)第二個維度長度(行)必須相等
    示例:
  • import numpy as npx = np.array([[1, 2, 3],[3, 4, 4],[0, 1, 1]]) y = np.array([1, 2, 3]) # x.shape:(3,3);y.shape:(1,3) => (3,1);矩陣乘法:(3,3)X(3,1) => (3,1) = >(3,) result1 = np.dot(x, y) # 1×1 + 2×2 + 3×3 = 14(result1的第一個元素) # x.shape:(3,3);y.shape:(1,3);矩陣乘法:(1,3)X(3,3) => (1,3) = >(3,) result2 = np.dot(y, x) # 1×1 + 2×3 + 3×0 = 7 (result2的第一個元素)a = np.array([[[1,2],[3,4]],[[5,6],[7,8]],[[9,10],[11,12]]]) b = np.array([[1,2],[3,4]]) # a.shape:(3,2,2);b.shape:(2,2);矩陣乘法:(2,2)X(2,2) => (2,2) # result.shape:(3,2,2) result3 = np.dot(a,b) # a的一個batch為[[1,2],[3,4]]
  • 矩陣相乘同樣自動支持Broadcast機(jī)制,但是普適性判斷有點不同,兩個shape的最后兩個維度只需滿足矩陣相乘的條件即可,而其他維度規(guī)則不變。
  • PS:建議不要將運算和點乘、叉乘的名稱對應(yīng)起來,向量的點乘、叉乘和矩陣的點乘、叉乘不一樣,很繞。。。

    參考

    [1]np.dot()函數(shù)的用法詳解
    [2]向量和矩陣的點乘和叉乘
    [3]Python 矩陣與矩陣以及矩陣與向量的乘法
    [4]Tensorflow深度學(xué)習(xí)

    總結(jié)

    以上是生活随笔為你收集整理的Python中的数学运算的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。