我有两个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列值的最佳方法的任何帮助都将不胜感激。在
1644

被折叠的 条评论
为什么被折叠?



