Python 使用numpy数组时出现奇怪的结果
对于某些输入,我得到了两个不同的结果,但对于其他输入,则没有。让我用具体的例子来解释。我有以下功能:Python 使用numpy数组时出现奇怪的结果,python,numpy,Python,Numpy,对于某些输入,我得到了两个不同的结果,但对于其他输入,则没有。让我用具体的例子来解释。我有以下功能: In [86]: def f(x, p): ...: n = len(p) ...: tot = 0 ...: for i in range(n): ...: tot += p[i] * x**(n-i-1) ...: return tot p是一个值非常小的数组: In [87]: p Out[87]:
In [86]: def f(x, p):
...: n = len(p)
...: tot = 0
...: for i in range(n):
...: tot += p[i] * x**(n-i-1)
...: return tot
p
是一个值非常小的数组:
In [87]: p
Out[87]:
array([ -3.93107522e-45, 9.17048746e-40, -8.11593366e-35,
3.05584286e-30, -1.06065846e-26, -3.03946945e-21,
1.05944707e-16, -1.56986924e-12, 1.07293061e-08,
-3.22670121e-05, 1.12072912e-01])
现在考虑输出:
In [90]: [f(i, p) for i in range(11, 20)]
Out[90]:
[0.11171927108787173,
0.1116872502272328,
0.1116552507123586,
0.11162327253386167,
0.11159131568235707,
0.11155938014846242,
0.1115274659227979,
0.11149557299598616,
0.11146370135865244]
In [88]: [f(i, p) for i in np.array(range(11, 20))]
Out[88]:
[0.11171927108787173,
0.1116872502272328,
0.1116552507123586,
0.11162327253386167,
0.11159131568235707,
0.11155938014846242,
0.1115274659227979,
0.11149557299598616,
0.11146370135865244]
正如您所看到的,这些输出与它们应该的完全相同。唯一的区别是,在一种情况下,我使用范围(a,b)
,而在另一种情况下,我将该范围转换为numpy数组
但现在,让我们更改范围内的值:
In [91]: [f(i, p) for i in range(50001, 50010)]
Out[91]:
[-0.011943965521167818,
-0.011967640114171604,
-0.011991315947644229,
-0.012014993019120554,
-0.012038671327427961,
-0.012062350870605351,
-0.012086031644648818,
-0.012109713648648865,
-0.012133396879791744]
In [92]: [f(i, p) for i in np.array(range(50001, 50010))]
Out[92]:
[491.26519430165808,
491.32457916465478,
491.38395932037008,
491.38726606180143,
491.44663641006275,
491.50600185375316,
491.56536239249812,
491.56864971072332,
491.6280006336612]
他们甚至都不接近!我错过了一些可笑的简单的东西吗 您忽略了一个事实:普通Python整数是任意精度的,而NumPy整数是固定大小的 这:
NumPy输入溢出。您忽略了一个事实,即普通Python整数是任意精度的,而NumPy整数是固定大小的 这: NumPy输入溢出。错误情况下
x
的f(x,p)
中的值为NumPy.int32
。它们可能溢出。本例中的修复相对简单,将值转换为int
:
tot += p[i] * np.asarray(x).astype(int) ** (n - i - 1)
错误情况下x
的f(x,p)
中的值为numpy.int32
。它们可能溢出。本例中的修复相对简单,将值转换为int
:
tot += p[i] * np.asarray(x).astype(int) ** (n - i - 1)
我懂了。那么补救办法是什么呢?因为我在实际代码中有numpy数组。事实上,这是一个熊猫系列。我明白了。那么补救办法是什么呢?因为我在实际代码中有numpy数组。事实上,这是一个熊猫系列。这看起来像是一个整数范围的问题。在较新的python版本中,INT的范围是无限的,您可以通过键入类似10**100-1这样可笑的内容来检查这一点。numpy INT是C长的,所以它们不提供那种奢华。这看起来像是一个整数系列的问题。在较新的python版本中,INT的范围是无限的,您可以通过键入类似10**100-1这样可笑的内容来检查这一点。numpy INT是C long,因此它们不提供这种奢华。当
x
作为numpy数组传递时,这可能不起作用。对吗?嗯。但是,在我的例子中,它抛出了一个错误:TypeError:只有length-1数组可以转换为Python标量,当x
作为numpy数组传递时,该标量可能不起作用。对吗?嗯。但是,在我的例子中,它抛出了一个错误:TypeError:只有length-1数组可以转换为Python标量