numpy不同階數張量相加問題(broadcast)
阿新 • • 發佈:2021-01-22
設有 階張量 , 階張量 。如果 和 的最後 個維度相等。且其中一個張量,不妨設為 ,的前 個都等於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的合併,所以二者加法的思路是不一樣的。