溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Numpy中廣播原則的示例分析

發(fā)布時(shí)間:2021-08-21 14:16:46 來(lái)源:億速云 閱讀:109 作者:小新 欄目:開發(fā)技術(shù)

這篇文章給大家分享的是有關(guān)Numpy中廣播原則的示例分析的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來(lái)看看吧。

廣播的原則

如果兩個(gè)數(shù)組的后緣維度(從末尾開始算起的維度)的軸長(zhǎng)度相符或其中一方的長(zhǎng)度為1,則認(rèn)為它們是廣播兼容的。廣播會(huì)在缺失維度和(或)軸長(zhǎng)度為1的維度上進(jìn)行。

在上面的對(duì)arr每一列減去列平均值的例子中,arr的后緣維度為3,arr.mean(0)后緣維度也是3,滿足軸長(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ù)組的后緣維度(從末尾開始算起的維度)的軸長(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)算的。

感謝各位的閱讀!關(guān)于“Numpy中廣播原則的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI