【问题标题】:NumPy matrix plus column vectorNumPy 矩阵加列向量
【发布时间】:2013-03-22 14:00:58
【问题描述】:

我正在使用numpy.matrix。如果我添加一个带有1x33x1 向量的3x3 矩阵,我会得到一个3x3 矩阵。

这不应该是undefined吗? 如果不是,对此有何解释?

例子:

a = np.matrix('1 1 1; 1 1 1; 1 1 1')
b = np.matrix('1 1 1')
a + b #or a + np.transpose(b)

输出:

matrix([[2, 2, 2],
        [2, 2, 2],
        [2, 2, 2]])

【问题讨论】:

    标签: python vector matrix numpy linear-algebra


    【解决方案1】:

    这称为“广播”。来自manual

    术语广播描述了 numpy 在算术运算期间如何处理具有不同形状的数组。在某些约束下,较小的阵列在较大的阵列上“广播”,以便它们具有兼容的形状。广播提供了一种向量化数组操作的方法,以便循环在 C 而不是 Python 中发生。它在不制作不必要的数据副本的情况下做到这一点,并且通常会导致高效的算法实现。但是,在某些情况下,广播不是一个好主意,因为它会导致内存使用效率低下,从而减慢计算速度。

    【讨论】:

    • 谢谢你的解释。还没有理解这个概念,尽管错误消息已经指出了它:“ValueError:操作数不能与形状一起广播......”
    【解决方案2】:

    如果您确实希望将向量添加到矩阵中,您可以通过选择它的位置来实现:

    In [155]: ma = np.matrix(
         ...:     [[ 1.,  1.,  1.],
         ...:      [ 1.,  1.,  1.],
         ...:      [ 1.,  1.,  1.]])
    
    In [156]: mb = np.matrix([[1,2,3]])
    
    In [157]: ma[1] += mb # second row
    
    In [158]: ma
    Out[158]: 
    matrix([[ 1.,  1.,  1.],
            [ 2.,  3.,  4.],
            [ 1.,  1.,  1.]])
    
    In [159]: ma[:,1] += mb.T # second column
    
    In [160]: ma
    Out[160]: 
    matrix([[ 1.,  2.,  1.],
            [ 2.,  5.,  4.],
            [ 1.,  4.,  1.]])
    

    但我想警告您,您没有按照说明使用numpy.matrix。事实上,您使用的是numpy.ndarray,因为np.ones 返回的是ndarray,而不是matrix

    加法还是一样,但是创建一些矩阵,你会发现它们的行为不同:

    In [161]: ma*mb
    ---------------------------------------------------------------------------
    ValueError                                Traceback (most recent call last)
    
    ValueError: matrices are not aligned
    
    In [162]: mb*ma
    Out[162]: matrix([[ 6.,  6.,  6.]])
    
    In [163]: ma*mb.T
    Out[163]: 
    matrix([[ 6.],
            [ 6.],
            [ 6.]])
    
    In [164]: aa = np.ones((3,3))
    
    In [165]: ab = np.arange(1,4)
    
    In [166]: aa*ab
    Out[166]: 
    array([[ 1.,  2.,  3.],
           [ 1.,  2.,  3.],
           [ 1.,  2.,  3.]])
    
    In [167]: ab*aa
    Out[167]: 
    array([[ 1.,  2.,  3.],
           [ 1.,  2.,  3.],
           [ 1.,  2.,  3.]])
    

    【讨论】:

    • 啊,是的,您对矩阵的看法是正确的。我会纠正我的问题。但是,我的问题是补充,广播似乎在接受的答案中指出。
    • 是的,请这样做;我只是想警告您可能出现的意外行为。
    猜你喜欢
    • 1970-01-01
    • 2017-11-18
    • 2014-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-11
    • 2023-01-11
    • 2016-01-16
    相关资源
    最近更新 更多