You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在二维NumPy数组中查找另一数组相同行的位置?

解决方法

你的代码问题出在逐元素比较时,会把部分元素匹配的行索引也提取出来,同时每个完全匹配的行包含3个元素,导致对应索引重复3次。要找到整行匹配的索引,需要先判断每行所有元素是否都满足近似相等,再提取对应索引。

方法一:利用np.all结合np.isclose

这是最适合浮点数场景的方案,能处理精度问题:

import numpy as np

df1 = np.array([[0.000000,0.000000,0.000000],
[0.090000,0.000000,0.000000],
[0.190000,0.000000,0.000000],
[0.280000,0.000000,0.000000],
[0.380000,0.000000,0.000000],
[0.470000,0.000000,0.000000],
[0.570000,0.000000,0.000000],
[0.660000,0.000000,0.000000],
[0.760000,0.000000,0.000000],
[0.850000,0.000000,0.000000]])

df2 = np.array([[0.470000,0.000000,0.000000],
[0.570000,0.000000,0.000000],
[0.660000,0.000000,0.000000],
[0.760000,0.000000,0.000000],
[0.850000,0.000000,0.000000]
])

# 检查df1每行与df2每行是否所有元素都近似相等
row_matches = np.all(np.isclose(df1[:, np.newaxis], df2), axis=2)
# 提取匹配的df1行索引
df3 = np.argwhere(row_matches)[:, 0]

print(df3)
# 输出:[5 6 7 8 9]

代码说明:

  1. df1[:, np.newaxis]将df1转换为(10,1,3)的三维数组,和df2(5,3)广播后逐元素比较,得到(10,5,3)的布尔数组。
  2. np.all(..., axis=2)沿着列维度取逻辑与,得到(10,5)的数组,其中row_matches[i,j]为True表示df1第i行和df2第j行完全匹配。
  3. np.argwhere(row_matches)返回所有匹配的(i,j)坐标对,取第一列就是df1的行索引,正好对应df2每行的位置。

方法二:字典映射(适合无精度问题的场景)

如果可以确保浮点数没有精度误差,也可以用字典建立行到索引的映射:

import numpy as np

# 构建df1行到索引的映射(注意浮点数精度问题,必要时可先round)
index_map = {tuple(np.round(row, 6)): idx for idx, row in enumerate(df1)}
# 遍历df2获取对应索引
df3 = np.array([index_map[tuple(np.round(row, 6))] for row in df2])

print(df3)
# 输出:[5 6 7 8 9]

注意:

直接用tuple(row)可能因浮点数精度(如0.47实际存储为0.46999999999999997)导致匹配失败,所以建议先对浮点数做近似处理(如保留6位小数)。


内容的提问来源于stack exchange,提问作者jiaming li

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 07:33:18