将复杂值分配给numpy数组?

24

这将给出预期的结果

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:使用序列设置数组元素"的错误。

有人能解释一下发生了什么,以及如何避免出现错误吗?我很困惑。

4个回答

50

实际上,在我的情况下,没有任何提出的解决方案能够奏效(Python 2.7.6,NumPy 1.8.2)。 但是我发现从complex(标准Python库)更改为numpy.complex_dtype可能会有所帮助:

>>> 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]])

6

要将复杂的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
@zhangxaochen 很好的问题,也许复杂数组的行为比我想象中更容易出错。我从来不使用那些 :) - Fred Foo
如果是这样的话,C[0,0] = random.rand(1) 不应该起作用,但它确实起作用了。我仍然感到困惑。 - gibson
@larsmans 好的,至少知道我没有错过什么显而易见的东西。 - gibson
@larmans 感谢您更新初始答案以符合我们发现的内容。我已经提交了一个问题(https://github.com/numpy/numpy/issues/4379),所以我们将看到会发生什么。 - gibson
显示剩余3条评论

2

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

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

0

例如:

x = 1.0
y = 1.5

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接