2017-02-19 4 views
0

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?

+1

, 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. –

Antwort

2

Ihnen fehlt die Tatsache, dass normale Python-Ganzzahlen beliebige Genauigkeit sind, während NumPy-Ganzzahlen feste Größe sind.

Dieser:

x**(n-i-1) 

Überläufe mit den Eingängen NumPy.

+0

Ich verstehe. Was ist das Heilmittel dann, weil ich numpy Array im tatsächlichen Code habe. In der Tat ist es eine Pandas-Serie. – Peaceful

+0

@ Peaceful: Verwenden Sie Gleitkommazahlen. – user2357112

1

Die Werte in f(x, p) für x im Fehlerfall sind vom Typ numpy.int32. Sie können überlaufen. Das Update ist in diesem Fall relativ einfach, wandelt die Werte int:

tot += p[i] * np.asarray(x).astype(int) ** (n - i - 1) 
+0

Das funktioniert möglicherweise nicht, wenn 'x' als ein numpy Array übergeben wird. Recht? – Peaceful

+0

Hmm. Es wirft jedoch in meinem Fall einen Fehler auf: 'TypeError: nur Länge-1-Arrays können in Python-Skalare konvertiert werden ' – Peaceful

+0

Danke, aktualisiert ... –

Verwandte Themen