Hallo Pythonfreunde
kürzlich habe ich bei einem Pythonprogramm Numpy eingebunden.
Beim Rechnen trat ein Fehler auf, dessen Ursache wahrscheinlich eine
begrenzte Zahlenlänge bei Numpy ist.
Ist die Zahlenlänge bei Numpy auf 20 oder 18 Ziffern begrenzt?
Bei Python können doch die Int-Zahlen länger sein?
Danke, Grüße, Raininger
Python mit Numpy
@Raininger: Bei Numpy sind bei ganzen Zahlen die Bits begrenzt. Die Stärken von Numpy sind eine kompakte Speicherung mit fester Byteanzahl pro Element die am besten auch noch direkt vom Prozessor verarbeitet werden können und damit auch effiziente vektorisierte Operationen auf diesen Daten. Bei ganzen Zahlen bekomme ich wenn ich nichts extra angebe 32-Bit-Integer mit Vorzeichen:
Man kann aber auch explizit `numpy.uint32`, `numpy.int64`, oder `numpy.uint64` als `dtype` vorgeben wenn man einen grösseren, allerdings immer noch beschränkten Wertebereich haben möchte. `uint32` natürlich nur wenn die Zahlen alle positiv sind.
Code: Alles auswählen
In [28]: np.array([42]).dtype
Out[28]: dtype('int32')
Besten Dank, BlackJack
ich hätte allerdings noch Fragen. Erstmal: Bei meiner Rechnung handelt es sich um positive Integerwerte.
Was muß ich da zum Anfang von Numpy angeben, wenn ich den Zahlenbereich vergrößern will?
Muß ich angegeben die Zeile 1. und 2.? In und Out?
Was bedeutet die 28, die 42? Die 32 hat wohl etwas mit der Ziffernanzahl zu tun. Wieso aber 32? Ich habe mal
gelernt, dass man für eine Dezimalziffer 4 Bits, 1 Byte braucht. 32 wären dann ja nur 8 Ziffern.
Vielen Dank im Voraus, Raininger
ich hätte allerdings noch Fragen. Erstmal: Bei meiner Rechnung handelt es sich um positive Integerwerte.
Was muß ich da zum Anfang von Numpy angeben, wenn ich den Zahlenbereich vergrößern will?
Muß ich angegeben die Zeile 1. und 2.? In und Out?
Was bedeutet die 28, die 42? Die 32 hat wohl etwas mit der Ziffernanzahl zu tun. Wieso aber 32? Ich habe mal
gelernt, dass man für eine Dezimalziffer 4 Bits, 1 Byte braucht. 32 wären dann ja nur 8 Ziffern.
Vielen Dank im Voraus, Raininger
@Raininger: Du musst beim erstellen des Arrays angeben welchen Datentyp die Elemente haben sollen wenn Du nicht möchtest das die Funktion das selber anhand der Werte ”rät”.
Die Zeilen in meinem Beitrag sind aus einer interaktiven Python-Shell kopiert. Ich verwende IPython und das hat ``In […]`` als Prompt statt dem ``>>>`` von der Standard-Python-Shell und stellt der Ausgabe ein ``Out […]`` voran. Anstelle der Auslassungspunkte wird eine fortlaufende Nummer ausgegeben. Über die kann man später in IPython auf die Ergebnisse zugreifen. Das war also die 28. Ein- und Ausgabe in der Sitzung wo ich das ausprobiert habe. Die 42 ist einfach nur eine (ganze) Zahl. Hätte ich die weggelassen, dann hätte die `array()`-Funktion einen anderen Datentyp für die nichtvorhandenen Elemente geraten — 64-Bit Gleitkommazahlen:
Eine Dezimalziffer hat in der BCD-Kodierung vier Bits, die wird aber nicht zum Rechnen verwendet, jedenfalls nicht wenn es schnell gehen soll. Numpy verwendet für ganze Zahlen genau wie die Rechnerhardware eine Darstellung zur Basis zwei und für negative Zahlen das Zweierkomplement. Die Anzahl der Ziffern kann man nicht 1:1 umrechnen denn man kann zum Beispiel mit vier Bits alle ganzen Zahlen von 0 bis 15 beschreiben. Das ist mehr als eine Dezimalziffer, aber man kann andererseits nicht alle zweistelligen Dezimalziffern mit vier Bits beschreiben. Man muss die kleinste und die grösste Zahl berechnen die sich mit x Bits beschreiben lässt um den Wertebereich eines Ganzzahltyps zu kennen. Numpy hat eine Funktion dafür:
Ob es ganzzahlige Typen mit mehr Bits gibt hängt vom System ab, bis 64 ist es von Numpy garantiert. (Ich habe hier auf dem Laptop mit dem Numpy von der Linux-Distribution keinen grösseren Typen.)
Wenn die Zahlen grösser werden können, kann man auf Kosten der Genauigkeit mit Gleitkommazahlen rechnen.
Die Zeilen in meinem Beitrag sind aus einer interaktiven Python-Shell kopiert. Ich verwende IPython und das hat ``In […]`` als Prompt statt dem ``>>>`` von der Standard-Python-Shell und stellt der Ausgabe ein ``Out […]`` voran. Anstelle der Auslassungspunkte wird eine fortlaufende Nummer ausgegeben. Über die kann man später in IPython auf die Ergebnisse zugreifen. Das war also die 28. Ein- und Ausgabe in der Sitzung wo ich das ausprobiert habe. Die 42 ist einfach nur eine (ganze) Zahl. Hätte ich die weggelassen, dann hätte die `array()`-Funktion einen anderen Datentyp für die nichtvorhandenen Elemente geraten — 64-Bit Gleitkommazahlen:
Code: Alles auswählen
In [81]: np.array([]).dtype
Out[81]: dtype('float64')
Code: Alles auswählen
In [82]: np.iinfo(np.int32)
Out[82]: iinfo(min=-2147483648, max=2147483647, dtype=int32)
In [83]: np.iinfo(np.uint32)
Out[83]: iinfo(min=0, max=4294967295, dtype=uint32)
In [84]: np.iinfo(np.uint64)
Out[84]: iinfo(min=0, max=18446744073709551615, dtype=uint64)
Wenn die Zahlen grösser werden können, kann man auf Kosten der Genauigkeit mit Gleitkommazahlen rechnen.