Python 为numpy数组指定复杂值?
这给出了预期的结果Python 为numpy数组指定复杂值?,python,arrays,numpy,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:使用序列设
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:使用序列设置数组元素”
有人能解释一下发生了什么,以及如何做到这一点而不出错吗?我迷路了。要在
C
中插入复杂的x
或x+某物
,显然需要将其视为一个数组,因此要么将其索引到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没有正确处理这个案子。考虑提交一个bug报告。 < P>实际上,在我的例子中没有提出的解决方案(Python 2.7.6,NoMP1.1.2)。 但我发现,将
dtype
从complex
(标准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]])
我曾经将类型更改为complex,在我的例子(Python3)中它也能工作,尽管我不确定这是否是最好的方法。一个例子:
import numpy as np
c2 = np.empty([2,2]).astype(complex)
c2[0] = 5j+2
但是为什么a=np.arange(4).重塑((2,2));b=np.数组([100]);a[0,0]=b
不会出现这样的错误吗?@zhangxaochen Good Q,也许复杂数组的行为比我想象的还要糟糕。我从不使用这些:)有趣C[0,0]=random.rand(1)
可以,但是C[0,0]=random.rand(1)+random.rand(1)*1j
不行。为什么当我们把虚部加进去时,x
会变成一个数组?我认为复数是python中的一种原生数据类型,不仅仅是通过数组实现的?@gibsonrandom.rand(1)
是一个数组。@larsmans如果是这样的话,C[0,0]=random.rand(1)
应该不起作用,但它确实起作用。我还是很困惑。