在玩了两个小时的“打鼹鼠”游戏后,我放弃了:我想很好地打印出FFT的结果,抑制所有由数值误差产生的“几乎”实值元素。在
第一次尝试:
import numpy as np
n = np.arange(10)
x = np.sin(np.pi * n / 5)
X = np.fft.fft(x)
print(np.real_if_close(X))
这行不通;我猜只有当所有元素都“接近”实数时,虚部才会被抑制(否则数组中的数据类型将不相同)。这是对的吗?在
下一次尝试使用循环有效,但格式不好:
^{pr2}$所以我尝试使用打印格式:
for i in range(10):
print("{0:5.5g}".format(X[i]))
它起作用了,但现在想象中的小部分又回来了。尝试合并这两种尝试都失败了,并出现了臭名昭著的“non-empty format string passed to object.__format__
”错误(我使用的是python3.5):
for i in range(10):
print("{0:g}".format(np.real_if_close(X[i])))
有人能解释一下这种行为吗?或许可以提出一个解决方案。。。在
数组是类型定义的(dtype),因此,如果有一个只有一个复数值的numpy数组,那么该类型将是复杂的,因此所有值都存储为复数。在
如果只是打印值,那么应该使用列表而不是numpy数组或简单的循环。X2列表给出了自制的解决方案。如果你真的想用real-unu-If-close,那么你应该使用努比·阿斯卡拉转换类型数字阵列以“:g”格式理解的标量值。在
相关问题 更多 >
编程相关推荐