Карта NumPy Значения - PullRequest
       0

Карта NumPy Значения

3 голосов
/ 28 мая 2020

Допустим, у меня есть массив NumPy:

x = np.array([[0, 5],
              [1, 6],
              [4, 3],
              [2, 4],
              [3, 2]])

и массив «поиска», который сообщает мне, как сопоставить одно целое число (первый столбец) другому (второй столбец):

lookup = np.array([[0, 50],
                   [1, 16],
                   [2, 47],

Итак, 0 -> 50, 1 -> 16 и 2 -> 47. Обратите внимание, что целые числа [3, 4, 5, 6] не используются при поиске и поэтому не нуждаются в изменении. Простой способ сделать это:

for i in range(lookup.shape[0]):
    num = lookup[i, 0]
    x[x == num] = lookup[i, 1]

И ожидаемый результат должен быть:

np.array([[50, 5],
          [16, 6],
          [4, 3],
          [47, 4],
          [3, 47]])

Для большого 2D-массива x и гораздо большего lookup это есть более эффективный способ сделать это векторизованным способом в NumPy?

Ответы [ 2 ]

0 голосов
/ 28 мая 2020

Надеюсь, это поможет!

x = np.array([[0, 5],
              [1, 6],
              [4, 3],
              [2, 4],
              [3, 2]])

lookup = np.array([[0, 50],
                   [1, 16],

                   [2, 47]])

# building a dictionary
lookup = {each[0]:each[1] for each in lookup}

vfunc = np.vectorize(lambda x: lookup.get(x, x))

vfunc(x) # gives your result

вывод

array([[50,  5],
       [16,  6],
       [ 4,  3],
       [47,  4],
       [ 3, 47]])
0 голосов
/ 28 мая 2020

Мой подход для случая, когда x не содержит отрицательных или больших целых чисел:

a = np.arange(x.max()+1)

a[lookup[:,0]] = lookup[:,1]

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