numpy广播

  • 末尾有彩蛋

广播(Broadcast)是 numpy 对不同形状(shape)的数组进行数值计算的方式, 对数组的算术运算通常在相应的元素上进行。

如果两个数组 a 和 b 形状相同,即满足 a.shape == b.shape,那么 a*b 的结果就是 a 与 b 数组对应位相乘。这要求维数相同,且各维度的长度相同。

实例

import numpy as np a = np.array([1,2,3,4]) b = np.array([10,20,30,40]) c = a * b print (c)

输出结果为:

1
[ 10  40  90 160]

当运算中的 2 个数组的形状不同时,numpy 将自动触发广播机制。如:

实例

1
2
3
import numpy as np    
a = np.array([[ 0, 0, 0], [10,10,10], [20,20,20], [30,30,30]])
b = np.array([1,2,3]) print(a + b)

输出结果为:

1
2
3
4
[[ 1  2  3]
[11 12 13]
[21 22 23]
[31 32 33]]

下面的图片展示了数组 b 如何通过广播来与数组 a 兼容。

img

4x3 的二维数组与长为 3 的一维数组相加,等效于把数组 b 在二维上重复 4 次再运算。

yayay实例

在few-shot gnn任务中,想要计算邻接矩阵A,其公式为:aij = fc(vi-vj)
那么问题来了得到的邻接矩阵是N×N的,则计算的差值矩阵也应该是N×N的。那么该如何高效的计算出来这个差值矩阵。

import numpy as np
N = 10
D = 7
X = np.ones((N,D))
X1 = np.expand_dims(X, axis=0)
X2 = np.expand_dims(X, axis=1)
X_abs = np.abs(X1-X2)
X_abs = np.reshape(X_abs, (N,N,D))
X_T = X_abs 

?????????????????需要考虑一下这个转置问题