2012-02-25 27 views
12

Tengo una matriz creada mediante el uso deImprimir una matriz de enteros como números hexadecimales

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

que muestra como

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

¿Cómo puedo mostrar esta matriz como números hexadecimales como esto:

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

Nota: los números en hexadecimal pueden no ser conversiones reales de números en int. He llenado una matriz hexagonal solo para dar un ejemplo de lo que necesito.

+1

¿Qué versión de numpy estás usando ('np.version.version')? –

Respuesta

10

Python tiene una función hexadecimal integrada para convertir enteros a su representación hexadecimal (una cadena). Puede usar numpy.vectorize para aplicarlo sobre los elementos de la matriz multidimensional.

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

Puede haber un método integrado de hacer esto con numpy que sería una mejor opción si la velocidad es un problema.

+0

-0, debido a la existencia de 'numpy.set_printoptions'. –

+1

El vectorizar es útil cuando solo se necesita una cadena hexagonal ocasional. De lo contrario, necesitaría original = get_printoptions(), set_printoptions (hex), print hex, set_printoptions (original) –

2

Esta sola línea debe hacer el trabajo:

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

-0, debido a la existencia de 'numpy.set_printoptions'. –

+0

Sí, definitivamente es una mejor solución. Quien pregunta, por favor vea la respuesta de Justin Peel, y no use la mía. –

+0

¡Numpy es una solución absolutamente mejor! Si tienes acceso a numpy –

1

Debería ser posible para obtener el comportamiento que desea con numpy.set_printoptions, utilizando la palabra clave formatter arg. Se necesita un diccionario con una especificación de tipo (por ejemplo, 'int') como clave y un objeto invocable que devuelve la cadena para imprimir. Insertaría código pero mi versión anterior de numpy aún no tiene la funcionalidad. (Uf).

1

Si lo que estás buscando es sólo para mostrar que puede hacer algo como esto:

>>> 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

Puede configurar las opciones de impresión para numpy para hacer esto.

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

da

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

La L al final es sólo porque estoy en una plataforma de 64 bits y que es el envío de productos largos al formateador. Para solucionar este problema, puede utilizar

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

FYI para el OP. El parámetro 'formatter' para' set_printoptions' aparece en el 2.0 documentos, pero no en 1.6. Entonces me imagino que es una nueva característica. Si tiene una versión anterior, puede desplegar su propia función de formateo y proporcionarla numpy con 'numpy.set_string_function'. La función que proporcione necesitará formatear * toda la matriz * en lugar de un solo elemento como en la respuesta de Justin. –

3

sólo tirar mi granito de arena que podría hacer esta lista bastante simple uso de la comprensión si es siempre una matriz 2D como la

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

que le da [['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

Esta respuesta falla con el error: TypeError: el objeto 'int' no es iterable – tarabyte

Cuestiones relacionadas