2012-02-25 16 views
12

Ho una matrice creata utilizzandoStampa una matrice intera come numeri esadecimali

array1 = np.array([[25, 160, 154, 233], 
        [61, 244, 198, 248], 
        [227, 226, 141, 72 ], 
        [190, 43, 42, 8]],np.int) ; 

che mostra come

[[25, 160, 154, 233] 
[61, 244, 198, 248] 
[227, 226, 141, 72] 
[190, 43, 42 , 8]] 

Come faccio a visualizzare questo array come numeri esadecimali in questo modo:

[[0x04, 0xe0, 0x48, 0x28] 
[0x66, 0xcb, 0xf8, 0x06] 
[0x81, 0x19, 0xd3, 0x26] 
[0xe5, 0x9a, 0x7a, 0x4c]] 

Nota: i numeri in esadecimale potrebbero non essere conversioni reali di numeri in int. Ho riempito la matrice di esagoni solo per dare un esempio di ciò di cui ho bisogno.

+1

Quale versione di numpy stai usando ('np.version.version')? –

risposta

10

Python ha una funzione esadecimale integrata per convertire gli interi nella loro rappresentazione esadecimale (una stringa). È possibile utilizzare numpy.vectorize per applicarlo sugli elementi dell'array multidimensionale.

>>> import numpy as np 
>>> A = np.array([[1,2],[3,4]]) 
>>> vhex = np.vectorize(hex) 
>>> vhex(A) 
array([['0x1', '0x2'], 
     ['0x3', '0x4']], 
     dtype='<U8') 

Ci potrebbe essere un metodo integrato di fare questo con NumPy che sarebbe una scelta migliore se la velocità è un problema.

+0

-0, a causa dell'esistenza di 'numpy.set_printoptions'. –

+1

Il vectorize è utile quando è necessaria solo una stringa esadecimale occasionale. In caso contrario, occorrerebbe originariamente = get_printoptions(), set_printoptions (hex), print hex, set_printoptions (original) –

2

Questa one-liner dovrebbe fare il lavoro:

print '[' + '],\n['.join(','.join(hex(n) for n in ar) for ar in array1) + ']' 
+1

-0, a causa dell'esistenza di 'numpy.set_printoptions'. –

+0

Sì, è sicuramente una soluzione migliore. Chiedere domanda, per favore vedi la risposta di Justin Peel, e non usare il mio. –

+0

Numpy è assolutamente una soluzione migliore! Se hai accesso a numpy. –

1

Dovrebbe essere possibile per ottenere il comportamento che si desidera con numpy.set_printoptions, utilizzando la parola chiave formatter arg. Prende un dizionario con una specifica di tipo (ad esempio 'int') come chiave e un oggetto richiamabile che restituisce la stringa da stampare. Inserirò il codice ma la mia versione precedente di numpy non ha ancora la funzionalità. (Ugh).

1

Se quello che stai cercando è solo per la visualizzazione si può fare qualcosa di simile:

>>> a = [6, 234, 8, 9, 10, 1234, 555, 98] 
>>> print '\n'.join([hex(i) for i in a]) 
0x6 
0xea 
0x8 
0x9 
0xa 
0x4d2 
0x22b 
0x62 
20

È possibile impostare le opzioni di stampa per NumPy per fare questo.

import numpy as np 
np.set_printoptions(formatter={'int':hex}) 
np.array([1,2,3,4,5]) 

array([0x1L, 0x2L, 0x3L, 0x4L, 0x5L]) 

The L alla fine è solo perché io sono su una piattaforma a 64 bit e che sta inviando anela al formattatore. Per risolvere questo problema è possibile utilizzare

np.set_printoptions(formatter={'int':lambda x:hex(int(x))}) 
+1

FYI per l'OP. Il parametro 'formatter' per' set_printoptions' appare nel 2.0 documenti, ma non in 1.6. Quindi immagino sia una nuova funzionalità. Se si dispone di una versione precedente, è possibile ruotare la propria funzione di formattazione e fornirla numpy con 'numpy.set_string_function'. La funzione che fornisci dovrebbe formattare * l'intero array * piuttosto che un singolo elemento come nella risposta di Justin. –

3

Basta gettare i miei due centesimi si potrebbe fare questa lista di comprensione piuttosto semplicemente usando se è sempre una matrice 2D come quella

a = [[1,2],[3,4]] 
print [map(hex, l) for l in a] 

che vi dà [['0x1', '0x2'], ['0x3', '0x4']]

-1
array1_hex = np.array([[hex(int(x)) for x in y] for y in array1]) 
print array1_hex 
# => array([['0x19', '0xa0', '0x9a', '0xe9'], 
#   ['0x3d', '0xf4', '0xc6', '0xf8'], 
#   ['0xe3', '0xe2', '0x8d', '0x48'], 
#   ['0xbe', '0x2b', '0x2a', '0x8']], 
#   dtype='|S4') 
+0

Questa risposta non riesce con errore: TypeError: l'oggetto 'int' non è iterable – tarabyte

Problemi correlati