设有 阶张量
,
阶张量
。如果
和
的最后
个维度相等。且其中一个张量,不妨设为
,的前
个都等于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的合并,所以二者加法的思路是不一样的。