Python中按元素数量拆分数组:KNN分类需提取二维数组前k元素
如何在Python中按元素数量拆分数组(KNN任务提取前k个元素)
嘿,刚好我之前做KNN分类的时候也碰到过类似的需求,来给你分享几种实用的方法,不管是提取前k个元素,还是把数组按固定大小拆分都能用!
方法一:直接切片(最适合KNN提取前k个元素)
这是最直接高效的方式,不管你用普通Python列表还是numpy数组(KNN里常用numpy处理数据),都能直接用切片语法搞定。
针对普通二维列表
如果你的数据是普通二维列表,要提取前k个元素(也就是前k行),直接用arr[:k]就行:
# 示例二维列表(模拟KNN的特征数组) X = [[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]] k = 3 # 要提取的前k个元素数量 top_k_elements = X[:k] print(top_k_elements) # 输出: [[1, 2], [3, 4], [5, 6]]
针对numpy数组
KNN任务里我们通常会用numpy来处理大规模数据,切片用法和列表完全一致,而且效率更高:
import numpy as np # 转换成numpy数组 X_np = np.array([[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]]) k = 3 top_k_np = X_np[:k] print(top_k_np)
方法二:拆分成多个固定大小的子数组
如果你不是要提取前k个,而是要把一个大数组拆分成多个含m个元素的子数组(比如把100个样本拆成每组10个),可以用列表推导式来实现:
def split_array(arr, chunk_size): # 按chunk_size大小拆分,最后一组如果不够会保留剩余元素 return [arr[i:i+chunk_size] for i in range(0, len(arr), chunk_size)] # 示例:拆分一维数组 big_arr = [1, 2, 3, 4, 5, 6, 7, 8] chunked_arr = split_array(big_arr, 2) print(chunked_arr) # 输出: [[1, 2], [3, 4], [5, 6], [7, 8]] # 示例:拆分二维数组(比如把10行的特征数组拆成每组3行) X_2d = [[i, j] for i in range(10) for j in range(2)] # 10行2列的二维列表 chunked_2d = split_array(X_2d, 3) print(chunked_2d) # 输出会是3个子数组:前3行、中间3行、最后4行
KNN场景下的进阶用法
在KNN分类中,我们经常需要对每个样本的邻居取前k个(比如计算完距离后,取距离最近的k个邻居),这时候可以结合numpy.argsort()来实现:
import numpy as np # 假设已经计算好每个样本到其他样本的距离矩阵(shape: [n_samples, n_samples]) distances = np.array([ [0, 2, 1, 3], # 样本0到其他样本的距离 [2, 0, 4, 1], # 样本1到其他样本的距离 [1, 4, 0, 2], # 样本2到其他样本的距离 [3, 1, 2, 0] # 样本3到其他样本的距离 ]) k = 2 # 取前2个最近的邻居 # 对每行距离排序,取前k个邻居的索引(注意排除自己,所以从索引1开始) top_k_neighbor_indices = np.argsort(distances)[:, 1:1+k] # 根据索引提取对应的样本特征 X = np.array([[1,2], [3,4], [5,6], [7,8]]) top_k_neighbors = X[top_k_neighbor_indices] print(top_k_neighbors)
这里排序后取索引是因为我们需要找到距离最近的样本位置,再根据位置提取对应的特征或标签,后续就可以统计邻居的类别进行投票分类啦。
内容的提问来源于stack exchange,提问作者Gurz Singh
相关产品推荐
相关产品推荐

