带复数和+=的Numpy

xiozqbni  于 2023-03-30  发布在  其他
关注(0)|答案(1)|浏览(124)

我在使用numpy在python中处理复杂矩阵时发现了一些奇怪的事情。我只会做一个简短的例子来解释它:
这段代码运行得很好:

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'

这是怎么来的,我只是想弄明白

b5buobof

b5buobof1#

这个错误来自于numpy覆盖函数的事实。在常规Python中,以下两个语句是等效的:

a = a + b
a += b

然而,对于numpy,情况就不是这样了。对于numpy,区分是创建了一个新数组还是修改了原始数组通常是非常重要的。
当你运行a = a + b时,它所做的就是创建一个 new 数组并将其存储回a
当你运行a += b时,它会尝试用b修改 originala数组。但是,由于a的类型是float,而b的类型是imaginary,所以这种修改是非法的。

相关问题