У меня есть список узлов (представленный переменной n, в этом простом примере узел - это просто целое число), который мне нужно использовать для выбора из массива. Я хочу выбирать столбцы из данных, пока все узлы не будут использованы в выбранных данных хотя бы один раз. Данные могут быть большими и отсортированы с помощью взвешенных столбцов сверху. Я предполагаю, что это можно решить с помощью двоичной индексации, но я также открыт для других numpy подходов.
>>> import numpy as np
>>>
>>> # nodes I need to use in selection
>>> n = np.array([1, 2, 3])
>>>
>>> data = np.array([[1, 1, 2, 2, 2, 3, 4, 5], [1, 1, 2, 2, 3, 3, 3, 3]])
>>>
>>> # select data columns until all nodes are used
>>> def selector(arr, n):
... un_used_nodes = set(n)
... def visitor(row):
... if not un_used_nodes:
... return False
... else:
... for p in row:
... un_used_nodes.discard(p)
... return True
... return np.apply_along_axis(visitor, 0, arr)
...
>>> print(data[:, selector(data, n)])
[[1 1 2 2 2]
[1 1 2 2 3]]
Я надеялся на "лучшую" поддержку этого в numpy, так что если есть более эффективный способ сделать это, пожалуйста, дайте мне знать.
Отказ от ответственности: Если вы считаете, что это не полезный / интересный вопрос, пожалуйста, дайте мне знать, так как я счастлив удалить его.