Python - Numpy - Преобразование массива numpy шестнадцатеричных строк в целые числа - PullRequest
3 голосов
/ 26 марта 2020

У меня есть массив numpy шестнадцатеричной строки (например: ['9', 'A', 'B']) и я хочу преобразовать их все в целые числа в диапазоне от 0 до 255. Единственный способ, которым я знаю, как это сделать это использовать для l oop и добавить отдельный массив numpy.

import numpy as np

hexArray = np.array(['9', 'A', 'B'])

intArray = np.array([])
for value in hexArray:
    intArray = np.append(intArray, [int(value, 16)])

print(intArray) # output: [ 9. 10. 11.]

Есть ли лучший способ сделать это?

Ответы [ 4 ]

3 голосов
/ 26 марта 2020

Векторизованный способ с функциональностью просмотра массива -

In [65]: v = hexArray.view(np.uint8)[::4]

In [66]: np.where(v>64,v-55,v-48)
Out[66]: array([ 9, 10, 11], dtype=uint8)

Временные параметры

Настройка с увеличением размера образца на 1000x -

In [75]: hexArray = np.array(['9', 'A', 'B'])

In [76]: hexArray = np.tile(hexArray,1000)

# @tianlinhe's soln
In [77]: %timeit [int(value, 16) for value in hexArray]
1.08 ms ± 5.67 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

# @FBruzzesi soln
In [78]: %timeit list(map(functools.partial(int, base=16), hexArray))
1.5 ms ± 40.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

# From this post
In [79]: %%timeit
    ...: v = hexArray.view(np.uint8)[::4]
    ...: np.where(v>64,v-55,v-48)
15.9 µs ± 294 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
3 голосов
/ 26 марта 2020

С использованием понимания списка:

 array1=[int(value, 16) for value in hexArray]
 print (array1)

вывод:

[9, 10, 11]
1 голос
/ 26 марта 2020

Альтернатива с использованием карты:

import functools

list(map(functools.partial(int, base=16), hexArray))
[9, 10, 11]
0 голосов
/ 26 марта 2020
intArray = [int(hexNum, 16) for hexNum in list(hexArray)]

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...