Python mit Numpy

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Raininger
User
Beiträge: 11
Registriert: Mittwoch 23. Oktober 2013, 12:13
Wohnort: München

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
BlackJack

@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:

Code: Alles auswählen

In [28]: np.array([42]).dtype
Out[28]: dtype('int32')
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.
Raininger
User
Beiträge: 11
Registriert: Mittwoch 23. Oktober 2013, 12:13
Wohnort: München

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
BlackJack

@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:

Code: Alles auswählen

In [81]: np.array([]).dtype
Out[81]: dtype('float64')
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:

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)
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.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Raininger hat geschrieben:Muß ich angegeben die Zeile 1. und 2.? In und Out?
Wenn du das fragen musst, dann solltest du dir dringend noch einmal das Python-Tutorial vornehmen.
Antworten