Поиск индексов дубликатов в Python - PullRequest
1 голос
/ 05 марта 2020

У меня есть 2D numpy -ndarray со следующим размером: (416,2) т.е.

[[10,10],[3,6],[2,4],[10,10],[0,0],[2,4],...] et c

Мне нужно найти, есть ли дубликаты, и если да, то где они. Значение самих дубликатов не имеет значения (то есть приведенный выше пример будет: [0,2,3,5,...])

Есть ли способ добиться этого? Спасибо.

Ответы [ 4 ]

7 голосов
/ 05 марта 2020

Если у вас уже есть массив numpy, вы можете использовать np.unique и использовать флаг return_inverse. Используйте обратный массив, чтобы найти все позиции, где количество уникальных элементов превышает 1, и найти их индексы.

import numpy as np
arr = np.array([[10,10],[3,6],[2,4],[10,10],[0,0],[2,4]])
vals, inverse, count = np.unique(arr,
                                 return_inverse=True,
                                 return_counts=True,
                                 axis=0)
out = np.where(count[inverse] > 1)[0] #find all indices where counts > 1
print(out) #array([0, 2, 3, 5], dtype=int64)
0 голосов
/ 05 марта 2020

Или, если вы хотите сохранить все в numpy:

import numpy as np

narray = np.array([[10,10],[3,6],[2,4],[10,10],[0,0],[2,4]])
u, c = np.unique(narray, return_counts=True, axis = 0)
dup = u[c > 1]
array_indices = np.unique(np.nonzero(np.isin(narray, dup))[0])
0 голосов
/ 05 марта 2020

Вы можете сделать следующее:

a = np.array([[1, 2], [3, 4], [5, 6], [3, 4]])
temp = []
tempdict = {}
i = 0
for array in a:
    try:
        tempdict[str(array)].append(i)
    except:
        tempdict[str(array)] = [i]
    i += 1
for key in tempdict:
    if len(tempdict[key]) > 1:
        print(tempdict[key])

Это вернет индексы массива numpy, где есть дубликаты, и не требует преобразования в обычный список python.

0 голосов
/ 05 марта 2020

Если вы преобразуете массив numpy в список

items = [[10,10],[3,6],[2,4],[10,10],[0,0],[2,4]]
index = [i for i, v in enumerate(items) if items.count(v) > 1]

index будет [0, 2, 3, 5]

...