2016-09-19 5 views
3

Angenommen, ich habe einen numpy Vektor mit n Elementen, so würde Ich mag Zahlen als binäre Schreibweise in diesem Vektor kodieren, so Shape wird (n,m) wo mlog2(maxnumber) zum Beispiel:numpy binäre Schreibweise schnelle Erzeugung

x = numpy.array([32,5,67]) 

Da max Zahl ich habe 67 ist, brauche ich numpy.ceil(numpy.log2(67)) == 7 Bits diesen Vektor zu kodieren, so Form des Ergebnisses wird (3,7) sein

array([[1, 0, 0, 0, 0, 1, 1], 
     [0, 0, 0, 0, 1, 0, 1], 
     [0, 1, 0, 0, 0, 0, 0]]) 

Das Problem steigt, weil ich keine schnelle Möglichkeit habe, binäre Notation von
Funktion numpy.binary_repr zu numpy Array zu verschieben. Jetzt muss ich über Ergebnis durchlaufen, und jedes Bit setzen haftend:

brepr = numpy.binary_repr(x[i],width=7) 
j = 0 
for bin in brepr: 
    X[i][j] = bin 
    j += 1 

Es ist sehr timecost und dumme Art und Weise, wie sie effizienter machen?

+0

Siehe http://stackoverflow.com/questions/22227595/convert-integer-to-binary-array -mit-geeignet-Polsterung –

Antwort

3

hier uns einen Weg, mit np.unpackbits und Rundfunk:

>>> max_size = np.ceil(np.log2(x.max())).astype(int) 
>>> np.unpackbits(x[:,None].astype(np.uint8), axis=1)[:,-max_size:] 
array([[0, 1, 0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 1, 0, 1], 
     [1, 0, 0, 0, 0, 1, 1]], dtype=uint8) 
1

können Sie numpy Bytestring verwenden.

Für den Fall, dass Sie in der Hand haben:

res = numpy.array(len(x),dtype='S7') 
for i in range(len(x)): 
    res[i] = numpy.binary_repr(x[i]) 

Oder kompakte

res = numpy.array([numpy.binary_repr(val) for val in x])