【问题标题】:How does NumPy multiply matrices of complex numbers?NumPy 如何将复数矩阵相乘?
【发布时间】:2020-08-27 09:54:17
【问题描述】:

我一直在尝试找出 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]]

standard matrix multiplication 的结果非常不同,如下面的数字所示,所以我想知道 NumPy 到底是做什么的:

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

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

【问题讨论】:

  • * 是逐元素乘法,您可能正在寻找numpy.matmul()
  • @AMC 不。在这种情况下,它在我们背后使用np.multiply()
  • 我一头雾水,你指的是什么?
  • 问题询问 NumPy 在两个复数矩阵之间进行什么类型的乘法运算。答案是np.multipy()。另外,请不要再次删除标签。
  • 问题是 NumPy 在两个复数矩阵之间进行什么类型的乘法运算。答案是np.multiply() 确实如此,尽管我相信在涉及 ndarray 时总是如此。这会导致与旧的 nump.matrix 类混淆,例如参见 stackoverflow.com/questions/3890621/…

标签: python numpy matrix complex-numbers


【解决方案1】:

当您计算 A*B 时,它实际上是将矩阵元素相乘,得到所谓的 hadamard 积。这不是马特穆尔。例如(17.+0.j) * (60.+0.j) = 1020.+0.j,它是输出中的第一个元素。对于矩阵乘法,使用np.dot 或简单地使用@ 运算符,即A@B

【讨论】:

  • 还有numpy.matmul,可以用来代替@操作符,当两个数组都是二维的时候推荐使用。
  • 正确,元素乘法是这个问题的答案。这可以通过np.multiply() 来实现。
【解决方案2】:

找到了!似乎 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

This post 对其性能进行了有趣的讨论。

【讨论】:

  • 不,不是在这个特定场景下,numpy 总是使用元素乘法与*。唯一的例外是现已弃用的 np.matrix 类。
猜你喜欢
  • 2021-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-29
  • 1970-01-01
  • 2020-07-18
  • 2012-08-04
  • 1970-01-01
相关资源
最近更新 更多