NumPy - Was ist der Unterschied zwischen frombuffer und fromstring?
Erscheinen Sie, um das gleiche Ergebnis zu mir:
In [32]: s
Out[32]: '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x15\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
In [27]: np.frombuffer(s, dtype="int8")
Out[27]:
array([ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], dtype=int8)
In [28]: np.fromstring(s, dtype="int8")
Out[28]:
array([ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], dtype=int8)
In [33]: b = buffer(s)
In [34]: b
Out[34]: <read-only buffer for 0x035F8020, size -1, offset 0 at 0x036F13A0>
In [35]: np.fromstring(b, dtype="int8")
Out[35]:
array([ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], dtype=int8)
In [36]: np.frombuffer(b, dtype="int8")
Out[36]:
array([ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], dtype=int8)
Wann sollte man eingesetzt werden, gegen die anderen?
- Haben Sie die Dokumentation zu Lesen?
frombuffer
erzeugt ein 1d-array aus einem Puffer-Objekt undfromstring
erzeugt ein 1d-array aus einer binären oder string-Darstellung. - Bitte Bearbeiten Sie in dem, was
s
ist. - Ob s ist ein string von bytes oder ein Puffer ist egal, in meinem einfachen Beispiel.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vom praktischen Standpunkt aus, der Unterschied ist, dass:
Wird eine Kopie des Strings im Speicher, während:
oder
Verwenden Sie den Speicherpuffer, der den string direkt und nicht jede* zusätzliche Speicher. Mit
frombuffer
werden auch im nur-Lesen-array, wenn der Eingang zubuffer
ist ein string, strings sind unveränderlich in python.(*Zu vernachlässigen, ein paar Byte Speicher für eine zusätzliche python -
ndarray
Objekt -- Der zugrunde liegende Speicher für die Daten freigegeben werden.)Wenn Sie nicht vertraut sind mit
buffer
- Objekte (memoryview
in Python ist3.x), Sie sind im wesentlichen eine Möglichkeit für C-level-Bibliotheken setzen ein Speicherblock, der für die Verwendung in python. Es ist im Grunde eine python-Schnittstelle für verwalteten Zugriff auf die raw-Speicher.Wenn man die Arbeit mit etwas, das ausgesetzt die Puffer-Schnittstelle, dann würden Sie wahrscheinlich verwenden wollen
frombuffer
. (Python-2.x Streichern und python 3.xbytes
aussetzen der Puffer-Schnittstelle, aber Sie erhalten eine nur-Lesen-array, die als python-strings sind unveränderlich.)Andernfalls verwenden Sie
fromstring
erstellen ein numpy-array aus einem string. (Es sei denn, Sie wissen, was Sie tun, und will streng kontrollieren-Speicher, etc.)buffer(np.frombuffer(buffer(s), dtype='int8'))
wiederholt, bekomme ich eine neue Puffer-Speicherort jedes mal, und es immer anders ausbuffer(s)
.array.array
) anstatt ein string und den Inhalt ändern. Du wirst sehen, all die numpy Ansichten und die Puffer ändern.multiprocessing.Array
als Puffer und fand Sie verwendet den gleichen Speicher. Die string-Repräsentation des Objekt-Puffer scheint irreführend zu sein; vielleicht zeigt es die Position der Variablen anstatt die zugrunde liegende Puffer. Einen besseren Weg, um zu überprüfen, scheintid(buffer[0])
.np.fromstring()
nicht machen Sie eine Kopie der Daten? Laut der Dokumentation, "Veraltet seit version 1.14: Wenn dieses argument [sep
] ist nicht vorgesehen,fromstring
fällt wieder auf das Verhalten derfrombuffer
nach der Codierung unicode-string-inputs als utf-8 (python 3), oder die Standard-Codierung (python 2)." Dies deutet darauf hin, dass die Funktionen identisch sind, wennsep
ist nicht im Lieferumfang enthalten.x.base
gibt den original-Byte-Objekt (oder Pythonarray
Objekt) wenn Siefrombuffer()
, gibt aberNone
wenn Siefromstring()
.