繁体   English   中英

当使用*关于numpy.array和numpy.matrix时

[英]when use * about numpy.array and numpy.matrix

我有两个numpy数组:

a = np.array([1, 2, 3]).reshape(3, 1)
b = np.array([4, 5]).reshape(2,1)

当我使用a*bT ,我在想一个错误的输出,因为它们的形状有所不同(使用*对数组执行逐元素乘法)。 但是结果返回矩阵乘法,如下所示:

[[ 4, 5],
 [ 8, 10],
 [12, 15]]

# this shape is (3, 2)

为什么会这样工作?

您的a * bT是元素乘法,并且由于broadcasting而起作用。 加法和许多其他二进制操作都可以使用这对形状。

a是(3,1)。 bT为(1,2)。 广播将(3,1)与(1,2)组合在一起产生(3,2)。 调整大小为1的尺寸以匹配其他非零尺寸。

除非使用np.matrix制作数组, np.matrix *不会执行数学matrix multiplication np.dot用于执行该操作( @np.einsum也可以执行此操作)。

通过这种特殊的形状组合, dot积是相同的。 np.outer(a,b)也会产生这个outer product数学outer product np.dota的最后一个维度与bT的第二个维度匹配到最后一个维度。 在这种情况下,它们都是1.共享维度具有多个项目时, dot会更有趣,从而产生熟悉的sum of products

In [5]: np.dot(a, b.T)
Out[5]: 
array([[ 4,  5],
       [ 8, 10],
       [12, 15]])

“外部”添加:

In [3]: a + b.T
Out[3]: 
array([[5, 6],
       [6, 7],
       [7, 8]])

像这样查看ab可能会有所帮助:

In [7]: a
Out[7]: 
array([[1],
       [2],
       [3]])
In [8]: b
Out[8]: 
array([[4],
       [5]])
In [9]: b.T
Out[9]: array([[4, 5]])

我通常不使用matrix来谈论numpy数组,除非它们是使用np.matrix创建的,或更常见的是scipy.sparse numpy数组可以为0d,1d,2d或更高。 我比名字更注重形状。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM