import numpy as np
a = np.array([range(11,21), range(11,21)]).reshape(20)
b = np.array([12, 17, 20])
print(np.intersect1d(a,b))
# unique values
inter = np.in1d(a, b)
print(a[inter])
# you can see these values are not unique
indices=np.array(range(len(a)))[inter]
# These are the non-unique indices
_,unique=np.unique(a[inter], return_index=True)
uniqueIndices=indices[unique]
# this grabs the unique indices
print(uniqueIndices)
print(a[uniqueIndices])
# now they are unique as you would get from np.intersect1d()
5条答案
按热度按时间htrmnn0y1#
您可以使用
in1d
生成的布尔数组来索引arange
。颠倒a
,使索引与以下值不同:intersect1d
仍然返回相同的值...但是
in1d
返回一个布尔数组:它可用于为范围编制索引:
不过,要简化上面的操作,可以使用
nonzero
--这可能是最正确的方法,因为它返回X
、Y
……坐标:或者,等同地:
结果可以用作与
a
形状相同的数组的索引,没有问题。但请注意,在许多情况下,只使用布尔数组本身而不是将其转换为一组非布尔索引是有意义的。
最后,您还可以将布尔数组传递给
argwhere
,它会产生一个形状稍有不同的结果,不太适合索引,但可能用于其他目的。8e2ybdfx2#
如果需要获取intersect1d给出的唯一值:
产出:
u0sqgete3#
zte4gxcn4#
对于
Python >= 3.5
,有另一种解决方案可以这样做其他解决方案
让我们一步一步地来做这件事。
根据问题中的原始代码
首先,我们创建一个带零的Numy数组
输出
其次,使用INTERSECT索引更改c的数组值。因此,我们有
输出
最后一步,利用
np.nonzero()
的特性,它将精确地返回您想要的非零项的index。最终产出
参考
[1][numpy.nonzero](https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.nonzero.html)
aemubtdh5#
从NumPy 1.15.0版开始,intersect1d有一个RETURN_INDEX选项: