x
和y
包含3个维度为1*3的矩阵,
x = np.array([[1, 2, 3], [4,5,6], [1, 2, 3]])
y = np.array([[11, 22, 33], [44,55,66], [11, 22, 33]])
I want to make matrix multiplication between x and y, and hence y should be transposed i.e., each vector in y should be 3*1 and Z should be an array that contains the result of x[0]*y[0]' x[1]*y[1]' x[2]*y[2]'
如何在x
中只转置每个矩阵而不改变它们的顺序?我尝试了x_transposed = x.T
,但它做了不同的事情
2条答案
按热度按时间lh80um4z1#
x = np.array([[1, 2, 3], [4,5,6], [1, 2, 3]])
是一个 * 二维 * 数组,所以你可以说它包含三个形状为(3,)
的 * 向量 *。为了证明这点打印:
要让
x
包含三个形状为(1, 3)
的矩阵,需要它是一个 * 三维 * 数组x = np.array([[[1, 2, 3]], [[4,5,6]], [[1, 2, 3]]])
。现在,上面的相同循环打印:然后,你可以转置这个数组的第二个和第三个轴:
这导致:
要将原始
x
转换为三维数组,您可以在两个现有轴的中间添加一个轴:2skhul332#
我更希望你实际上显示你想要的结果,但我认为你想要的是行对的
dot
乘积:如果你花时间去阅读
np.dot
文档(原始的矩阵乘积函数),你会发现它很乐意将1d数组作为参数。获得相同值的另一种方法:
一行
y
是(3)形状(1d)转置并不会改变任何东西,因为只有一个轴。转置不
add
维度:如果数组是2d,(1,3),转置将使它成为(3,1),一个“列向量”,也可以用以下方法创建:
dot
的两个(3,)产生标量:dot
的(3,)和(3,1)产生一个(1,),数组:(a(1,3)与(3,1)将产生a(1,1))。
dot(x,y.T)
(或使用matmul
运算符),生成一个(3,3)数组,其对角线上有所需的3个值:得到这个“对角线”的一个更好的方法是使用
einsum
,指定尺寸j
是乘积之和:matmul/@
让我们把3维中的第一个当作batch
,所以通过制作数组(3,1,3)和(3,3,1),我们得到一个(3,1,1)结果:(1,1)维度可以是
squeezed
out。对于2d
dot/matmul
,用A的最后一个dim和B的第二个到最后一个dim进行乘积和。