我有两个4列numpy数组(2D),每个数组有100个(浮点)行(cap和usp)。考虑每个阵列中3列的子集(例如capind=cap[:,:3]
):2D numpy数组搜索(相当于Matlab的相交'行'选项)
- 在两个阵列之间有许多共同的行。
- 每一行元组/“三元组”在每个数组中都是唯一的。
我正在寻找一种有效的方法来识别这两个数组中的常见三个值(行)子集,同时以某种方式保留两个数组中的第四列以供进一步处理。实质上,我正在寻找一种很好的方式来做与Matlab行相同的行选项(即([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和帽)转换成一个三列的阵列(capind和下面uspind示出为为了便于观察的整数)。
capind=array([[ 25, 127, 1],
[ 26, 127, 1],
[ 27, 127, 1],
...,
[ 61, 180, 106],
[ 62, 180, 106],
[ 63, 180, 106]])
uspind=array([[ 41, 131, 1],
[ 42, 131, 1],
[ 43, 131, 1],
...,
[ 47, 180, 106],
[ 48, 180, 106],
[ 49, 180, 106]])
使用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列中获取值)。
有没有更好的方法来实现这一目标?否则,任何有关从源数组中检索第四列值的最佳方法的帮助将不胜感激。
这几乎是有一个小correction.'capind = {元组(行[3]):行[3]行中cap} uspind = {tuple(row [:3]):row [3] for usp}} – ith140
我想保留数组结构,因为我不想遍历字典。我需要稍后对cap和usp中的常见元素进行一些数组运算。 – ith140
你可以让他们回到事后阵列... – nneonneo