为了账号安全,请及时绑定邮箱和手机立即绑定

如何匹配包含在两个 numpy 数组中的成对值

如何匹配包含在两个 numpy 数组中的成对值

繁星coding 2021-11-16 16:05:11
我有两组坐标,想找出该coo组的哪些坐标与该组中的任何坐标相同targets。我想知道coo集合中的索引,这意味着我想获取索引列表或布尔值列表。import numpy as npcoo = np.array([[1,2],[1,6],[5,3],[3,6]]) # coordinatestargets = np.array([[5,3],[1,6]]) # coordinates of targetsprint(np.isin(coo,targets))[[ True False] [ True  True] [ True  True] [ True  True]]所需的结果将是以下两个之一:[False True True False] # bool list[1,2] # list of concerning indices我的问题是,那...np.isin没有 -axis属性,所以我可以使用axis=1.即使将逻辑和应用于输出的每一行也会返回True最后一个元素,这是错误的。我知道循环和条件,但我确信 Python 配备了更优雅的解决方案的方法。
查看完整描述

3 回答

?
aluckdog

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.


查看完整回答
反对 回复 2021-11-16
?
慕仙森

TA贡献1827条经验 获得超7个赞

numpy_indexed的量化方式这种类型的包实现的功能(声明:我是它的作者)。遗憾的是,numpy 缺少很多这种开箱即用的功能;我开始使用 numpy_indexed 的目的是将它合并到 numpy 中,但是存在一些向后兼容性问题,并且像这样的大包往往移动缓慢。所以这在过去的 3 年里没有发生过;但是现在 Python 打包生态系统运行良好,只需在您的环境中再添加一个包也同样简单,真的。

import numpy_indexed as npi
bools = npi.in_(targets, coo)

这将具有类似于@fountainhead 发布的解决方案的时间复杂度(根据当前接受的答案,是对数而不是线性),而且 npi 库将为您提供自动化测试的安全性,以及许多其他方便的选项,如果您决定从稍微不同的角度处理问题。


查看完整回答
反对 回复 2021-11-16
?
大话西游666

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'我们想要的视图中的每个元素指定要两个整数的元组


查看完整回答
反对 回复 2021-11-16
  • 3 回答
  • 0 关注
  • 205 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信