我有几个问题
说我有一个numpy数组
a = np.array([0,1,2,3,4,31])
a0 = a[0]
a1 = a[1]
a2 = a[2]
a3 = a[3]
a4 = a[4]
a5 = a[5]
print hex(a4), hex(a5)
给了我
0x4L 0x1F
对于a0,a1,a2,a3,a5相同。我知道L是因为numpy数组。
现在我怎么得到0x04而不是0x4。
我要求的结果是
'0x1F0403020100'
我需要的答案应该从0x开始 - a5,a4,a3,a2,a1,a0的十六进制值 - 不带OX。所需的输出是一个字符串。如果我有零,我可以做位操作。但并非没有它。
答案 0 :(得分:2)
你真正想做的是通过将数组中的每个元素移动一定数量的位来将数组存储在一个数字中:
>>> a = np.array([0,1,2,3,4,31])
>>> hex(sum([ai*256**i for i,ai in enumerate(a)]))
'0x1f0403020100'
但要实现这一点,您需要确保您的数组元素最多为255.这完全取决于您保留/检查。您应该考虑使用ndarray
dtype
np.uint8
{{1}},这样您就无法修改数组中的数据(因为您无法拥有在你的数组溢出。)
答案 1 :(得分:2)
您可以尝试此解决方法。元素明智的hex
转换和后来的join
。 '0x'
被添加到字符串的开头:
>>> a = np.array([0,1,2,3,4,31])
>>> '0x' + ''.join('{:02X}'.format(i) for i in reversed(a))
'0x1F0403020100'
答案 2 :(得分:2)
<强> TL;博士强>
("0x" + ("{:0>2x}" * len(a))).format(*tuple(a[::-1]))
<小时/> 的说明:强>
将字符串"{:0>2x}"
乘以等于len(a)
的次数,即执行"{:0>2x}" * len(a)
。这将创建以下字符串:
'{:0>2x}{:0>2x}{:0>2x}{:0>2x}{:0>2x}{:0>2x}'
稍后可以使用{:0>2x}
方法格式化字符串中使用的 .format
,从而将int转换为宽度为2的十六进制字符串,其中任何填充都使用{{1 }}。
乘以数组的长度意味着您可以创建许多十六进制格式的参数。
0
"0x"
a[::-1]
。tuple(a[::-1])
*tuple(a[::-1])
方法的参数,在您创建的包含自定义格式的正确次数的连接字符串上。结果:
.format
PS。如果您更喜欢大写十六进制字符串,请将>>> ("0x" + ("{:0>2x}" * len(a))).format(*tuple(a[::-1]))
'0x1f0403020100'
替换为x
,即:
X
答案 3 :(得分:0)
对于python 3.5 +:
'0x'+a.astype(np.uint8)[::-1].tobytes().hex().upper()