我在使用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'
这是怎么来的,我只是想弄明白
1条答案
按热度按时间b5buobof1#
这个错误来自于
numpy
覆盖函数的事实。在常规Python中,以下两个语句是等效的:然而,对于
numpy
,情况就不是这样了。对于numpy
,区分是创建了一个新数组还是修改了原始数组通常是非常重要的。当你运行
a = a + b
时,它所做的就是创建一个 new 数组并将其存储回a
。当你运行
a += b
时,它会尝试用b
修改 originala
数组。但是,由于a
的类型是float
,而b
的类型是imaginary
,所以这种修改是非法的。