2016-06-01 14 views
1

Wie lässt sich am einfachsten eine numpige Boolesche Array-Darstellung einer Ganzzahl erzeugen? Zum Beispiel, Karte 6 zu np.array([False, True, True], dtype=np.bool).numpy Boolesche Array-Darstellung einer Ganzzahl

+0

Diese Frage hat leider keine brauchbaren Antworten: http://stackoverflow.com/questions/22773443/built-in-function-in-numpy-to-interpret-an-integer -to-an-array-of-boolean-values ​​ –

+0

Was ist falsch mit der akzeptierten Antwort auf die Frage, die Sie verknüpft haben? Ich entschuldige mich, wenn ich etwas nicht richtig lese, aber die akzeptierte Antwort auf diese Frage scheint ziemlich genau zu skizzieren, wie genau das zu tun ist, was Sie verlangen. –

+0

@VladislavMartin Ich muss meine ganze Zahl in ein Array von 'np.int8' konvertieren, was hässlich ist, und die Ausgabe setzt die höchstwertigen Bits zuerst und gruppiert die Bits in Gruppen von 8 - beides sind Dinge, die ich nicht will. –

Antwort

3

Wenn n das ist Integer, der Ausdruck (n & (1 << np.arange(int(floor(log(n, 2) + 1))))) > 0 erzeugt ein boolesches Array, das die Bits darstellt, wobei das niedrigstwertige Bit an der ersten Position steht.

Zum Beispiel

In [224]: n = 5 

In [225]: from math import floor, log 

In [226]: n = 5 

In [227]: (n & (1 << np.arange(int(floor(log(n, 2) + 1))))) > 0 
Out[227]: array([ True, False, True], dtype=bool) 

In [228]: n = 8 

In [229]: (n & (1 << np.arange(int(floor(log(n, 2) + 1))))) > 0 
Out[229]: array([False, False, False, True], dtype=bool) 

In [230]: n = 514 

In [231]: (n & (1 << np.arange(int(floor(log(n, 2) + 1))))) > 0 
Out[231]: array([False, True, False, False, False, False, False, False, False, True], dtype=bool) 
+0

Clever! Ich gebe tatsächlich das 'm = int (floor (log (n, 2) + 1))', also ist diese Lösung für mich die kürzeste. –

2

Verwenden Sie zuerst , um die binäre Darstellung des ganzzahligen Werts zu erhalten. Denken Sie daran, hier die Bitbreite anzugeben, die Sie für Ihr Bit-Array wünschen. Ich habe einen Weg enthalten, um programmgesteuert die Anzahl der Bits zu bestimmen, erforderlich, um die gegebene Ganzzahl darstellen:

>>> n = 5 
>>> bin_n = bin(n) 
'0b101' 
>>> smallest_length = n.bit_length() 
3 
>>> bin_array = np.binary_repr(5, width=smallest_length) 
bin_array = '101' 

dann in umgekehrter Reihenfolge der Bits in der Ausgabe Binärstring:

>> reversed_bin_array[::-1] 
reversed_bin_array = '101' 

Dann endlich Um ein Array von Bits mit der zuvor angegebenen Bitbreite zu erhalten, verwenden Sie bitarray. Ich habe festgestellt, dass das bitarray Objekt ein sehr nützliches Mittel ist bequem zu speichern und arbeitet auf Bit-Arrays:

>>> bitarray('11110010') # from a string 

Ich hoffe, das hilft, glücklich Codierung!

+0

'np.invert' kehrt die Reihenfolge der Bits nicht um. – user2357112

+0

Wow ... was habe ich gedacht? Nun, repariere es. Sieht das besser aus @ user2357112 –

+0

Sortieren von, aber Sie haben einen verweilenden Verweis auf die Reihenfolge der Bits, die "bereits durch den vorherigen Schritt umgekehrt". Es sieht auch so aus, als ob der Fragesteller die kleinste erforderliche Breite automatisch berechnen möchte, anstatt eine Breite manuell anzugeben, und der Vollständigkeit halber sollten Sie wahrscheinlich zeigen, wie Sie das NumPy-Array, um das der Fragesteller gebeten wird, erhalten. – user2357112

1

Vielleicht ist es nicht die einfachste, aber eine kompakte Art und Weise ist

from numpy import array array([i for i in bin(5)[2:]]) == '1'

1

hier ein Ansatz ist mit np.binary_repr und np.fromstring -

np.fromstring(np.binary_repr(num), dtype=np.uint8)==49 

Probelauf -

In [39]: num 
Out[39]: 17 

In [40]: np.fromstring(np.binary_repr(num), dtype=np.uint8)==49 
Out[40]: array([ True, False, False, False, True], dtype=bool)