复数相关的点积

2024-09-28 03:24:17 发布

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

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

我想得到复平面空间中两个复数的点积。然而,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实际上已经组合在类似complex64的数据类型中)。这有可能导致相当严重的经济放缓

**编辑

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

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

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

enter image description here


Tags: 答案编辑示例表达式错误np空间real
1条回答
网友
1楼 · 发布于 2024-09-28 03:24:17

对于数组和np.complex标量,而不是普通python complex数字,您可以将viewcast转换为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]])

相关问题 更多 >

    热门问题