我有两个数组field_in_k_space_REAL
和field_in_k_space_IMAGINARY
,它们分别包含我想要创建的复数数组field_in_k_space_TOTAL
的实部和虚部。为什么以下分配不起作用,产生错误
AttributeError: attribute 'real' of 'numpy.generic' objects is not writable
field_in_k_space_TOTAL = zeros(n, complex)
for i in range(n):
field_in_k_space_TOTAL[i].real = field_in_k_space_REAL[i]
field_in_k_space_TOTAL[i].imag = field_in_k_space_IMAGINARY[i]
答案 0 :(得分:2)
您无法指定numpy元素的特定实部和虚部。您必须创建一个中间值,然后将其分配给field_total
,例如:
for i in range(n):
x = field_in_k_space_REAL[i] + field_in_k_space_IMAGINARY[i]
field_in_k_space_TOTAL[i] = x
但这会很慢而且很麻烦。相反,为什么不将两个阵列加在一起并使用矢量化?我可以承诺你,它会更快。
import numpy as np
# Note: dropping the long names.
field_real = np.array([0, 10, 20, 30])
field_imag = np.array([0j, 1j, 2j, 3j])
field_total = field_real + field_imag
print(field_total)
# [ 0.+0.j 10.+1.j 20.+2.j 30.+3.j]
如果field_imag
是要转换为虚数的实数数组(如原始示例中所示),则以下代码将起作用(感谢jonrsharpe的注释)。
field_real = np.array([0, 10, 20, 30])
field_imag = np.array([0, 1, 2, 3])
field_total = field_real + (field_imag * 1j)
答案 1 :(得分:1)
@Ffisegydd(及@jonsharpe在评论中)的建议很好。看看它是否适合你。
在这里,我只想指出数组的real
和imag
属性是可写的,矢量化赋值是有效的,因此您可以简化代码到
field_in_k_space_TOTAL = zeros(n, complex)
field_in_k_space_TOTAL.real = field_in_k_space_REAL
field_in_k_space_TOTAL.imag = field_in_k_space_IMAGINARY
答案 2 :(得分:0)
您只需
field_in_k_space_TOTAL = field_in_k_space_REAL + 1j*field_in_k_space_IMAGINARY
很难做更简单的事情。 :)
答案 3 :(得分:0)
如果您的数据类型兼容,您可以执行以下操作:
field_in_k_space_TOTAL = np.hstack((field_in_k_space_REAL[:,None], field_in_k_space_IMAGINARY[:,None])).ravel().view(np.complex)