为numpy数组分配复杂值?

时间:2014-02-25 14:17:56

标签: python arrays numpy

这给出了预期的结果

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:无法将复数转换为浮动”。

如果我们现在省略显式dtype = complex,我会得到“ValueError:设置一个带序列的数组元素”。

有人可以解释发生了什么,以及如何做到这一点没有错误?我输了。

3 个答案:

答案 0 :(得分:23)

实际上,在我的案例中没有提出的解决方案(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]])

答案 1 :(得分:4)

要将复杂的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没有正确处理这种情况。考虑提交错误报告。

答案 2 :(得分:0)

我使用astype将类型更改为complex,并且在我的情况下适用(Python 3),尽管我不确定这是否是最佳方法。一个例子:

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