ith*_*140 5 python arrays numpy
我有两个4列numpy数组(2D),每行有几百个(浮点)行(cap和usp).考虑每个数组中3列的子集(例如capind=cap[:,:3]):
我正在寻找一种有效的方法来识别两个阵列中这些常见的三个值(行)子集,同时保留两个阵列中的第4列以进行进一步处理.从本质上讲,我正在寻找一种很好的numpy方式来做相当于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]])
Run Code Online (Sandbox Code Playgroud)
然后我将每个4列数组(usp和cap)转换为三列数组(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]])
Run Code Online (Sandbox Code Playgroud)
使用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列值的最佳方法的任何帮助.
尝试使用词典。
capind = {tuple(row[:3]):row[3] for row in cap}
uspind = {tuple(row[:3]):row[3] for row in usp}
keys = capind.viewkeys() & uspind.viewkeys()
for key in keys:
# capind[key] and uspind[key] are the fourth columns
Run Code Online (Sandbox Code Playgroud)