【问题标题】:Assigning real and imaginary parts of a complex array from two arrays containing the two parts - Python从包含两个部分的两个数组中分配复数数组的实部和虚部 - Python
【发布时间】:2015-05-18 12:08:31
【问题描述】:

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

【问题讨论】:

标签: python arrays numpy complex-numbers


【解决方案1】:

@Ffisegydd(以及@jonsharpe 在评论中)的建议很好。看看这是否适合你。

在这里,我只是指出 arrayrealimag 属性是可写的,并且矢量化赋值有效,因此您可以将代码简化为

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】:

    你只是这样做

    field_in_k_space_TOTAL = field_in_k_space_REAL + 1j*field_in_k_space_IMAGINARY
    

    很难做任何更简单的事情。 :)

    【讨论】:

      【解决方案3】:

      您不能分配 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)
      

      【讨论】:

      • 或者如果field_imag 还不是虚构的,field_real + (field_imag * 1j)
      【解决方案4】:

      只要你的数据类型兼容,你可以这样做:

      field_in_k_space_TOTAL = np.hstack((field_in_k_space_REAL[:,None], field_in_k_space_IMAGINARY[:,None])).ravel().view(np.complex)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-08-26
        • 2014-12-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-26
        相关资源
        最近更新 更多