首页 文章

python numpy ValueError:操作数无法与形状一起广播

提问于
浏览
70

在numpy中,我有两个“数组”,X是(m,n),y是向量(n,1)

运用

X*y

我收到了错误

ValueError: operands could not be broadcast together with shapes (97,2) (2,1)

当(97,2)x(2,1)显然是一个合法的矩阵运算,应该给我一个(97,1)向量

编辑:

我已使用_1339616更正了此问题,但原始问题仍然存在 .

4 回答

  • 52

    dot 是矩阵乘法,但 * 做了其他事情 .

    我们有两个数组:

    • X ,形状(97,2)

    • y ,形状(2,1)

    使用Numpy数组,操作

    X * y
    

    以元素方式完成,但可以在一个或多个维度中扩展一个或两个值以使它们兼容 . 此操作称为广播 . 尺寸为1或缺少尺寸的尺寸可用于广播 .

    在上面的示例中,尺寸不兼容,因为:

    97   2
     2   1
    

    这里第一维(97和2)中存在冲突的数字 . 这就是上面的ValueError所抱怨的 . 第二个维度是可以的,因为数字1不与任何东西冲突 .

    有关广播规则的更多信息:http://docs.scipy.org/doc/numpy/user/basics.broadcasting.html

    (请注意,如果 Xy 的类型为 numpy.matrix ,那么星号可以用作矩阵乘法 . 我的建议是远离 numpy.matrix ,它往往比简化事情复杂化 . )

    您的数组应该没问题 numpy.dot ;如果你在 numpy.dot 上收到错误,你必须有其他一些错误 . 如果 numpy.dot 的形状错误,则会出现另外的异常:

    ValueError: matrices are not aligned
    

    如果您仍然收到此错误,请发布问题的最小示例 . 使用与您相似的数组的示例乘法成功:

    In [1]: import numpy
    
    In [2]: numpy.dot(numpy.ones([97, 2]), numpy.ones([2, 1])).shape
    Out[2]: (97, 1)
    
  • 1

    Per Wes McKinney的Python for Data Analysis

    广播规则:如果对于每个尾随维度(即,从结尾开始),轴长度匹配或者如果长度为1,则两个阵列可用于广播 . 然后对缺失和/或长度执行广播1个尺寸 .

    换句话说,如果你试图乘以两个矩阵(在线性代数意义上),那么你想要 X.dot(y) 但是如果你试图将矩阵 y 中的标量广播到 X 那么你需要执行 X * y.T .

    Example:

    >>> import numpy as np
    >>>
    >>> X = np.arange(8).reshape(4, 2)
    >>> y = np.arange(2).reshape(1, 2)  # create a 1x2 matrix
    >>> X * y
    array([[0,1],
           [0,3],
           [0,5],
           [0,7]])
    
  • 23

    这可能是点积中没有出现错误,但之后 . 例如试试这个

    a = np.random.randn(12,1)
    b = np.random.randn(1,5)
    c = np.random.randn(5,12)
    d = np.dot(a,b) * c
    

    np.dot(a,b)没问题;但是np.dot(a,b)* c显然是错误的(12x1 X 1x5 = 12x5,它不能在元素方面乘以5x12)但是numpy会给你

    ValueError: operands could not be broadcast together with shapes (12,1) (1,5)
    

    这个错误具有误导性;但是那条线上有一个问题 .

  • 8

    使用np.mat(x)* np.mat(y),这将起作用 .

相关问题