#python #numpy #dictionary
#python #numpy #словарь
Вопрос:
У меня есть потенциально длинный массив единиц и нулей, который выглядит следующим образом: a = [0,0,1,0,1,0,.....]
я хочу перевести каждую последовательную пару значений в целое число между 0 и 3, как показано ниже:
- 0,0 -> 0
- 0,1 -> 1
- 1,0 -> 3
- 1,1 -> 2
Я ищу хороший, чистый и эффективный способ создания массива b (пример вывода ниже) с использованием приведенного выше сопоставления: b = [0, 3, 3,...]
Является ли dict хорошей идеей? Я не могу понять, как это сделать.
Ответ №1:
Попробуйте:
x = np.reshape(a, (-1,2))
b = x[:,0]*2 (x[:,0] ^ x[:,1])
Комментарии:
1. Спасибо, что выяснили, как использовать функцию. Я думал, что мне придется создать карту.
Ответ №2:
Если вы хотите использовать dict с явным отображением между соответствующими десятичными числами, вы можете попробовать это:
# Convert to a (-1,2) matrix and decimal numbers first
a = np.reshape(a, (-1,2))
a = np.sum(np.array([2,1])*a, axis=1)
# Define dictionary with mapping
D = {0: 0, 1: 1, 2: 3, 3: 2}
# Apply dictionary
a = [D[x] for x in a]
Комментарии:
1. Спасибо. У меня была идея изменения формы, но я продолжал пытаться выяснить, как использовать массив из 2 элементов в качестве ключа в dict.
Ответ №3:
Вы могли бы использовать последовательные пары в качестве индексов для выполнения поиска, для получения переведенного значения:
master = np.array([[0, 1],[3, 2]])
b = master[a[::2], a[1::2]]
Тестовый ввод:
[1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1]
Вывод:
[2, 1, 2, 2, 1, 1, 0, 3]
Комментарии:
1. Отображение, указанное в вопросе, будет стандартным для кода Грея . Нет причин предполагать, что это опечатка.
2. @user2357112supportsMonica — Спасибо, что указали. Теперь я изменил свой ответ.