python - 二维 numpy 数组搜索(相当于 Matlab 的 intersect 'rows' 选项)

标签 python arrays numpy

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

  1. 两个数组之间有很多共同的行。
  2. 每一行元组/“三元组”在每个数组中都是唯一的。

我正在寻找一种有效的方法来识别两个数组中这些常见的三值(行)子集,同时以某种方式保留两个数组的第 4 列以供进一步处理。本质上,我正在寻找一种很好的 numpy 方法来使用 row 选项执行与 Matlab 的相交函数等效的操作(即 ([c, ia, ib]=intersect(capind, uspind, 'rows');).

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


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

数组是这样的:

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 在下面显示为整数以便于查看)。

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]])

使用集合操作给我匹配的三元组:carray=np.array([x for x in set(tuple(x) for x in capind) & set(tuple(x) for x in uspind) ]).

对于从 uspind 和 capind 数组中查找公共(public)行值来说,这似乎工作得相当好。我现在需要从匹配行中获取第 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

关于python - 二维 numpy 数组搜索(相当于 Matlab 的 intersect 'rows' 选项),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24144770/

相关文章:

python - 在 linux 中用 python 编程时如何在 nano 中进行自动缩进?

c - 指向整数数组的指针在 C 中如何工作?

c++ - C++ 数组中的重载运算符

python - 如何重复移动和填充列表中的元素以获得列表列表?

python - 尝试解压 simple.txt 文件时出现 ValueError : too many values to unpack,

python - 使用 Python 处理 csv 文件时如何跳过标题?

python - 从python访问WMI信息

python - 在 Python 中使用 WlanScan 强制 wifi 扫描

c - 在结构中声明数组

python - numpy.ma.cov - 与缺失值的成对相关性?