Вывести целочисленный массив в виде шестнадцатеричных чисел - PullRequest
16 голосов
/ 26 февраля 2012

У меня есть массив, созданный с помощью

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.Я заполнил шестнадцатеричный массив только для того, чтобы привести пример того, что мне нужно.

Ответы [ 7 ]

26 голосов
/ 26 февраля 2012

Вы можете установить параметры печати для 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-битной платформе, и он отправляет long в форматтер. Чтобы это исправить, вы можете использовать

np.set_printoptions(formatter={'int':lambda x:hex(int(x))})
13 голосов
/ 26 февраля 2012

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, который был бы лучшим выбором, если скорость является проблемой.

4 голосов
/ 26 февраля 2012

Просто добавив мои два цента, вы можете сделать это довольно просто, используя списочное понимание, если это всегда двумерный массив, подобный этому

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

, который дает вам [['0x1', '0x2'], ['0x3', '0x4']]

2 голосов
/ 26 февраля 2012

Если то, что вы ищете, это просто для отображения, вы можете сделать что-то вроде этого:

>>> 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
2 голосов
/ 26 февраля 2012

Этот однострочник должен выполнять работу:

print '[' + '],\n['.join(','.join(hex(n) for n in ar) for ar in array1) + ']'
1 голос
/ 26 февраля 2012

Должно быть возможно получить желаемое поведение с помощью numpy.set_printoptions, используя ключевое слово formatter arg. Он принимает словарь со спецификацией типа (т.е. 'int') в качестве ключа и вызываемый объект, возвращающий строку для печати. Я вставил бы код, но моя старая версия numpy пока не имеет функциональности. (Тьфу.)

0 голосов
/ 26 февраля 2012
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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...