Numpy "внутреннее соединение" с повторяющимся ключом - PullRequest
0 голосов
/ 18 февраля 2019

Я пытался найти значения в массиве, используя «ключи» в другом массиве.К сожалению, из-за того, что «пространство» ключей слишком велико (но редко), я не могу преобразовать его в индексный трюк (используя массив в качестве индекса).

Я нашел «недокументированную» функцию np.lib.recfunctions.join_by, котораяболее или менее позволяет мне выбирать «ключом» вместо индекса, вот пример:

import numpy as np
from numpy.lib import recfunctions  # necessary!

>>> a = np.array([100,200,500,700,200,500,100,700,200], dtype=[('key','i')])
array([(100,), (200,), (500,), (700,), (200,), (500,), (100,), (700,),
       (200,)], dtype=[('key', '<i4')])

>>> b = np.array([(100,10),(200,20),(500,50),(700,70)], dtype=[('key','i'),('value','i')])
array([(100, 10), (200, 20), (500, 50), (700, 70)],
      dtype=[('key', '<i4'), ('value', '<i4')])

>>> np.lib.recfunctions.join_by('key', a, b, usemask=False)
array([(100,     10), (200,     20), (200, 999999), (500,     50),
       (500, 999999), (500, 999999), (700,     70), (700, 999999),
       (700, 999999)], dtype=[('key', '<i4'), ('value', '<i4')])

Оказывается, эта функция не поддерживает повторяющиеся «ключи».Мне интересно, как я могу получить результат, такой как

array([(100,10),(200,20),(500,50),(700,70),(200,20),(500,50),(100,10)...])

, который точно соответствует порядку a и имеет дополнительный столбец результата поиска .Любая помощь приветствуется!

1 Ответ

0 голосов
/ 19 февраля 2019

Я обнаружил, что могу заново сопоставить все возможные ключи с индексом.Для a и b выше, предположим, что b отсортировано, я могу использовать

indexOfAInB = np.unique(np.r_[a['key'],b['key']], return_inverse=True)[1][:len(a)]

, чтобы получить отображение.Затем я могу использовать индексный трюк:

B['value'][indexOfAInB]

, чтобы получить «результат поиска».

Так как np.unique внутренняя сортировка, я полагаю, что это займет O(nlogn) время.Тем не менее, любые предложения о лучшем способе приветствуются!

Кстати, этот метод не поддерживает key в a, который отсутствует в b

...