我正在使用numpy.matrix
。如果我使用3x3
或1x3
向量添加3x1
矩阵,我会得到一个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]])
答案 0 :(得分:9)
这称为“广播”。来自manual:
术语广播描述了numpy如何在算术运算期间处理具有不同形状的数组。受某些约束的影响,较小的阵列在较大的阵列上“广播”,以便它们具有兼容的形状。广播提供了一种矢量化数组操作的方法,以便在C而不是Python中进行循环。它可以在不制作不必要的数据副本的情况下实现这一点,并且通常会导致高效的算然而,有些情况下广播是一个坏主意,因为它会导致内存使用效率低下,从而减慢计算速度。
答案 1 :(得分: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
会返回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.]])