詳解Numpy中的廣播原則/機(jī)制
廣播的原則
如果兩個(gè)數(shù)組的后緣維度(從末尾開(kāi)始算起的維度)的軸長(zhǎng)度相符或其中一方的長(zhǎng)度為1,則認(rèn)為它們是廣播兼容的。廣播會(huì)在缺失維度和(或)軸長(zhǎng)度為1的維度上進(jìn)行。
在上面的對(duì)arr每一列減去列平均值的例子中,arr的后緣維度為3,arr.mean(0)后緣維度也是3,滿(mǎn)足軸長(zhǎng)度相符的條件,廣播會(huì)在缺失維度進(jìn)行。
這里有點(diǎn)奇怪的是缺失維度不是axis=1,而是axis=0,個(gè)人理解是缺失維度指的是兩個(gè)arr除了軸長(zhǎng)度匹配的維度,在上面的例子中,正好是axis=0。這塊歡迎指正
arr.mean(0)沿著axis=0廣播,可以看作是把a(bǔ)rr.mean(0)沿著豎直方向復(fù)制4份,即廣播的時(shí)候arr.mean(0)相當(dāng)于一個(gè)shape=(4,3)的數(shù)組,數(shù)組的每一行均相同,均為arr.mean(0)
為了了解這個(gè)原則,首先我們來(lái)看一組例子:
# 數(shù)組直接對(duì)一個(gè)數(shù)進(jìn)行加減乘除,產(chǎn)生的結(jié)果是數(shù)組中的每個(gè)元素都會(huì)加減乘除這個(gè)數(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]]) # 接下來(lái)我們看一下數(shù)組與數(shù)組之間的計(jì)算 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ù)組也是可以計(jì)算的。
這是為什么呢?這里要提到numpy的廣播原則:
如果兩個(gè)數(shù)組的后緣維度(從末尾開(kāi)始算起的維度)的軸長(zhǎng)度相符或其中一方的長(zhǎng)度為1,則認(rèn)為它們是廣播兼容的。廣播會(huì)在缺失維度和(或)軸長(zhǎng)度為1的維度上進(jìn)行。
在上面的代碼中,a的維度是(4,3),c的維度是(1,3);d的維度是(4,1)。所以假設(shè)有兩個(gè)數(shù)組,第一個(gè)的維度是(x_1, y_1, z_1),另一個(gè)數(shù)組的維度是(x_2, y_2, z_2),要判斷這兩個(gè)數(shù)組能不能進(jìn)行計(jì)算,可以用如下方法來(lái)判斷:
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: 可以運(yùn)算 else: 不可以運(yùn)算 else: 不可以運(yùn)算 else: 不可以運(yùn)算
這里需要注意:(3,3,2)和(3,2)是可以運(yùn)算的,因?yàn)閷?duì)于二維數(shù)組(3,2)也可以表示為(1,3,2),套用上述的規(guī)則是完全適用的,同理:(4,2,5,4)和(2,1,4)也是可以進(jìn)行運(yùn)算的。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python爬蟲(chóng)爬取微博熱搜保存為 Markdown 文件的源碼
這篇文章主要介紹了Python爬蟲(chóng)爬取微博熱搜保存為 Markdown 文件,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02python環(huán)境下OPenCV處理視頻流局部區(qū)域像素值
這篇文章主要為大家介紹了python環(huán)境下OPenCV處理視頻流局部區(qū)域像素值的實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-11-11利用Matlab繪制各類(lèi)特殊圖形的實(shí)例代碼
作為一個(gè)功能強(qiáng)大的工具軟件,Matlab具有很強(qiáng)的圖形處理功能,提供了大量的二維、三 維圖形函數(shù),這篇文章主要給大家介紹了關(guān)于如何利用Matlab繪制各類(lèi)特殊圖形的相關(guān)資料,需要的朋友可以參考下2021-07-07tensorflow 保存模型和取出中間權(quán)重例子
今天小編就為大家分享一篇tensorflow 保存模型和取出中間權(quán)重例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01用PyQt進(jìn)行Python圖形界面的程序的開(kāi)發(fā)的入門(mén)指引
這篇文章主要介紹了用PyQt進(jìn)行Python圖形界面的程序的開(kāi)發(fā)的入門(mén)指引,來(lái)自于IBM官方網(wǎng)站技術(shù)文檔,需要的朋友可以參考下2015-04-04python os.path.isfile()因參數(shù)問(wèn)題判斷錯(cuò)誤的解決
今天小編就為大家分享一篇python os.path.isfile()因參數(shù)問(wèn)題判斷錯(cuò)誤的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11Django+uni-app實(shí)現(xiàn)數(shù)據(jù)通信中的請(qǐng)求跨域的示例代碼
這篇文章主要介紹了Django+uni-app實(shí)現(xiàn)數(shù)據(jù)通信中的請(qǐng)求跨域的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10