如何使用numpy将float数组转换为含原值和索引的元组数组
Numpy获取数组最小N个值对应原索引的实现方案
1. 「值+原索引」结构的内置生成方法
你需要的等价元组数组的结构可以直接通过np.column_stack实现,完全不需要手写for循环,示例代码如下:
import numpy as np # 示例float数组 float_arr = np.array([2.1, 0.8, 5.4, 3.7, 1.2, 4.9]) # 生成第一列为原数值、第二列为对应原索引的二维数组,等价你要的元组数组效果 val_index_arr = np.column_stack((float_arr, np.arange(float_arr.size)))
生成后你也可以按自己原来的思路对第一列排序再取索引,不过有更高效的方案可以跳过这一步。
2. 更优的最小N值索引获取方案
不需要手动做值和索引的绑定、再全量排序,numpy有原生方法可以直接得到结果,根据场景可以选两种实现:
- 场景1:数组规模小(长度<1e4),优先选简洁方案
直接用全排序方法np.argsort取前N位即可,代码如下:
得到的索引是严格按照对应值从小到大排序的。N = 3 # 要获取的最小元素数量 min_n_index = np.argsort(float_arr)[:N] - 场景2:数组规模大(长度>1e5),优先选高性能方案
用np.argpartition做部分排序,时间复杂度为O(n),远低于全排序的O(nlogn),适合N远小于数组长度的场景:# 得到最小N个值的索引,这N个索引内部暂时不保证按值排序 min_n_index_part = np.argpartition(float_arr, N)[:N] # 如果需要这N个索引按对应值升序排列,再加一步小范围排序即可 min_n_index_sorted = min_n_index_part[np.argsort(float_arr[min_n_index_part])]
内容的提问来源于stack exchange,提问作者David Thielen
相关产品推荐
相关产品推荐

