将整数数组打印为十六进制数

时间:2012-02-25 21:02:11

标签: python arrays numpy

我有一个使用

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

显示为

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

如何将此数组显示为十六进制数字,如下所示:

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

注意:十六进制中的数字可能不是int中数字的真实转换。我已经填充了十六进制数组,只是为了举例说明我需要的东西。

8 个答案:

答案 0 :(得分:26)

您可以设置numpy的打印选项来执行此操作。

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

给出

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

最后的L只是因为我在64位平台上,它正在向格式化程序发送长信息。要解决此问题,您可以使用

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

答案 1 :(得分:13)

Python有一个内置的十六进制函数,用于将整数转换为十六进制表示(字符串)。您可以使用numpy.vectorize将其应用于多维数组的元素。

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

如果速度是一个问题,可能有一种内置的方法可以使用numpy这样做。如果速度有问题,这将是一个更好的选择。

答案 2 :(得分:4)

如果它总是像那样的二维数组那么你只需要使用列表理解就可以投入我的两分钱吗

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

为您提供[['0x1', '0x2'], ['0x3', '0x4']]

答案 3 :(得分:2)

这个单行应该做的工作:

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

答案 4 :(得分:2)

如果你正在寻找它只是为了显示你可以做这样的事情:

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

答案 5 :(得分:1)

应该可以使用formatter关键字arg通过numpy.set_printoptions获得所需的行为。它需要一个带有类型规范的字典(即'int')作为键,一个可调用的对象返回要打印的字符串。我会插入代码但我的旧版numpy还没有功能。 (啊。)

答案 6 :(得分:0)

我正在使用矢量化 np.base_repr,因为我需要用填充的 0 对结果进行调整

import numpy as np

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


base_v = np.vectorize(np.base_repr)
padded = np.char.rjust(base_v(array1, base), width, '0')
result = np.char.add('0x', padded)

输出:

[['0x0019' '0x00A0' '0x009A' '0x00E9']
 ['0x003D' '0x00F4' '0x00C6' '0x00F8']
 ['0x00E3' '0x00E2' '0x008D' '0x0048']
 ['0x00BE' '0x002B' '0x002A' '0x0008']]

答案 7 :(得分:-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')
相关问题