使用fx

In [173]: f
Out[173]: array(1387)

In [174]: x
Out[174]: array([ 20404266.1330007])


计算并比较exponent1exponent2

exponent1计算如下:

In [183]: exponent1 = 1j * 2 * np.pi * f[..., np.newaxis, np.newaxis] * x


exponent2计算如下:

In [186]: exponent2 = np.array([[[ 1.+0.j]]])

In [187]: exponent2 *= x[np.newaxis, ...]

In [188]: exponent2 *= f[..., np.newaxis, np.newaxis]

In [192]: exponent2 *= 1j * 2 * np.pi


exponent1exponent2接近:

In [195]: np.allclose(exponent1, exponent2)
Out[195]: True


但是它们的指数不是:

In [196]: np.allclose(np.exp(exponent1), np.exp(exponent2))
Out[196]: False


有没有办法使它们的指数也接近?我希望后者更接近前者,因为

    In [198]: np.allclose(np.exp(exponent1), np.exp(1j * 2 * np.pi * 1387 * 20404266.1330007))
Out[198]: True

最佳答案

您的问题是有限的精度,并且如前所述,您对此无能为力。

在您的问题中,您正在计算2 * pi * f * x。因为这出现在周期为2 * pi(复指数)的函数中,所以f * x的唯一有效部分是小数点后的数字。换句话说,f * x中的信息仅包含在间隔[0,1)中的值中,因此我们可以认为确实需要计算f * x模1.0。

如果我们查看您提供的值,就会发现
f * x = 28300717126.4719(73)
我在括号中的第15个数字之后加上了“多余”的数字。 (大约可以看到15位数字的精度,如果您愿意的话,您可以更加小心,但这足以使您明白这一点。)因此,我们看到我们只计算f * x到4位有效数字。

如果现在比较您在问题中计算出的值,我们会发现

exponent1 = 177818650031.694(37)
exponent2 = 177818650031.694(4)


在这里我再次使用括号来表示多余的数字。我们看到这些价值观完全符合我们的预期。对于指数版本,我们对这些值取模2 * pi感兴趣,

exponent1%(2*pi) = 2.965(4796216371864)
exponent2%(2*pi) = 2.965(5101392153114)


现在,括号中的数字是我们期望的4个有效数字以外的数字。同样,完全符合我们所期望的水平。除非x和f的计算方式不能使所有这些多余的不必要的数字“浪费”我们的精度,否则我们无法做得更好。

关于python - 如何在这两个numpy数组过程中保持相同的精度?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17930148/

10-12 22:11