詳解Numpy中的廣播原則/機制
廣播的原則
如果兩個數(shù)組的后緣維度(從末尾開始算起的維度)的軸長度相符或其中一方的長度為1,則認為它們是廣播兼容的。廣播會在缺失維度和(或)軸長度為1的維度上進行。
在上面的對arr每一列減去列平均值的例子中,arr的后緣維度為3,arr.mean(0)后緣維度也是3,滿足軸長度相符的條件,廣播會在缺失維度進行。
這里有點奇怪的是缺失維度不是axis=1,而是axis=0,個人理解是缺失維度指的是兩個arr除了軸長度匹配的維度,在上面的例子中,正好是axis=0。這塊歡迎指正
arr.mean(0)沿著axis=0廣播,可以看作是把arr.mean(0)沿著豎直方向復(fù)制4份,即廣播的時候arr.mean(0)相當于一個shape=(4,3)的數(shù)組,數(shù)組的每一行均相同,均為arr.mean(0)
為了了解這個原則,首先我們來看一組例子:
# 數(shù)組直接對一個數(shù)進行加減乘除,產(chǎn)生的結(jié)果是數(shù)組中的每個元素都會加減乘除這個數(shù)。
In [12]: import numpy as np
In [13]: a = np.arange(1,13).reshape((4, 3))
In [14]: a * 2
Out[14]: array([[ 2, 4, 6],
[ 8, 10, 12],
[14, 16, 18],
[20, 22, 24]])
# 接下來我們看一下數(shù)組與數(shù)組之間的計算
In [17]: b = np.arange(12,24).reshape((4,3))
In [18]: b
Out[18]: array([[12, 13, 14],
[15, 16, 17],
[18, 19, 20],
[21, 22, 23]])
In [19]: a + b
Out[19]: array([[13, 15, 17],
[19, 21, 23],
[25, 27, 29],
[31, 33, 35]])
In [20]: c = np.array([1,2,3])
In [21]: a+c
Out[21]: array([[ 2, 4, 6],
[ 5, 7, 9],
[ 8, 10, 12],
[11, 13, 15]])
In [22]: d = np.arange(10,14).reshape((4,1))
In [23]: d
Out[23]: array([[10],
[11],
[12],
[13]])
In [24]: a + d
Out[24]: array([[11, 12, 13],
[15, 16, 17],
[19, 20, 21],
[23, 24, 25]])
# 從上面可以看出,和線性代數(shù)中不同的是,m*n列的m行的一維數(shù)組或者n列的一維數(shù)組也是可以計算的。
這是為什么呢?這里要提到numpy的廣播原則:
如果兩個數(shù)組的后緣維度(從末尾開始算起的維度)的軸長度相符或其中一方的長度為1,則認為它們是廣播兼容的。廣播會在缺失維度和(或)軸長度為1的維度上進行。
在上面的代碼中,a的維度是(4,3),c的維度是(1,3);d的維度是(4,1)。所以假設(shè)有兩個數(shù)組,第一個的維度是(x_1, y_1, z_1),另一個數(shù)組的維度是(x_2, y_2, z_2),要判斷這兩個數(shù)組能不能進行計算,可以用如下方法來判斷:
if z_1 == z_2 or z_1 == 1 or z_2 == 1: if y_1 == y_2 or y_1 == 1 or y_2 == 1: if x_1 == x_2 or x_1 == 1 or x_2 == 1: 可以運算 else: 不可以運算 else: 不可以運算 else: 不可以運算
這里需要注意:(3,3,2)和(3,2)是可以運算的,因為對于二維數(shù)組(3,2)也可以表示為(1,3,2),套用上述的規(guī)則是完全適用的,同理:(4,2,5,4)和(2,1,4)也是可以進行運算的。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
django foreignkey外鍵使用的例子 相當于left join
今天小編就為大家分享一篇django foreignkey外鍵使用的例子 相當于left join,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08
Python Arrow處理時間數(shù)據(jù)使用詳解(標準庫之外另一種選擇)
這篇文章主要介紹了Python標準庫之外Arrow處理時間數(shù)據(jù)的另一種選擇使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2024-01-01
Python?from?import導(dǎo)包ModuleNotFoundError?No?module?named
最近在執(zhí)行python腳本時,from?import的模塊沒有被加載進來,找不到module,這篇文章主要給大家介紹了關(guān)于Python?from?import導(dǎo)包ModuleNotFoundError?No?module?named找不到模塊問題的解決辦法,需要的朋友可以參考下2022-08-08
搭建python django虛擬環(huán)境完整步驟詳解
這篇文章主要介紹了搭建python django虛擬環(huán)境完整步驟詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-07-07
python Matplotlib數(shù)據(jù)可視化(2):詳解三大容器對象與常用設(shè)置
這篇文章主要介紹了python Matplotlib三大容器對象與常用設(shè)置的相關(guān)資料,幫助大家更好的學(xué)習(xí)和使用Matplotlib庫的用法,感興趣的朋友可以了解下2020-09-09
Python實現(xiàn)刪除列表首元素的多種方式總結(jié)
在Python中,處理列表的操作是日常開發(fā)中不可避免的任務(wù)之一,其中,刪除列表中的元素是一個常見的需求,本文為大家整理了Python中刪除列表中的第一個元素的多種方法,需要的可以參考下2023-12-12
Python?中?key?參數(shù)的含義及用法小結(jié)
我們在使用?sorted()?或?map()?函數(shù)的時候,都會看到里面有一個?key?參數(shù),其實這個?key?參數(shù)也存在于其他內(nèi)置函數(shù)中(例如?min()、max()?等),那么我們今天就來了解一下?key?參數(shù)的含義以及用途吧,需要的朋友可以參考下2023-12-12

