Скажем, у меня есть отсортированный Numpy массив:Как найти индексы переупорядоченного массива numpy?
arr = np.array([0.0, 0.0],
[0.5, 0.0],
[1.0, 0.0],
[0.0, 0.5],
[0.5, 0.5],
[1.0, 0.5],
[0.0, 1.0],
[0.5, 1.0],
[1.0, 1.0])
и предположим, что я сделать нетривиальное операцию на ней таким образом, что у меня есть новый массив, который является таким же, как и старый, но в другом порядке:
arr2 = np.array([0.5, 0.0],
[0.0, 0.0],
[0.0, 0.5],
[1.0, 0.0],
[0.5, 0.5],
[1.0, 0.5],
[0.0, 1.0],
[1.0, 1.0],
[0.5, 1.0])
Вопрос: как получить индексы, где каждый элемент arr2
размещен в arr
. Другими словами, мне нужен метод, который принимает оба массива и возвращает массив той же длины, что и arr2
, но с индексом элемента arr
. Например, первым элементом возвращаемого массива будет индекс первого элемента arr2
в arr
.
where_things_are(arr2, arr)
return : array([1, 0, 3, 2, 4, 5, 6, 8, 7])
Есть ли такая функция, которая уже существует в numpy?
EDIT:
Я пробовал:
np.array([np.where((arr == x).all(axis=1)) for x in arr2])
который возвращает то, что я хочу, но все еще держит мой вопрос: есть ли более эффективный способ сделать это с помощью Numpy методы?
EDIT2:
Он также должен работать, если длина arr2
не такой же, как длина исходного массива (например, если я удалил некоторые элементы из него). Таким образом, он не находит и не инвертирует перестановку, а скорее находит, где находятся элементы.
«обратный» не будет уникальным - гораздо лучше увеличить оригинал arr с добавленной осью индексов, перенести его через «нетривиальную операцию» – f5r5e5d
Нетривиальная операция, которую я использую, сохранит уникальность да, но сохраняя исходные индексы не помогут, так как операция не сохраняет порядок. – fgoudra
применяют ту же операцию переупорядочения к оси добавленных индексов, после чего индексы по-прежнему маркируют исходные позиции преобразованных элементов arr, легко сортируются по оси добавленных индексов для восстановления исходного порядка. – f5r5e5d