我有兩個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