2016-09-20 2 views
3

Я хотел бы получить индексы уникальных векторов, используя hash (для матриц он эффективен), но np.intersect1d не дает индексов, он дает значения. С другой стороны, np.in1d ​​дает индексы, но не уникальные. Я закрепил диктофон, чтобы он работал, но он не кажется наиболее эффективным. Я новичок в python, поэтому пытаюсь понять, есть ли лучший способ сделать это. Спасибо за помощь!Получите уникальные значения пересечения двух наборов

код:

import numpy as np 
import hashlib 
x=np.array([[1, 2, 3],[1, 2, 3], [4, 5, 6], [7, 8, 9]]) 
y=np.array([[4, 5, 6], [7, 8, 9],[1, 2, 3]]) 

xhash=[hashlib.sha1(row).digest() for row in x] 
yhash=[hashlib.sha1(row).digest() for row in y] 
z=np.intersect1d(xhash,yhash) 

idx=list(range(len(xhash))) 

d=dict(zip(xhash,idx)) 
unique_idx=[d[i] for i in z] #is there a better way to get this or boolean array 
print(unique_idx) 
uniques=np.array([x[i] for i in unique_idx]) 
print(uniques) 

выход:

>>> [2, 3, 1] 
[[4 5 6] 
[7 8 9] 
[1 2 3]] 

У меня аналогичная проблема для np.unique(), где он не дает мне никаких индексов.

+0

Получить индексы строки из [ 'ответов писал на этот вопрос'] (http://stackoverflow.com/questions/38674027/find-the-row-indexes-of-several-values-in-a-numpy-array) и просто индексируйте в первый массив с этими индексами для желаемого о/р. – Divakar

ответ

0

numpy_indexed пакета (отказ от ответственности: Я ее автор) имеет эффективную функциональность делают такие вещи, как это (и связанные с ними функциональными возможностями):

import numpy_indexed as npi 
uniques = npi.intersection(x, y) 

Обратите внимание, что это решение не использовать хеширование, но побитовое равенство элементы последовательности; так что риск возникновения хеш-коллизий и, скорее всего, намного быстрее на практике.

+0

Я загрузил через conda install numpy-indexed -c conda-forge, но я все равно получаю ImportError: нет модуля с именем numpy_indexed – Rik

+0

странно ... это указано, когда вы вызываете список conda на вашем env? –

+0

только что создал новую консоль env, используя 'conda create -n testnpi python numpy-indexed', и это то, что я получаю, когда я вызываю список conda: 'numpy-indexed 0.3.4 py35_0 conda-forge'; импорт numpy_indexed отлично работает. В последнее время вы запускаете «conda update conda»? –

0

Использование np.unique-х return_index свойство возвращать флаги для уникальных значений, даваемых in1d

код:

import numpy as np 
import hashlib 
x=np.array([[1, 2, 3],[1, 2, 3], [4, 5, 6], [7, 8, 9]]) 
y=np.array([[1, 2, 3], [7, 8, 9]]) 
xhash=[hashlib.sha1(row).digest() for row in x] 
yhash=[hashlib.sha1(row).digest() for row in y] 
z=np.in1d(xhash,yhash) 

##Use unique to get unique indices to ind1 results 
_,unique=np.unique(np.array(xhash)[z],return_index=True) 

##Compute indices by indexing an array of indices 
idx=np.array(range(len(xhash))) 
unique_idx=(np.array(idx)[z])[unique] 

print('x=',x) 
print('unique_idx=',unique_idx) 
print('x[unique_idx]=',x[unique_idx]) 

Выход:

x= [[1 2 3] 
[1 2 3] 
[4 5 6] 
[7 8 9]] 
unique_idx= [3 0] 
x[unique_idx]= [[7 8 9] 
[1 2 3]] 
Смежные вопросы