Ich bekomme zwei verschiedene Ergebnisse für einige Eingaben, aber nicht für andere. Lassen Sie mich das konkrete Beispiel erklären. Ich habe die folgende Funktion:Seltsame Ergebnisse bei der Verwendung von numpy Arrays
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
ist ein Array mit sehr kleinen Werten:
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])
nun die Ausgänge berücksichtigen:
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]
Wie Sie sehen können, sind diese Ausgänge sind genau so wie sie sein sollten. Der einzige Unterschied ist, dass ich in einem Fall range(a, b)
verwende, während ich im anderen Fall diesen Bereich in ein numpliges Array umwandle.
Aber jetzt, lassen Sie uns die Werte innerhalb des Bereichs ändern:
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]
Und sie sind nicht einmal in der Nähe! Fehle ich etwas lächerlich einfach?
, die wie eine interger Bereich Ausgabe aussieht. Bei neueren Python-Versionen haben Ints eine unbegrenzte Reichweite. Sie können dies überprüfen, indem Sie etwas lächerliches wie 10 ** 100-1 eingeben. numpy ints sind C longs, also bieten sie diesen Luxus nicht. –