Печать целочисленного массива в виде шестнадцатеричных чисел
У меня есть массив, созданный с помощью
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. Я заполнил шестнадцатеричный массив, чтобы дать пример того, что мне нужно.
Ответы
Ответ 1
Вы можете настроить параметры печати для 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-битной платформе и посылаю longts в форматтер. Чтобы исправить это, вы можете использовать
np.set_printoptions(formatter={'int':lambda x:hex(int(x))})
Ответ 2
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, что было бы лучшим выбором, если бы скорость была проблемой.
Ответ 3
Просто бросая мои два цента, вы могли бы сделать это довольно просто, используя понимание списка, если он всегда является 2-мерным массивом, подобным этому
a = [[1,2],[3,4]]
print [map(hex, l) for l in a]
который дает вам [['0x1', '0x2'], ['0x3', '0x4']]
Ответ 4
Этот однострочный лайнер должен выполнять следующее задание:
print '[' + '],\n['.join(','.join(hex(n) for n in ar) for ar in array1) + ']'
Ответ 5
Должно быть возможно получить нужное поведение с numpy.set_printoptions
, используя ключевое слово formatter
. В качестве ключа требуется словарь со спецификацией типа (т.е. 'int'
), а вызываемый объект возвращает строку для печати. Я бы вставлял код, но моя старая версия numpy
еще не имеет функциональности. (Тьфу.)
Ответ 6
Если вы ищете его только для отображения, вы можете сделать что-то вроде этого:
>>> 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
Ответ 7
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')