6

我正在使用numpy.matrix. 如果我添加一个3x3带有1x33x1向量的矩阵,我会得到一个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]])
4

2 回答 2

9

这称为“广播”。从手册

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

于 2013-04-01T13:30:53.530 回答
5

如果您确实希望将向量添加到矩阵中,您可以通过选择它应该去的地方来做到这一点:

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返回 anndarray而不是 a 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.]])
于 2013-04-01T13:55:06.223 回答