如何在二维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]
代码说明:
df1[:, np.newaxis]将df1转换为(10,1,3)的三维数组,和df2(5,3)广播后逐元素比较,得到(10,5,3)的布尔数组。np.all(..., axis=2)沿着列维度取逻辑与,得到(10,5)的数组,其中row_matches[i,j]为True表示df1第i行和df2第j行完全匹配。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
相关产品推荐
相关产品推荐

