So extrahieren Sie die Bits größerer numerischer Numpy-Datentypen

8

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.

    
Cardano 18.08.2013, 05:32
quelle

3 Antworten

7

Dies können Sie mit view und unpackbits

tun

Eingabe:

%Vor%

Ausgabe:

%Vor%

Für a = arange(int(1e6), dtype=uint16) ist das ziemlich schnell bei ca. 7 ms auf meinem Rechner

%Vor%

Was endianess angeht, müssen Sie sich Ссылка anschauen und die Anwendung anwenden Vorschläge dort abhängig von Ihren Bedürfnissen.

    
Phillip Cloud 18.08.2013, 06:16
quelle
1

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.

    
Roman Susi 18.08.2013 06:13
quelle
0

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%     
user6597793 02.03.2018 16:16
quelle

Tags und Links