猿问

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

我有两组坐标,想找出该coo组的哪些坐标与该组中的任何坐标相同targets。我想知道coo集合中的索引,这意味着我想获取索引列表或布尔值列表。


import numpy as np


coo = np.array([[1,2],[1,6],[5,3],[3,6]]) # coordinates

targets = np.array([[5,3],[1,6]]) # coordinates of targets


print(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 配备了更优雅的解决方案的方法。


繁星coding
浏览 206回答 3
3回答

aluckdog

对于大型阵列,此解决方案的扩展性更差,对于这种情况,其他建议的答案将表现得更好。这是利用 的一种方法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.

慕仙森

该numpy_indexed的量化方式这种类型的包实现的功能(声明:我是它的作者)。遗憾的是,numpy 缺少很多这种开箱即用的功能;我开始使用 numpy_indexed 的目的是将它合并到 numpy 中,但是存在一些向后兼容性问题,并且像这样的大包往往移动缓慢。所以这在过去的 3 年里没有发生过;但是现在 Python 打包生态系统运行良好,只需在您的环境中再添加一个包也同样简单,真的。import numpy_indexed as npi bools = npi.in_(targets, coo)这将具有类似于@fountainhead 发布的解决方案的时间复杂度(根据当前接受的答案,是对数而不是线性),而且 npi 库将为您提供自动化测试的安全性,以及许多其他方便的选项,如果您决定从稍微不同的角度处理问题。

大话西游666

这是一个简单直观的解决方案,它实际使用numpy.isin(), 来匹配元组,而不是匹配单个数字:# View as a 1d array of tuplescoo_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'我们想要的视图中的每个元素指定要两个整数的元组
随时随地看视频慕课网APP

相关分类

Python
我要回答