如何获取二维数组每行中最大的8个值及其对应索引
提取二维数组每行的Top8最大值及对应索引
你的代码将整个数组扁平化后查找全局最大的8个值,所以无法得到每行独立的Top8结果。下面是两种适合的numpy实现方法:
方法一:使用np.argsort(直观易读)
这种方法通过对每行元素排序,直接提取最大的8个值及其索引:
import numpy as np # 假设predicting是你的4148×167二维数组 # 按每行升序排序,得到元素索引 sorted_row_indices = np.argsort(predicting, axis=1) # 取每行最后8个索引(对应最大的8个值),反转后得到降序排列的索引 top8_indices = sorted_row_indices[:, -8:][:, ::-1] # 根据索引提取对应的Top8值(降序) top8_values = np.take_along_axis(predicting, top8_indices, axis=1)
axis=1参数确保操作在每行独立进行[:, -8:]筛选出每行最大的8个元素的索引[:, ::-1]将索引反转,实现降序排列
方法二:使用np.argpartition(高效优化)
如果数组规模极大,np.argpartition比完全排序更高效,它只需定位Top8元素的位置,无需全量排序:
import numpy as np # 对每行进行分区,定位最大的8个元素的位置(顺序未排序) partitioned_indices = np.argpartition(predicting, -8, axis=1)[:, -8:] # 生成行索引,用于后续索引定位 row_indices = np.arange(predicting.shape[0])[:, np.newaxis] # 对每行的Top8元素进行降序排序,得到最终的索引 top8_indices = partitioned_indices[row_indices, np.argsort(-predicting[row_indices, partitioned_indices], axis=1)] # 提取对应的Top8值 top8_values = np.take_along_axis(predicting, top8_indices, axis=1)
np.argpartition会将每行最大的8个元素移至末尾,操作时间复杂度更低- 通过
np.argsort(-...)对这8个元素的取值进行降序排序,修正索引顺序
结果说明
最终top8_indices是形状为4148×8的数组,每行存储对应行Top8值的原始列索引;top8_values是对应位置的数值,均按降序排列。
内容的提问来源于stack exchange,提问作者Maryam Faheem
相关产品推荐
相关产品推荐

