Python-Runde ist nicht streng rund

runde Funktion

Ich denke, ich würde die Rundungsfunktion verwenden, wenn ich eine Zahl mit einem Bruch in eine Ganzzahl umwandeln wollte, aber dies ist keine reine Rundungsfunktion. Insbesondere ist es wie folgt.

>>> round(3.5) #Ich möchte, dass du 4 bist
4              #Werden Sie 4
>>> round(2.5) #Ich möchte, dass du 3 bist
2              #Werden Sie 2(<-??)
>>> round(2.50000001) #Ich möchte, dass du 3 bist
3              #Werden Sie 3

Dies wird auch in der offiziellen Dokumentation (https://docs.python.org/ja/3/library/functions.html?highlight=round#round) auf (gerade) +0,5 beim Runden auf eine Ganzzahl erwähnt. Wenn dies der Fall ist, wird es nicht aufgerundet, sondern abgerundet. Dies liegt an der Natur des Bankrundungsalgorithmus, und wenn auf eine ganze Zahl gerundet wird, scheinen sich die anderen Fälle nicht zu ändern. (Korrigiert, nachdem @shiracamus am 05.09.2020 um 12:21 Uhr darauf hingewiesen hat)

numpy rund

Wenn die integrierte Funktionsrunde nicht gut ist, sollten Sie die Numpy-Runde verwenden, aber die Numpy-Runde liefert das gleiche Ergebnis. Dies ist auch in der offiziellen Dokumentation geschrieben.

>>> import numpy as np
>>> np.round(3.5)   #Ich möchte, dass du 4 bist
4.0                 #Werden Sie 4
>>> np.round(2.5)   #Ich möchte, dass du 3 bist
2.0                 #Werden Sie 2

Ansatz

Es gibt kein Problem, da Sie die if-Anweisung verwenden können, um die Runde mit einer Zahl zu multiplizieren. Wenn Sie jedoch die for-Anweisung für das ndarray von numpy und eine nach der anderen drehen, wird der Code redundant. Wenn Sie Folgendes tun, werden 2.5 und 4.5 ebenfalls korrekt gerundet.

my_Definition der runden Funktion


def my_round(a:np.ndarray) -> np.ndarray:
    rounded_a = np.round(a)+(((a%1)==0.5)*(a//1%2==0))
    return rounded_a

Wenn ich es starte, sieht es so aus

>>> a = np.arange(-3,3,0.5)
>>>print(a)
[-3.  -2.5 -2.  -1.5 -1.  -0.5  0.   0.5  1.   1.5  2.   2.5]
>>>print(np.round(a))
[-3. -2. -2. -2. -1. -0.  0.  0.  1.  2.  2.  2.]
>>>print(my_round(a))
[-3. -2. -2. -1. -1.  0.  0.  1.  1.  2.  2.  3.]

Sie können sehen, dass es richtig gerollt ist.

Was machst du

Was "((a% 1) == 0,5) * (a // 1% 2 == 0)" tut, ist "(a% 1) == 0,5" in Form von "* .5" Indem Sie ein Array erstellen, in dem 1 nur dort steht, wo es ist, und indem Sie ein Array erstellen, in dem 1 nur dort steht, wo der ganzzahlige Teil gerade mit "a // 1% 2 == 0" ist, und diese multiplizieren Gerade). Es ist eine einfache Möglichkeit, 1 nur dort hinzuzufügen, wo es 5 ist. Diese Methode verwendet keine for-Anweisung (die in Python als langsam bezeichnet wird), daher wird erwartet, dass sie etwas schneller ist als die direkte Ausführung mit for.

Recommended Posts

Python-Runde ist nicht streng rund
Python Hinweis: Wenn easy_install nicht verwendet werden kann
[Python] Namensfehler: name'urlparse 'ist nicht definiert
Python ist einfach
Was ist Python?
Python ist eine Instanz
Was ist Python?
Python Pandas ist nicht für die Stapelverarbeitung geeignet
Python-Protokoll wird nicht mit Docker-Compose ausgegeben
Python Int ist unendlich
[Python] Was ist Pipeline ...
Python nicht implementiert Fehler
Python3> rund (a - b, 7)
[Python] Was ist virtualenv?
[Python] Linter Pylint ist nicht installiert wird angezeigt [VS Code]
Python> Überprüfen Sie NoneType oder nicht> wenn a == None:> wenn a None ist:
Python-Memo mit Perl - Wörterbuchtyp (Groß- / Kleinschreibung ungültig)
[Python] Effizienteres Debuggen!
Ist time.time () nicht sehr genau?
Test.py wird auf dem Webserver in Python3 nicht angezeigt.
TypeError: Das Objekt 'int' kann nicht tiefgestellt werden
Verwendung von __dict__ in Python
Filter 404 nicht in Rollbar Python gefunden
Python ist schmerzhaft. Aber benutze
Python ist eine Sprache für Erwachsene
Python-Version wechselt nicht
[Python] Python und Sicherheit - is Was ist Python?
Schnellerer Python-Release-Zyklus!
Der Rückgabewert der Python-Booleschen Operation ist nicht immer vom Bool-Typ
[Python] * args ** Was ist kwrgs?
[Python] Nicht nur Sammlungen zählen
Identität und Äquivalenz: ist und == in Python
Laut pip install scikit-learn ist Numerical Python (NumPy) nicht installiert.
NameError: Name '__ Datei__' ist nicht definiert
Python-Grundkurs (1 Was ist Python?)
Erstellen einer Python-Umgebung unter Ubuntu (wenn pip nicht die Standardeinstellung war)
[Python] Was ist eine Zip-Funktion?
[Python] Was ist eine with-Anweisung?
Python Hinweis: Über den Vergleich mit is
ppa: jonathonf / python-3.6 ist jetzt privat
Unterschied zwischen == und ist in Python
Verwenden Sie Stoff wie in Python (Stoff3)
Golang vs. Python - Ist Golang besser als Python?
Der Befehl wird in sudo nicht gefunden
Python ist UnicodeEncodeError im CodeBox-Docker
[Python] Was ist @? (Über Dekorateure)
Was ist besser, PyPy oder Python?
[Python] Was ist der sortierte Schlüssel?
Python für Anweisung ~ Was ist iterierbar ~
In Python gibt es keinen Schalter
[Django-Fehler] Das Objekt 'RenameAttributes' ist nicht iterierbar
Der heutige Python-Fehler: Das Bild ist leer
multiplikativer Hash ist nicht perfekt (zertifiziert)
Wofür ist der Python-Unterstrich (_)?
Bestimmen des Betriebssystems, auf dem Python ausgeführt wird
Python> Was ist ein erweitertes Slice?
Python in ist auch ein Operator
Die Konvertierung von Sympy Laplace ist nicht praktikabel
Hat sich nicht von Python 2 auf 3 geändert