使用复杂和/或实数元素打印格式良好的numpy数组(如果关闭,则为real)

2024-06-23 18:25:28 发布

您现在位置:Python中文网/ 问答频道 /正文

在玩了两个小时的“打鼹鼠”游戏后,我放弃了:我想很好地打印出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])))

有人能解释一下这种行为吗?或许可以提出一个解决方案。。。在


Tags: infftformat游戏元素forcloseif
1条回答
网友
1楼 · 发布于 2024-06-23 18:25:28

数组是类型定义的(dtype),因此,如果有一个只有一个复数值的numpy数组,那么该类型将是复杂的,因此所有值都存储为复数。在

如果只是打印值,那么应该使用列表而不是numpy数组或简单的循环。X2列表给出了自制的解决方案。如果你真的想用real-unu-If-close,那么你应该使用努比·阿斯卡拉转换类型数字阵列以“:g”格式理解的标量值。在

X = [1+1e-14j,1+1e-13j]
eps = np.finfo(float).eps
tol = 100 # tolerance (used in real_if_close)

X2 = [np.real(x) if np.imag(x)<tol*eps else x for x in X]
X3 = [np.asscalar(np.real_if_close(x)) for x in X]

for x in X3:
    print("{:.5g}".format(x))

相关问题 更多 >

    热门问题