NumPy如何对复数矩阵进行乘法运算?

3

我一直在努力弄清楚 NumPy 复数矩阵乘法背后的算法:

import numpy as np

A = np.array([[17.+0.j, -3.+0.j],
              [-7.+0.j,  1.+0.j]])

B = np.array([[ 60.+0.j,  -4.+0.j],
              [-12.+0.j,   0.+0.j]])

print(A * B)

它的输出为:

[[1020.+0.j   12.-0.j]
 [  84.-0.j    0.+0.j]]

标准矩阵乘法得到的结果非常不同,可以通过以下数字看出来,所以我想知道NumPy究竟是做了什么:

[[1056.+0.j  -68.+0.j]
 [-432.+0.j   28.+0.j]]

我一直在尝试使用 for 循环来重现他们的乘法算法,但我还没有找到答案。有什么提示吗?


* 表示逐元素相乘,你可能需要使用 numpy.matmul() - AMC
@AMC 不是的。在这种情况下,它在背后使用了 np.multiply() - karlphillip
我有点困惑,你指的是什么? - AMC
问题是关于NumPy在两个复数矩阵之间进行何种类型的乘法。答案是np.multiply()。另外,请不要再次删除标签。 - karlphillip
这个问题询问了NumPy在两个复数矩阵之间进行什么类型的乘法。答案是np.multiply()。虽然我认为当涉及到ndarrays时,这总是正确的。这导致了一些与旧的nump.matrix类混淆的情况,例如请参见https://dev59.com/PW865IYBdhLWcg3wSMkw。 - AMC
2个回答

4

当你计算 A*B 时,实际上是对矩阵逐元素相乘,这就是所谓的哈达玛积。这不是矩阵乘积。例如,(17.+0.j) * (60.+0.j) = 1020.+0.j,这是输出中的第一个元素。要进行矩阵乘法,请使用 np.dot 或简单地使用 @ 运算符,即 A@B


还有numpy.matmul,可以代替@运算符使用,当两个数组都是2-D时,它们是推荐的解决方案。 - AMC
正确,逐元素乘法是这个问题的答案。可以使用np.multiply()实现。 - karlphillip

1
我找到了!看起来NumPy使用np.multiply()(逐元素乘法),因此结果不同。
以下是使用for循环的这个函数的一个简单实现:
def np_multiply(X, Y):
    height = X.shape[0]
    width = X.shape[1]
    output = np.empty((height, width), dtype=np.complex128)

    for i in range(height):
        for j in range(width):
            output[i,j] = X[i, j] * Y[i, j]

    return output

这篇文章有一个关于其性能的有趣讨论。


不,不在这种特定情况下,numpy总是使用*进行逐元素乘法。唯一的例外是现在已经弃用的np.matrix类。 - MaxNoe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接