numpy运算符*和dot的工作原理

2024-10-20 03:51:46 发布

您现在位置:Python中文网/ 问答频道 /正文

x = np.array([1,2,3])
y = x[:, np.newaxis]
print(x*y)

output:
[[1 2 3]
 [2 4 6]
 [3 6 9]]

我的问题是,我明白*是元素乘法。x形(3,) y形为(3,1)。我不知道产量是怎么计算出来的。根据我的测试,输出不是 如果我们用x*y或y*x,会有变化。我想这里会发生某种广播,请解释一下 这是怎么回事。你知道吗

另一个问题是

vector_a = np.array([[1, 2, 3], [4, 5, 6]]) 
b = [1,2, 3]
c = np.dot(vector_a, b)

here c value: [14 32] and shape is (2,).

我知道点是矩阵乘法,这里a形是(2,3),b形是(3,)。在这里 同样,广播发生了,我认为输出形状应该是(2,1),但输出形状显示为(2,) 如何计算?这里c=np.dot公司(b,向量a)作为错误抛出

形状(3,)和(2,3)未对齐:3(dim 0)!=2(尺寸0)

这就是为什么广播不适用。(3,)应该变成(3,2),输出应该是形状(3,3)

请解释一下。你知道吗

谢谢你的时间和帮助


Tags: and元素outputherevaluenparraydot
2条回答

在第一种情况下,广播是:

 (3,) * (3,1) => (1,3) * (3,1) => (3,3)

这两条规则是:

1) add leading dimensions as needed to even the number
2) adjust all size 1 dimensions to match the other

至于dot,没有广播;阅读文档了解详细信息。如果两者都是2d,则规则很简单-np.dot(A,B),最后一个A与最后一个B匹配,并通过求和消除。你知道吗

但是1d阵列得到了特殊的处理,这是有充分证据的。你知道吗

(2,3) and (3,) -> the 3's match and sum, leaving the (2,)

np.dot(A,B) 
np.sum(A*B[None,:], axis=1)
(2,3) * (1,3) => (2,3) sum on dim 1) => (2,)

np.matmul/@确实从扩展和压缩的角度描述了它对一维数组的处理。你知道吗

np.matmul(A,b)
(2,3) @ (3,) => (2,3) @ (3,1) => (2,1) => (2,)

np.dot并没有用这些术语来描述事物,尽管效果是一样的。你知道吗

你知道吗数字.dot(a、b、out=无)

两个数组的点积。具体来说

如果a和b都是一维阵列,则它是向量的内积(没有复共轭)。你知道吗

如果a和b都是二维数组,则是矩阵乘法,但最好使用matmul或a@b。你知道吗

如果a或b是0-D(标量),则相当于乘和使用numpy.乘法(a,b)或a*b是首选。你知道吗

如果a是N-D数组,b是1-D数组,则它是a和b的最后一个轴的和积

如果a是N-D数组,b是M-D数组(其中M>;=2),则它是a的最后一个轴与b的第二个到最后一个轴的和积:

np.dot(3, 4) 12

您还可以检查reflink

相关问题 更多 >