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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:57:14