3 回答
TA贡献1847条经验 获得超7个赞
对于大型阵列,此解决方案的扩展性更差,对于这种情况,其他建议的答案将表现得更好。
这是利用 的一种方法broadcasting:
(coo[:,None] == targets).all(2).any(1)
# array([False, True, True, False])
细节
通过添加第一个轴的直接比较来检查每一行coo是否与另一行匹配target,coo因此它可以针对 广播targets:
(coo[:,None] == targets)
array([[[False, False],
[ True, False]],
[[False, False],
[ True, True]],
[[ True, True],
[False, False]],
[[False, False],
[False, True]]])
然后检查ndarrays沿第二个轴的all值True:
(coo[:,None] == targets).all(2)
array([[False, False],
[False, True],
[ True, False],
[False, False]])
最后用于any检查哪些行至少有一个True.
TA贡献1827条经验 获得超7个赞
该numpy_indexed的量化方式这种类型的包实现的功能(声明:我是它的作者)。遗憾的是,numpy 缺少很多这种开箱即用的功能;我开始使用 numpy_indexed 的目的是将它合并到 numpy 中,但是存在一些向后兼容性问题,并且像这样的大包往往移动缓慢。所以这在过去的 3 年里没有发生过;但是现在 Python 打包生态系统运行良好,只需在您的环境中再添加一个包也同样简单,真的。
import numpy_indexed as npi bools = npi.in_(targets, coo)
这将具有类似于@fountainhead 发布的解决方案的时间复杂度(根据当前接受的答案,是对数而不是线性),而且 npi 库将为您提供自动化测试的安全性,以及许多其他方便的选项,如果您决定从稍微不同的角度处理问题。
TA贡献1817条经验 获得超14个赞
这是一个简单直观的解决方案,它实际使用numpy.isin(), 来匹配元组,而不是匹配单个数字:
# View as a 1d array of tuples
coo_view = coo.view(dtype='i,i').reshape((-1,))
targets_view = targets.view(dtype='i,i').reshape((-1,))
result = np.isin(coo_view, targets_view)
print (result)
print(result.nonzero()[0])
输出:
[False True True False]
[1 2]
笔记:
这些视图的创建不涉及任何数据复制。
在dtype='i,i'我们想要的视图中的每个元素指定要两个整数的元组
添加回答
举报