【问题标题】:Assigning complex values to numpy arrays?将复杂值分配给numpy数组?
【发布时间】:2014-02-25 14:17:56
【问题描述】:

这给出了预期的结果

x = random.rand(1) + random.rand(1)*1j
print x.dtype
print x, x.real, x.imag

这行得通

C = zeros((2,2),dtype=complex)
C[0,0] = 1+1j
print C

但是如果我们把它改成

C[0,0] = 1+1j + x

我得到“TypeError: can't convert complex to float”。

如果我们现在省略显式的dtype = complex,我会得到“ValueError: setting an array element with a sequence”。

有人可以解释发生了什么,以及如何做到这一点而不会出错吗?我迷路了。

【问题讨论】:

    标签: python arrays numpy


    【解决方案1】:

    实际上,我提出的解决方案都没有(Python 2.7.6、NumPy 1.8.2)。 但我发现,将 dtypecomplex(标准 Python 库)更改为 numpy.complex_ 可能会有所帮助:

    >>> import numpy as np
    >>> x = 1 + 2 * 1j
    >>> C = np.zeros((2,2),dtype=np.complex_)
    >>> C
    array([[ 0.+0.j,  0.+0.j],
           [ 0.+0.j,  0.+0.j]])
    >>> C[0,0] = 1+1j + x
    >>> C
    array([[ 2.+3.j,  0.+0.j],
           [ 0.+0.j,  0.+0.j]])
    

    【讨论】:

      【解决方案2】:

      要将复杂的xx + something 插入C,显然需要将其视为一个数组,因此要么对x 进行索引,要么将其分配给C 的切片:

      >>> C
      array([[ 0.+0.j,  0.+0.j],
             [ 0.+0.j,  0.+0.j]])
      >>> C[0, 0:1] = x
      >>> C
      array([[ 0.47229555+0.7957525j,  0.00000000+0.j       ],
             [ 0.00000000+0.j       ,  0.00000000+0.j       ]])
      >>> C[1, 1] = x[0] + 1+1j
      >>> C
      array([[ 0.47229555+0.7957525j,  0.00000000+0.j       ],
             [ 0.00000000+0.j       ,  1.47229555+1.7957525j]])
      

      NumPy 似乎没有正确处理这种情况。考虑提交错误报告。

      【讨论】:

      • 但是为什么a=np.arange(4).reshape((2,2)); b=np.array([100]); a[0,0]=b没有给出这样的错误呢?
      • @zhangxaochen 好 Q,也许复杂数组的行为比我更糟糕。我从不使用那些:)
      • 有趣。 C[0,0] = random.rand(1) 很好,但 C[0,0] = random.rand(1)+random.rand(1)*1j 不是。为什么x加上虚部就变成了数组?我以为复数是 python 中的一种原生数据类型,而不仅仅是通过数组实现的?
      • @gibson random.rand(1) 是一个数组。
      • @larsmans 如果是这种情况,C[0,0] = random.rand(1) 应该不起作用,但它确实起作用。我还是一头雾水。
      【解决方案3】:

      我使用astype 将类型更改为复杂,它适用于我的情况(Python 3),尽管我不确定这是否是最好的方法。一个例子:

      import numpy as np
      c2 = np.empty([2,2]).astype(complex)
      c2[0] = 5j+2
      

      【讨论】:

        【解决方案4】:

        例如:

        x = 1.0
        y = 1.5
        

        C[i,j] = 复数(x, y)

        【讨论】:

          猜你喜欢
          • 2020-09-01
          • 2017-06-16
          • 1970-01-01
          • 2021-12-17
          • 1970-01-01
          • 2020-11-01
          • 2013-08-28
          • 2017-01-29
          • 1970-01-01
          相关资源
          最近更新 更多