gpt4 book ai didi

python - 与复数相关的点积

转载 作者:行者123 更新时间:2023-12-05 06:14:31 29 4
gpt4 key购买 nike

好吧,这个问题可能有一个非常简单的答案,但我已经搜索了很长一段时间但没有运气......

我想得到复平面空间中 2 个复数的点积。然而,np.dot 和 np.vdot 都给出了错误的结果。

我想做的事的例子:

a = 1+1j
b = 1-1j
dot(a,b) == 0

我实际得到的:

np.dot(a,b) == 2+0j
np.vdot(a,b) == 0-2j
np.conj(a)*b == 0-2j

我能够使用这个相当笨拙的表达式(为便于阅读而编辑)得到我想要的东西:

a.real*b.real + a.imag*b.imag

但我很惊讶没有找到一个好的 ufunc 来做这件事。它不存在吗?我没想到必须自己编写 ufunc 来向量化这种常见操作。

我在这里的部分担忧是,我的表达式似乎做了很多额外的工作来提取实部/虚部,而实际上它们应该已经在相邻的内存位置(考虑到 a、b 实际上已经组合在 a数据类型,例如 complex64)。这有可能导致相当严重的减速。

** 编辑

使用 Numba 我最终定义了一个 ufunc:

@vectorize
def cdot(a, b):
return (a.real*b.real + a.imag*b.imag)

这使我能够正确关联复杂数据。这是帮助我的人的相关图片!

enter image description here

最佳答案

对于数组和 np.complex 标量但不是普通的 python complex 数字,您可以视播到 float 。例如:

a = np.exp(1j*np.arange(4))
b = np.exp(-1j*np.arange(4))
a
# array([ 1. +0.j , 0.54030231+0.84147098j,
# -0.41614684+0.90929743j, -0.9899925 +0.14112001j])
b
# array([ 1. -0.j , 0.54030231-0.84147098j,
# -0.41614684-0.90929743j, -0.9899925 -0.14112001j])
ar = a[...,None].view(float)
br = b[...,None].view(float)
ar
# array([[ 1. , 0. ],
# [ 0.54030231, 0.84147098],
# [-0.41614684, 0.90929743],
# [-0.9899925 , 0.14112001]])
br
# array([[ 1. , -0. ],
# [ 0.54030231, -0.84147098],
# [-0.41614684, -0.90929743],
# [-0.9899925 , -0.14112001]])

现在,例如,所有成对的点积:

np.inner(ar,br)
# array([[ 1. , 0.54030231, -0.41614684, -0.9899925 ],
# [ 0.54030231, -0.41614684, -0.9899925 , -0.65364362],
# [-0.41614684, -0.9899925 , -0.65364362, 0.28366219],
# [-0.9899925 , -0.65364362, 0.28366219, 0.96017029]])

关于python - 与复数相关的点积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62856888/

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