1. 程式人生 > 其它 >numpy不同階數張量相加問題(broadcast)

numpy不同階數張量相加問題(broadcast)

技術標籤:mathPythonML

設有 [公式] 階張量 [公式] , [公式] 階張量 [公式] 。如果 [公式][公式] 的最後 [公式] 個維度相等。且其中一個張量,不妨設為 [公式] ,的前 [公式] 個都等於1或者 [公式] 。則這兩個張量可以進行有效的相加。就好比一個低階的張量加到高階的張量的每個元素上去。

最典型的有樣本資料的去中心化操作, [公式][公式] 是資料向量(1階張量),而 [公式] 則是標量(0階張量),是一個更高階張量的每個元素減去低階張量的操作,而每個元素需要與低階張量有相同的形狀(shape)。而最終相加後的到的張量的階數是相對高階張量的階數。

例子:

import numpy as np

2階張量+3階張量

x = np.array([[1,2],
              [3,4],
              [5,6],
              [7,8]]) # (4,2), 2階張量
y = np.array([[[2,1]]]) # (1,1,2), 3階張量
x + y # (1,4,2), 3階張量

3階張量+2階張量

x = np.array([[[1,2],
               [3,4]],
              [[5,6],
               [7,8]]]) # (2,2,2), 三階張量
y = np.array([[2,1],
              [2,1]]) # (2,2),  2階張量
x+y # (2,2,2), 3階張量

對於一般的資料表+欄位記錄來看,以下兩個加法操作是等價的:

x = np.array([[1,2],
              [3,4],
              [5,6],
              [7,8]]) # (4,2), 2階張量
# 第一個加法操作:資料表x+矩陣(2階張量)表示的一條記錄
y = np.array([[2,1]]) # (1,2), 2階張量,第一個維度必須為1
x + y # (4,2),2階張量

第二個加法操作:資料表x加+向量(1階張量)

y = np.array([2,1]) # (2,), 1階張量
x + y # (4,2),2階張量


最後注意一點,numpy多維陣列ndarray的相加是為了方便資料的運算。而python原生list的相加則是list的合併,所以二者加法的思路是不一樣的。