У меня есть 3 numy recarrays со следующей структурой.
Первый столбец - это некоторая позиция (целое число), а второй столбец - оценка (число с плавающей запятой).
Введите:
a = [[1, 5.41],
[2, 5.42],
[3, 12.32],
dtype=[('position', '<i4'), ('score', '<f4')])
]
b = [[3, 8.41],
[6, 7.42],
[4, 6.32],
dtype=[('position', '<i4'), ('score', '<f4')])
]
c = [[3, 7.41],
[7, 6.42],
[1, 5.32],
dtype=[('position', '<i4'), ('score', '<f4')])
]
Все 3 массива содержат одинаковое количество элементов.
Я ищу эффективный способ объединить эти три двумерных массива в один массив на основе столбца позиции.
Выходные данные для приведенного выше примера должны выглядеть следующим образом:
Выход:
output = [[3, 12.32, 8.41, 7.41],
dtype=[('position', '<i4'), ('score1', '<f4'),('score2', '<f4'),('score3', '<f4')])]
Только строка с позицией 3 находится в выходном массиве, потому что эта позиция появляется во всех 3 входных массивах.
Обновление : Мой наивный подход состоит в следующем:
- создать вектор первых столбцов моих 3 входных массивов.
- используйте intersect1D, чтобы получить пересечение этих 3 векторов.
- каким-то образом получить индексы для вектора для всех 3 входных массивов.
- создать новый массив с отфильтрованными строками из 3 входных массивов.
Update2 :
Каждое значение позиции может быть в одном, двух или всех трех входных массивах. В моем выходном массиве я хочу включить только строки для значений положения, которые появляются во всех 3 входных массивах.