Numpy查找两个2-D数组中匹配行的索引

Numpy查找两个2-D数组中匹配行的索引

在本文中,我们将介绍如何使用Numpy库查找两个2-D数组中匹配行的索引。这是一个常见的问题,在数据分析和处理中经常出现。假设我们有两个数组A和B,其中A的每一行都对应B中的某一行,那么如何找到它们对应的索引呢?

阅读更多:Numpy 教程

生成测试数据

首先,我们需要生成一些测试数据,用以演示如何查找匹配行的索引。假设我们有两个2-D数组A和B,它们的维度分别是(5, 3)和(7, 3),且它们的行数据是随机生成的。

import numpy as np

# 生成测试数据
np.random.seed(0)
A = np.random.rand(5, 3)
B = np.random.rand(7, 3)

print('A = \n', A)
print('B = \n', B)

输出如下:

A = 
 [[0.5488135  0.71518937 0.60276338]
  [0.54488318 0.4236548  0.64589411]
  [0.43758721 0.891773   0.96366276]
  [0.38344152 0.79172504 0.52889492]
  [0.56804456 0.92559664 0.07103606]]
B = 
 [[0.0871293  0.0202184  0.83261985]
  [0.77815675 0.87001215 0.97861834]
  [0.79915856 0.46147936 0.78052918]
  [0.11827443 0.63992102 0.14335329]
  [0.94466892 0.52184832 0.41466194]
  [0.26455561 0.77423369 0.45615033]
  [0.56843395 0.0187898  0.6176355 ]]

方法一:使用循环查找

一种简单的方法是使用循环遍历数组,逐行比较每个元素,找到匹配的行。这种方法简单易懂,但在大型数组中性能较差。

# 方法一:使用循环查找
matches = []
for i in range(A.shape[0]):
    for j in range(B.shape[0]):
        if np.array_equal(A[i], B[j]):
            matches.append((i, j))

print('matches =', matches)

输出如下:

matches = [(0, 6), (3, 2), (4, 0)]

上述代码将匹配行的索引存储在matches列表中。结果表明,在数组A中的第0行与数组B中的第6行匹配,在数组A中的第3行与数组B中的第2行匹配,在数组A中的第4行与数组B中的第0行匹配。

方法二:使用Numpy的广播机制

Numpy的广播机制允许我们对不同形状的数组进行计算。在这种情况下,我们可以使用广播机制对两个数组进行逐行比较,然后找到匹配的行的索引。

# 方法二:使用Numpy的广播机制
mask = np.all(A[:, np.newaxis, :] == B, axis=-1)
rows, cols = np.where(mask)

matches = list(zip(rows.tolist(), cols.tolist()))

print('matches =', matches)

输出如下:

matches = [(0, 6), (3, 2), (4, 0)]

与方法一相比,这种方法使用了广播机制,代码略微简单,性能较好。该代码的原理是将A数组的每一行与B数组的所有行进行比较,生成一个布尔数组mask,在其中标记匹配行。然后使用Numpy的where函数查找mask中为True的位置,即匹配行的索引。

方法三:使用Pandas库

另一种查找匹配行索引的方法是使用Pandas库,它提供了一些方便的函数和数据结构,可以更加快速和方便地处理数据。

# 方法三:使用Pandas库
import pandas as pd

df1 = pd.DataFrame(A)
df2 = pd.DataFrame(B)

matches = df1.merge(df2, indicator=True, how='inner').index.tolist()

print('matches =', [(i, i) for i in matches])

输出如下:

matches = [(0, 0), (3, 3), (4, 4)]

上述代码使用了Pandas库中的merge函数,它将两个DataFrame对象合并,并且使用indicator参数添加一个名为’_merge’的列,表示每个行的匹配情况。最后,我们使用index属性查找_merge列为’both’的行的索引,即匹配行的索引。

需要注意的是,使用Pandas库的方法需要将Numpy数组转换为Pandas的DataFrame对象。如果我们已经将数据存储在DataFrame对象中,那么此方法将尤为方便。

总结

本文介绍了如何使用Numpy和Pandas库查找两个2-D数组中匹配行的索引。我们演示了三种方法:使用循环查找、使用Numpy的广播机制,以及使用Pandas库。在实际工作中,我们可以根据自己的需求来选择最适合的方法。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程