获取两个集合的唯一交集值

3
我希望使用哈希值来获取唯一向量的索引(对于矩阵而言,这是有效的),但是np.intersect1d不会给出索引,它只会给出值。另一方面,np.in1d确实提供了索引,但不是唯一的索引。我将一个字典压缩成zip对象来使其工作,但它似乎不是最有效的方法。我刚开始学习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()函数时它没有返回任何索引。


answers posted to this question获取行索引,然后使用这些索引在第一个数组中进行索引以获得所需的输出。 - Divakar
2个回答

1

numpy_indexed包(免责声明:我是其作者)具有高效的功能,可以执行此类操作(以及相关功能):

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

请注意,此解决方案不使用哈希,而是使用序列元素的位相等性;因此不存在哈希冲突的风险,并且在实践中可能更快。

我通过conda install numpy-indexed -c conda-forge下载了numpy-indexed,但仍然出现ImportError: No module named 'numpy_indexed'的错误。 - Rik
当你在环境中调用 conda list 时,它是否被列出来?有点奇怪…… - Eelco Hoogendoorn
我刚刚使用'conda create -n testnpi python numpy-indexed'创建了一个新的conda环境,当我调用conda list时得到以下结果:'numpy-indexed 0.3.4 py35_0 conda-forge';导入numpy_indexed也可以正常工作。最近你是否运行过'conda update conda'? - Eelco Hoogendoorn
嗯,是的,我尝试过了,但是出现了这个错误:rik@rik-MS-7971:~$ conda create -n testnpi python numpy-indexed 正在获取软件包元数据....... 正在解决软件包规格: . PackageNotFoundError: 找不到软件包:'' 当前 linux-64 频道中缺少软件包:
  • numpy-indexed
您可以使用以下命令在 anaconda.org 上搜索软件包:anaconda search -t conda numpy-indexed
- Rik
抱歉,我是个新手,不太清楚如何处理这些东西。 - Rik
显示剩余2条评论

1
使用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]]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接