如何将2个不同维度的numpy数组相乘

时间:2016-10-26 16:06:13

标签: python arrays numpy matrix

我尝试将2个矩阵x,y乘以形状(41)和(41,6) 因为它应该将单个矩阵广播到多维中的每个箭头

我想这样做:

x*y

但我收到此错误

ValueError: operands could not be broadcast together with shapes (41,6) (41,) 

我有什么想念的吗?

6 个答案:

答案 0 :(得分:2)

广播涉及两个步骤

  • 为所有数组提供相同数量的维度

  • 展开1尺寸以匹配其他数组

使用您的输入

(41,6) (41,)
一个是2d,另一个是1d;广播可以将1d更改为(1, 41),但不会自动向另一个方向展开(41,1)

(41,6) (1,41) 

(41,41)或(6,41)都不匹配。

因此,您需要将y更改为(41,1)或将x更改为(6,41)

x.T*y
x*y[:,None]

当然,我假设您需要逐个元素乘法,而不是np.dot矩阵乘积。

答案 1 :(得分:1)

不完全确定,你想要实现的目标。也许您可以举例说明您的输入和预期输出。一种可能性是:

import numpy as np

x = np.array([[1, 2], [1, 2], [1, 2]])
y = np.array([1, 2, 3])
res = x * np.transpose(np.array([y,]*2))

这会将x的每一列乘以y,因此上面示例的结果为:

array([[1, 2],
       [2, 4],
       [3, 6]])

答案 2 :(得分:1)

你可以尝试一下,它会起作用!

(1)

答案 3 :(得分:0)

取决于您的期望。一个简单的解决方案是:

y*x

那应该给你一个维度矩阵(1,6)。

答案 4 :(得分:0)

如果您希望将维度(n)的X乘以维度(n,m)的Y,则可以考虑此post的答案

提示也可以在Wikipedia中找到:

  

在Python中使用numpy数值库或者sympy符号库,将数组对象乘以a1 * a2会产生Hadamard乘积,但除了矩阵对象之外,m1 * m2将产生矩阵乘积。

简单来说,将其切片到数组并执行x * y,或使用其他路径来满足要求。

答案 5 :(得分:0)

默认情况下,ND数组(例如A)与一维1(B)的乘法是在最后一个轴上执行的,这意味着乘法A * B仅在

下有效

A.shape[-1] == len(B)

要在另一个轴上将A与B相乘而不是-1,一种解决方法是在相乘前后交换A的轴:

要在轴“ axis”上乘以A和B,请使用

C = (A.swapaxes(axis, -1) * B).swapaxes(axis, -1)

示例

A = np.arange(2 * 3 * 4).reshape((2, 3, 4))
B = np.array([0., 1., 2.])

print(A, B)

array([[[ 0.,  0.,  0.,  0.],
        [ 4.,  5.,  6.,  7.],
        [16., 18., 20., 22.]],

       [[ 0.,  0.,  0.,  0.],
        [16., 17., 18., 19.],
        [40., 42., 44., 46.]]])

C = A * B

ValueError: operands could not be broadcast together with shapes (2,3,4) (3,) 

C = (A.swapaxes(1, -1) * B).swapaxes(1, -1)

array([[[ 0.,  0.,  0.,  0.],
        [ 4.,  5.,  6.,  7.],
        [16., 18., 20., 22.]],

       [[ 0.,  0.,  0.,  0.],
        [16., 17., 18., 19.],
        [40., 42., 44., 46.]]])

请注意,A的第一个原始数已乘以0 最后的原始数乘以2