带有复数和 += 的 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
数组。但是,由于a
是float
类型,b
是imaginary
类型,所以这种修改是非法的。
我在 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
数组。但是,由于a
是float
类型,b
是imaginary
类型,所以这种修改是非法的。