如何使用Numpy矩阵运算一次计算多个矢量样本?
请参阅下面我提出的代码,' d'是我想要获得的结果。但这只是一个样本。如何计算输出而不重复每个样本的代码或循环遍历每个样本?
a = np.array([[1, 2, 3]])
b = np.array([[1, 2, 3]])
c = np.array([[1, 2, 3]])
d = ((a.T * b).flatten() * c.T)
a1 = np.array([[2, 3, 4]])
b1 = np.array([[2, 3, 4]])
c1 = np.array([[2, 3, 4]])
d1 = ((a1.T * b1).flatten() * c1.T)
a2 = np.array([[3, 4, 5]])
b2 = np.array([[3, 4, 5]])
c2 = np.array([[3, 4, 5]])
d2 = ((a2.T * b2).flatten() * c2.T)
答案 0 :(得分:2)
广播的工作方式是沿着大小轴重复您的数据一次,以使您的元素操作工作。这就是a.T
的轴1和b
的轴0发生的情况。类似于结果的产物。我的建议是将所有输入连接到另一个维度,以允许在现有的两个维度上进行广播。
在展示如何执行此操作之前,我要提一下,在您的示例中,使用ravel
代替flatten
会更好。 flatten
制作数据的副本,而ravel
仅制作视图。由于a.T * b
无论如何都是临时矩阵,因此没有理由制作副本。
将一些数组沿新维度组合的最简单方法是np.stack
。我建议在第一个维度上进行组合,原因有两个。它是stack
的默认设置,您的结果可以更轻松地编入索引:d[0]
将是d
,d[1]
将是d1
等。如果您将矩阵乘法添加到管道中,np.dot
将开箱即用,因为它在最后两个维度上运行。
a = np.stack((a0, a1, a2, ..., aN))
b = np.stack((b0, b1, b2, ..., bN))
c = np.stack((c0, c1, c2, ..., cN))
现在a
,b
和c
都是3D数组,第一维是测量索引。第二个和第三个对应于原始数组的两个维度。
使用这种结构,你之前所谓的转置只是交换最后两个维度(因为其中一个是1),并且raveling / flattening只是将最后两个维度相乘,例如与reshape
:
d = (a.reshape(N, -1, 1) * b).reshape(N, 1, -1) * c.reshape(N, -1, 1)
如果您将其中一个尺寸设置为在重塑中具有尺寸-1
,则它将吸收剩余尺寸。在这种情况下,所有数组都有3个元素,因此-1将等于3。
将ravel
操作转换为3D时,您必须要小心。在2D中,x.ravel() * c.T
在广播之前隐式地将x
转换为1xN阵列。在3D中,x.reshape(3, -1)
创建一个2D 3x27数组,乘以c.reshape(3, -1, 1)
,即3x3x1。广播规则规定您实际上将1x3x27阵列乘以3x3x1,但您确实希望将3x1x27阵列乘以3x3x1,因此您需要为3D" ravel"指定所有三个轴。明确。
以下是IDEOne链接,其中包含您可以使用的示例数据:https://ideone.com/p8vTlx