Numpy hat eine Bibliotheksfunktion, np.unpackbits
, die ein uint8
in einen Bitvektor der Länge 8 entpackt. Gibt es eine entsprechend schnelle Möglichkeit, größere numerische Typen auszupacken? Z.B. uint16
oder uint32
. Ich arbeite an einer Frage, die häufige Übersetzungen zwischen Zahlen, Array-Indexierung und Bit-Vektor-Repräsentationen betrifft, und der Flaschenhals ist unsere Pack- und Entpackungsfunktionen.
Dies können Sie mit view
und unpackbits
Eingabe:
%Vor%Ausgabe:
%Vor% Für a = arange(int(1e6), dtype=uint16)
ist das ziemlich schnell bei ca. 7 ms auf meinem Rechner
Was endianess angeht, müssen Sie sich Ссылка anschauen und die Anwendung anwenden Vorschläge dort abhängig von Ihren Bedürfnissen.
Ich habe auch keine Funktion dafür gefunden, aber vielleicht hilft die Verwendung von Pythons eingebautem struct.unpack, um die benutzerdefinierte Funktion schneller zu machen als das Verschieben und Andocken von längerer Zeit (beachte, dass ich uint64 benutze).
%Vor% Die Idee besteht darin, diese in uint8 umzuwandeln, Unpackbits zu verwenden, das Ergebnis zu verketten. Je nach Ihrer Anwendung ist es möglicherweise einfacher, strukturierte Arrays . Es gibt auch eine eingebaute bin () -Funktion, die eine Folge von Nullen und Einsen erzeugt, aber ich bin nicht sicher, wie schnell es ist und es erfordert auch eine Nachbearbeitung.
Dies funktioniert für beliebige Arrays von beliebigem Uint (d. h. auch für mehrdimensionale Arrays und auch für Zahlen, die größer als der Wert von uint8 max sind) .
Es wechselt die Anzahl der Bits und nicht die Anzahl der Array-Elemente, daher ist es einigermaßen schnell.
%Vor%