it-swarm.com.de

Python-Abteilung

Ich habe versucht, eine Menge von Zahlen von -100 auf 0 bis auf einen Bereich von 10-100 zu normalisieren, und hatte Probleme, nur zu bemerken, dass selbst ohne Variablen dies nicht die Art und Weise bewertet, wie ich es erwarten würde:

>>> (20-10) / (100-10)
0

Float Division funktioniert auch nicht:

>>> float((20-10) / (100-10))
0.0

Wenn eine Seite der Division in einen Float umgewandelt wird, funktioniert es:

>>> (20-10) / float((100-10))
0.1111111111111111

Im ersten Beispiel wird jede Seite als int ausgewertet, was bedeutet, dass die endgültige Antwort in ein int umgewandelt wird. Da 0,111 weniger als 0,5 ist, wird auf 0 gerundet. Meiner Meinung nach ist das nicht transparent, aber ich denke, das ist so.

Was ist die Erklärung?

118
Adam Nelson

Sie verwenden Python 2.x, wobei Ganzzahldivisionen abgeschnitten werden, statt eine Gleitkommazahl zu werden.

>>> 1 / 2
0

Sie sollten eine davon zu einer float machen:

>>> float(10 - 20) / (100 - 10)
-0.1111111111111111

oder from __future__ import division, der / dazu zwingt, das Verhalten von Python 3.x zu übernehmen, das immer einen Float zurückgibt.

>>> from __future__ import division
>>> (10 - 20) / (100 - 10)
-0.1111111111111111
231
kennytm

Sie setzen Integer-Werte ein, damit Python Ihnen eine ganze Zahl zurückgibt :

>>> 10 / 90
0

Wenn Sie dies anschließend in ein Float umwandeln, ist die Rundung bereits durchgeführt, dh, 0 Integer wird immer 0 Float.

Wenn Sie Floats auf beiden Seiten der Division verwenden, erhalten Sie von Python die erwartete Antwort.

>>> 10 / 90.0
0.1111111111111111

Also in deinem Fall:

>>> float(20-10) / (100-10)
0.1111111111111111
>>> (20-10) / float(100-10)
0.1111111111111111
19
Dave Webb

Sie müssen es in einen Float umwandeln, BEVOR Sie die Division durchführen. Das ist:

float(20 - 10) / (100 - 10)
10
A. Levy

Dies hat mit der von Ihnen verwendeten Python-Version zu tun. Grundsätzlich übernimmt es das C-Verhalten: Wenn Sie zwei ganze Zahlen teilen, werden die Ergebnisse auf eine ganze Zahl abgerundet. Denken Sie auch daran, dass Python die Operationen von links nach rechts durchführt, was beim Umsetzen eine Rolle spielt.

Beispiel: Da dies eine Frage ist, die immer in meinem Kopf erscheint, wenn ich arithmetische Operationen durchführe (sollte ich in Float konvertieren und welche Zahl), wird ein Beispiel aus diesem Aspekt dargestellt:

>>> a = 1/2/3/4/5/4/3
>>> a
0

Wenn wir ganze Zahlen teilen, wird es nicht weiter überraschend gerundet.

>>> a = 1/2/3/4/5/4/float(3)
>>> a
0.0

Wenn wir die letzte Ganzzahl in Floaten umwandeln, werden wir immer noch Null erhalten, da unsere Zahl durch die Float-Division durch die Ganzzahlteilung bereits zu 0 geworden ist.

>>> a = 1/2/3/float(4)/5/4/3
>>> a
0.0

Gleiches Szenario wie oben, jedoch Verschiebung der Float-Schriftform etwas nach links.

>>> a = float(1)/2/3/4/5/4/3
>>> a
0.0006944444444444445

Wenn wir schließlich die erste Ganzzahl in Floaten umwandeln, ist das Ergebnis das gewünschte, da von der ersten Division ausgehend, d. H. Von ganz links, Floats verwendet werden.

Zusatz 1: Wenn Sie versuchen, dies zu beantworten, um die arithmetische Auswertung zu verbessern, sollten Sie this überprüfen. 

Zusatz 2: Bitte achten Sie auf folgendes Szenario:

>>> a = float(1/2/3/4/5/4/3)
>>> a
0.0
8
George

In Python 2.7 ist der Operator / eine Ganzzahleinteilung, wenn Eingaben Ganzzahlen sind:

>>>20/15
1

>>>20.0/15.0
1.33333333333

>>>20.0/15
1.33333333333

In Python 3.3 ist der /-Operator eine Float-Division, auch wenn die Eingaben ganzzahlig sind.

>>> 20/15
1.33333333333

>>>20.0/15
1.33333333333

Für die Ganzzahleinteilung in Python 3 verwenden wir den Operator //.

Der //-Operator ist ein ganzzahliger Divisionsoperator in Python 2.7 und Python 3.3.

In Python 2.7 und Python 3.3:

>>>20//15
1

Nun sehen Sie den Vergleich

>>>a = 7.0/4.0
>>>b = 7/4
>>>print a == b

Für das obige Programm ist die Ausgabe in Python 2.7 False und in Python 3.3 True.

In Python 2,7 ist a = 1,75 und b = 1.

In Python 3.3 ist a = 1.75 und b = 1.75, nur weil / eine Float-Division ist.

7
Harsha Vardhan

Festlegen eines Floats durch Platzieren eines '.' Nach der Nummer wird sie auch standardmäßig verschoben. 

>>> 1 / 2
0

>>> 1. / 2.
0.5
4
billmanH

Mache mindestens einen davon float, dann wird es eine Float-Division sein, keine ganze Zahl:

>>> (20.0-10) / (100-10)
0.1111111111111111

Das Ergebnis zum Floaten zu werfen ist zu spät.

2
unbeli

In python cv2 wurde die Aufteilungsberechnung nicht aktualisiert. Sie müssen also from __future__ import division in der ersten Zeile des Programms angeben.

1
Kavitha Raj

Ich persönlich zog es vor, ganz am Anfang einen 1. * einzufügen. Der Ausdruck wird also etwa so:

1. * (20-10) / (100-10)

Da ich immer eine Division für eine Formel mache:

accuracy = 1. * (len(y_val) - sum(y_val)) / len(y_val)

es ist daher unmöglich, einfach einen .0 wie 20.0 hinzuzufügen. In meinem Fall kann das Umwickeln mit einer float() etwas an Lesbarkeit einbüßen.

0
FredWe

In jedem Fall handelt es sich um eine ganzzahlige Division. 10/90 = 0. Im zweiten Fall gießen Sie lediglich 0 für einen Float.

Versuchen Sie, einen der Operanden von "/" als Float auszuführen:

float(20-10) / (100-10)
0
Fred Larson

Sie gießen zu schweben, nachdem die Division in Ihrem zweiten Beispiel bereits passiert ist. Versuche dies:

float(20-10) / float(100-10)
0
David M

Ich bin etwas überrascht, dass niemand erwähnt hat, dass das ursprüngliche Poster rational -Zahlen mögen könnte, um daraus zu resultieren. Wenn Sie daran interessiert sind, hat das Python-basierte Programm Sage Ihren Rücken . (Derzeit noch auf Python 2.x basierend, obwohl 3.x gerade läuft.)

sage: (20-10) / (100-10)
1/9

Dies ist keine Lösung für jedermann, da einige Vorbereitungen vorgenommen werden. Diese Zahlen sind also keine ints, sondern Sage Integer-Klassenelemente. Dennoch ist es als Teil des Ökosystems Python erwähnenswert.

0
kcrisman