Python 如何使用Numpy矩阵运算一次计算多个样本?

Python 如何使用Numpy矩阵运算一次计算多个样本?,python,numpy,matrix,vectorization,Python,Numpy,Matrix,Vectorization,如何使用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]])

如何使用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)

广播的工作方式是沿着大小为1的轴重复数据,重复次数为使元素操作正常所需的次数。这就是
a.T
的轴1和
b
的轴0所发生的情况。结果的乘积类似。我的建议是将您的所有输入连接到另一个维度,以允许广播沿着现有的两个维度进行

在演示如何做到这一点之前,让我先提一下,如果使用而不是在示例中使用,您会更好<代码>展平生成数据的副本,而
ravel
仅生成视图。由于
a.T*b
无论如何都是一个临时矩阵,因此没有理由复制

沿新维度组合一些数组的最简单方法是。出于几个原因,我建议沿第一维度合并。这是
stack
的默认值,您的结果可以更容易地索引:
d[0]
将是
d
d[1]
将是
d1
,等等。如果您将矩阵乘法添加到管道中,则由于它在最后两个维度上运行,因此将开箱即用

a = np.stack((a0, a1, a2, ..., aN))
b = np.stack((b0, b1, b2, ..., bN))
c = np.stack((c0, c1, c2, ..., cN))
现在
a
b
c
都是三维阵列,第一个维度是测量指标。第二个和第三个对应于原始数组的两个维度

使用此结构,您之前称之为转置的只是交换最后两个维度(因为其中一个维度为1),而散开/展平只是将最后两个维度相乘,例如:

如果在重塑中将其中一个尺寸设置为大小
-1
,它将吸收剩余的尺寸。在本例中,所有数组都有3个元素,因此-1相当于3

ravel
操作转换为3D时,您必须稍微小心。在2D中,
x.ravel()*c.T
在广播之前将
x
隐式转换为1xN数组。在3D中,
x.reformate(3,-1)
创建一个2D 3x27数组,您可以将其乘以
c.reformate(3,-1,1)
,即3x3x1。广播规则表明,实际上是将1x3x1与1x3x27阵列相乘,但确实希望将3x1x27阵列与3x3x1相乘,因此需要明确指定三维“ravel”的所有三个轴


这里有一个带示例数据的IDEOne链接供您使用:

((a.T*b).flatte()*c.T)
您应该缩短代码。…@Wen谢谢,顺便问一下,您知道我的问题的任何解决方案吗?它们对abc或a1b1c1总是相同的值吗\不同的价值观。上述代码代表3个观察结果。(abc、a1b1c1、a2b2c2)。我正试图找到一种更有效的方法,这样当有数千次观察时,我就不需要重复代码数千次。谢谢你的回答,
a.重塑(3,-1,1)
做什么?它会把它变成一个3D物体吗?3是行数吗?1和1怎么样?“干杯!”塞曼说。请参阅更新。另外,请阅读函数的链接。“这些文件应该澄清很多事情。”塞曼说。我还修复了最终表达式中的一个错误。第二次重塑必须明确具有3个轴,而不是2个轴。
d = (a.reshape(N, -1, 1) * b).reshape(N, 1, -1) * c.reshape(N, -1, 1)