Отфильтруйте строки в списке кортежей, используя numpy - PullRequest
0 голосов
/ 12 ноября 2018

Я ищу более быстрый способ отфильтровать список кортежей, используя пустые и избегающие циклы.

A = [(27157, 4),
       (24814, 0),
       (1047, 2),
       (18265, 2),
       (2857, 4),
       (23854, 2),
       (36881, 0)]

Теперь мне нужно отфильтровать его по второму элементу, т.е. 4. Если '4 'присутствует в форме одного списка' B ', если не в форме списка' C '.

То есть:

B = [(27157, 4),(2857, 4)]
C = [(24814, 0),(1047, 2),(18265, 2),(23854, 2),(36881, 0)]

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

Чтобы быть быстрым, вы должны превратить свой список кортежей в более эффективную структуру данных.если вы хотите сохранить кортежи, вы можете использовать структурированный массив:

dt=dtype([('val',int),('key',int)])
B=ndarray(len(A),dt,array(A))

B[B['key']==4] #--> array([(27157, 4), ( 2857, 4)],...
B[B['key']!=4] #--> array([(24814, 0), ( 1047, 2), (18265, 2), (23854, 2), (36881, 0)],...
0 голосов
/ 12 ноября 2018

С NumPy вы можете использовать логическое индексирование для возврата массивов:

mask = A[:, 1] == 4
B = A[mask]
C = A[~mask]

Для этого необходимо, чтобы ваш ввод был массивом NumPy:

A = np.array([(27157, 4),
              (24814, 0),
              (1047, 2),
              (18265, 2),
              (2857, 4),
              (23854, 2),
              (36881, 0)])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...