Сопоставить массив numpy с помощью dict?

#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 — Спасибо, что указали. Теперь я изменил свой ответ.