带有复数和 += 的 Numpy

Numpy with complex numbers and +=

我在 python 中使用 numpy 处理复杂矩阵时发现了一些奇怪的东西。我将举一个简短的例子来解释它:

此代码运行良好:

import numpy as np

a = np.zeros((2, 2))
b = np.array([[1j, 1j], [1j, 2]])

a = a + b

print(a)

有输出

[[0.+1.j 0.+1.j]
 [0.+1.j 0.+1.j]]

但是,如果我将 a = a + b 更改为 a += b(我通常这样做),就会出现错误。

import numpy as np

a = np.zeros((2, 2))
b = np.array([[1j, 1j], [1j, 1j]])

a += b

print(a)

有错误:

numpy.core._exceptions.UFuncTypeError: Cannot cast ufunc 'add' output from dtype('complex128') to dtype('float64') with casting rule 'same_kind'

这是从哪里来的?我就是想明白。

此错误是由于 numpy 覆盖了函数。在正则Python中,下面两个语句是等价的:

a = a + b
a += b

但是,对于 numpy,情况不是。使用numpy,区分是新建数组还是修改原数组,往往很重要

当你 运行 a = a + b 时,它所做的是创建一个 new 数组并将其存储回 a.

当你 运行 a += b 时,它所做的是尝试用 b 修改 原始 a 数组。但是,由于afloat类型,bimaginary类型,所以这种修改是非法的。