从包含两个部分的两个数组中分配复杂数组的实部和虚部 - Python

时间:2015-03-16 11:32:39

标签: python arrays numpy complex-numbers

我有两个数组field_in_k_space_REALfield_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]

4 个答案:

答案 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在评论中)的建议很好。看看它是否适合你。

在这里,我只想指出数组realimag属性是可写的,矢量化赋值是有效的,因此您可以简化代码到

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)