matlab intersect 3列,二维numpy数组搜索(相当于toMatlab的intersect'rows'选项)

我有两个4列numpy数组(2D),每个数组中有几百行(float)行(cap和usp)。考虑到每个数组中3列的子集(例如capind=cap[:,:3]):两个数组之间有许多公共行。在

每个行元组/“三元组”在每个数组中都是唯一的。在

我正在寻找一种有效的方法来识别这两个数组中常见的三个值(row)子集,同时以某种方式保留两个数组中的第四列以供进一步处理。本质上,我在寻找一种很好的numpy方法来实现Matlab的intersect函数与row option(即([c, ia, ib]=intersect(capind, uspind, 'rows');))的等效功能。在

它返回匹配行的索引,因此从原始数组(matchcap=cap[ia,:])的第4列中获取匹配的三元组和值变得很简单。在

我目前的方法是基于论坛上一个类似的问题,因为我找不到一个很好的匹配我的问题。然而,考虑到我的目标,这种方法似乎有点低效(我也没有完全解决我的问题):

数组是这样的:cap=array([[ 2.50000000e+01, 1.27000000e+02, 1.00000000e+00,

9.81997200e-06],

[ 2.60000000e+01, 1.27000000e+02, 1.00000000e+00,

9.14296800e+00],

[ 2.70000000e+01, 1.27000000e+02, 1.00000000e+00,

2.30137100e-04],

...,

[ 6.10000000e+01, 1.80000000e+02, 1.06000000e+02,

8.44939900e-03],

[ 6.20000000e+01, 1.80000000e+02, 1.06000000e+02,

4.77729100e-03],

[ 6.30000000e+01, 1.80000000e+02, 1.06000000e+02,

1.40343500e-03]])

usp=array([[ 4.10000000e+01, 1.31000000e+02, 1.00000000e+00,

5.24197200e-06],

[ 4.20000000e+01, 1.31000000e+02, 1.00000000e+00,

8.39178800e-04],

[ 4.30000000e+01, 1.31000000e+02, 1.00000000e+00,

1.20279900e+01],

...,

[ 4.70000000e+01, 1.80000000e+02, 1.06000000e+02,

2.48667700e-02],

[ 4.80000000e+01, 1.80000000e+02, 1.06000000e+02,

4.23304600e-03],

[ 4.90000000e+01, 1.80000000e+02, 1.06000000e+02,

1.02051300e-03]])

然后,我将每个4列数组(usp和cap)转换为一个三列数组(capind和uspind在下面显示为整数,以便于查看)。在

^{pr2}$

使用set操作可以得到匹配的三元组:carray=np.array([x for x in set(tuple(x) for x in capind) & set(tuple(x) for x in uspind)])。在

对于从uspind和capind数组中查找公共行值,这似乎非常有效。我现在需要从匹配的行中获取第4列的值(即,将carray与原始源数组(cap和usp)的前三列进行比较,并从第4列中获取值)。在

有没有更好更有效的方法来实现这一点?否则,对于从源数组中检索第4列值的最佳方法的任何帮助都将不胜感激。在

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值