gpt4 book ai didi

python - 广播 NumPy 数组时实际发生了什么

转载 作者:行者123 更新时间:2023-12-01 04:57:39 25 4
gpt4 key购买 nike

我正在使用 NumPy,并且编写了简单的函数

>   def euclid_dist(x, y):
... return sqrt((x-y).transpose().dot(x-y))

但是现在当我尝试

> x = arange(1,4).reshape(3,1)
> y = array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]]).transpose()
> z = euclid_dist(x, y)
> z

array([[ 0. , 0. , 0. , 0. ],
[ 0. , 5.19615242, 7.34846923, 9. ],
[ 0. , 7.34846923, 10.39230485, 12.72792206],
[ 0. , 9. , 12.72792206, 15.58845727]])

好吧...所以,对角线上的数字是我想要的,但是其余的呢?刚刚发生了什么?

据我了解,x 被广播,所以它“变成”类似的东西

array([[1, 1, 1, 1],
[2, 2, 2, 2],
[3, 3, 3, 3]])

但是之后会发生什么呢?这显然不是逐元素操作。但是,如果它将函数应用于 x 和 y 的每一对列,那么 z 的所有行(或列)不应该相等(因为“广播 x”的所有列>' 相等)?

显然有一些我不明白的地方,如果有任何澄清,我将不胜感激。

最佳答案

据我了解您的问题,您正在尝试进行按列并行点积。换句话说,对于向量 abcd 的矩阵,您想要采用这个:

[[a1, b1, c1, d1],
[a2, b2, c2, d2],
[a3, b3, c3, d3]]

对此:

[a1 * a1 + a2 * a2 + a3 * a3,
b1 * b1 + b2 * b2 + b3 * b3,
c1 * c1 + c2 * c2 + c3 * c3,
d1 * d1 + d2 * d2 + d3 * d3]

事实上,你对广播的理解看起来还不错。它的 dot 并不按您期望的方式工作——它执行矩阵乘法。所以你会得到以下结果(取决于你如何转置):

>>> sqrt((x - y).T.dot(x - y))
array([[ 11.22497216, 11.22497216, 11.22497216],
[ 11.22497216, 11.22497216, 11.22497216],
[ 11.22497216, 11.22497216, 11.22497216]])
>>> sqrt((x - y).dot((x - y).T))
array([[ 0. , 0. , 0. , 0. ],
[ 0. , 5.19615242, 7.34846923, 9. ],
[ 0. , 7.34846923, 10.39230485, 12.72792206],
[ 0. , 9. , 12.72792206, 15.58845727]])

第二个结果的对角线就是您要寻找的,但是完整的矩阵乘法做了太多额外的工作。粗略地说,这是我通常只获取对角线的方法:

>>> sqrt(((x - y) * (x - y)).sum(axis=1))
array([ 0. , 5.19615242, 10.39230485, 15.58845727])

简而言之,您实际上希望在这种特殊情况下进行广播。

关于python - 广播 NumPy 数组时实际发生了什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27004908/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com