Python 复数的不一致表示法

Python 复数的不一致表示法,python,python-2.7,numpy,format,complex-numbers,Python,Python 2.7,Numpy,Format,Complex Numbers,第二次乘法的输出混合了复数的实部和虚部的格式 我使用的代码: import numpy as np tmp1=np.zeros((3,3),dtype='complex64') tmp2=np.zeros((3,3),dtype='complex64') M=np.array([[ 2.29e-03 -5.23e-23j, 1.62e-03 +1.37e-23j, 9.14e-06 +4.84e-03j], [ 1.62e-03 -5.95e-23j, -1.36e-03 +1.

第二次乘法的输出混合了复数的实部和虚部的格式

我使用的代码:

import numpy as np
tmp1=np.zeros((3,3),dtype='complex64')
tmp2=np.zeros((3,3),dtype='complex64')
M=np.array([[  2.29e-03 -5.23e-23j,   1.62e-03 +1.37e-23j,   9.14e-06 +4.84e-03j],
 [  1.62e-03 -5.95e-23j,  -1.36e-03 +1.92e-23j,  -5.29e-06 +2.87e-03j],
 [  9.14e-06 -4.84e-03j,  -5.29e-06 -2.87e-03j,   9.63e-01 -3.11e-03j]])
print 'M'
print M
a=np.diag([1.,1.,1j])
print 'a'
print(a)  
print 'a^+'
b=np.diag([1,1,-1j])
print(b)
tmp1=np.dot(M,a)
print 'tmp1'
print(tmp1)
tmp2=np.dot(b,tmp1)
print 'C'
print(tmp2)
输出为:

M
[[  2.29000000e-03 -5.23000000e-23j   1.62000000e-03 +1.37000000e-23j
    9.14000000e-06 +4.84000000e-03j]
 [  1.62000000e-03 -5.95000000e-23j  -1.36000000e-03 +1.92000000e-23j
   -5.29000000e-06 +2.87000000e-03j]
 [  9.14000000e-06 -4.84000000e-03j  -5.29000000e-06 -2.87000000e-03j
    9.63000000e-01 -3.11000000e-03j]]
a
[[ 1.+0.j  0.+0.j  0.+0.j]
 [ 0.+0.j  1.+0.j  0.+0.j]
 [ 0.+0.j  0.+0.j  0.+1.j]]
a^+
[[ 1.+0.j  0.+0.j  0.+0.j]
 [ 0.+0.j  1.+0.j  0.+0.j]
 [ 0.+0.j  0.+0.j  0.-1.j]]
tmp1
[[  2.29000000e-03 -5.23000000e-23j   1.62000000e-03 +1.37000000e-23j
   -4.84000000e-03 +9.14000000e-06j]
 [  1.62000000e-03 -5.95000000e-23j  -1.36000000e-03 +1.92000000e-23j
   -2.87000000e-03 -5.29000000e-06j]
 [  9.14000000e-06 -4.84000000e-03j  -5.29000000e-06 -2.87000000e-03j
    3.11000000e-03 +9.63000000e-01j]]
C
[[ 0.00229 -5.23000000e-23j  0.00162 +1.37000000e-23j
  -0.00484 +9.14000000e-06j]
 [ 0.00162 -5.95000000e-23j -0.00136 +1.92000000e-23j
  -0.00287 -5.29000000e-06j]
 [-0.00484 -9.14000000e-06j -0.00287 +5.29000000e-06j
   0.96300 -3.11000000e-03j]]

在C语言中,你可以看到实部用十进制表示,虚部用科学表示。知道为什么会这样吗?这是Python(2.7.10)中的一个bug还是一个功能?

除非您指定Python尝试选择最容易理解的数字表示形式,同时尽可能地表示精度,并且不占用太多空间。因此这是意料之中的。

您将看到
numpy
打印功能正在运行,试图以一致但紧凑的方式显示阵列

tmp2
的实部以这种方式打印,因为所有值都可以显示(3位有效数字),而无需使用科学的符号

In [28]: tmp2.real
Out[28]: 
array([[ 0.00229,  0.00162, -0.00484],
       [ 0.00162, -0.00136, -0.00287],
       [-0.00484, -0.00287,  0.963  ]])
复制一个元素,使一个元素小得多,它就会转换为科学符号:

In [29]: tmp3=tmp2.copy()
In [30]: tmp3[2,0]*= 1e-6
In [31]: tmp3.real
Out[31]: 
array([[  2.29000000e-03,   1.62000000e-03,  -4.84000000e-03],
       [  1.62000000e-03,  -1.36000000e-03,  -2.87000000e-03],
       [ -4.84000000e-09,  -2.87000000e-03,   9.63000000e-01]])
In [38]: np.set_printoptions(suppress=True)
In [39]: tmp2
Out[39]: 
array([[ 0.00229-0.j        ,  0.00162+0.j        , -0.00484+0.00000914j],
       [ 0.00162-0.j        , -0.00136+0.j        , -0.00287-0.00000529j],
       [-0.00484-0.00000914j, -0.00287+0.00000529j,  0.96300-0.00311j   ]])
有关控制打印的参数的更多详细信息,请参阅文档

显然,它是分别为实部和虚部选择格式

要阻止所有科学符号,请执行以下操作:

In [29]: tmp3=tmp2.copy()
In [30]: tmp3[2,0]*= 1e-6
In [31]: tmp3.real
Out[31]: 
array([[  2.29000000e-03,   1.62000000e-03,  -4.84000000e-03],
       [  1.62000000e-03,  -1.36000000e-03,  -2.87000000e-03],
       [ -4.84000000e-09,  -2.87000000e-03,   9.63000000e-01]])
In [38]: np.set_printoptions(suppress=True)
In [39]: tmp2
Out[39]: 
array([[ 0.00229-0.j        ,  0.00162+0.j        , -0.00484+0.00000914j],
       [ 0.00162-0.j        , -0.00136+0.j        , -0.00287-0.00000529j],
       [-0.00484-0.00000914j, -0.00287+0.00000529j,  0.96300-0.00311j   ]])

打印
显示主要是为了方便您在代码开发过程中使用。写入文件时,您可能希望使用类似于
savetxt
的函数。有关设置格式的信息,请参见其文档。我相信它专门讨论了处理复数。

由于我在这个数组上执行的变换是酉变换,所以数字的大小不会改变。唯一发生的事情是实部和虚部互换。现在看看tmp1数组,并将其与C进行比较。为什么tmp1中的符号与C中的符号一致?我在你的链接中看不到对此的解释对不起。