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

如何用numpy.argpartition结果构建掩码以保留距离矩阵每行k个最小值?

解决方法

1. 正确创建掩码并生成密集矩阵

你的问题出在np.isin(data, nn_indices)的用法上——data是距离矩阵的数值,nn_indices是列索引,两者类型和含义完全不同,自然得不到正确的掩码。

正确的做法是利用行索引和得到的列索引来标记需要保留的位置:

import numpy as np

# 示例输入数据
data = np.array([[4, 6, 1, 3],
                 [1, 5, 6, 7],
                 [4, 7, 2, 3],
                 [7, 1, 8, 2]])
n = data.shape[0]
k = 2

# 获取每行前k小值的列索引
nn_indices = np.argpartition(data, k - 1)[:, :k]

# 创建全False的掩码
mask = np.zeros_like(data, dtype=bool)
# 为每行的指定列索引位置设为True
mask[np.arange(n)[:, None], nn_indices] = True

# 生成保留k个最小值的矩阵(其余为0)
result = np.where(mask, data, 0)
print(result)

运行后会得到你期望的输出:

[[0 0 1 3]
 [1 5 0 0]
 [0 0 2 3]
 [0 1 0 2]]

2. 直接构建Scipy稀疏矩阵(csr_matrix)

如果要直接生成稀疏矩阵,不需要先构建密集矩阵,可以提取保留位置的行坐标、列坐标、对应数值,然后传入csr_matrix:

from scipy.sparse import csr_matrix

# 提取行索引:每行重复k次(因为每行保留k个值)
rows = np.repeat(np.arange(n), k)
# 提取列索引:把nn_indices展平成一维数组
cols = nn_indices.flatten()
# 提取对应位置的数值
values = data[rows, cols]

# 构建csr稀疏矩阵
sparse_mat = csr_matrix((values, (rows, cols)), shape=(n, n))

# 可以转为密集矩阵验证结果
print(sparse_mat.toarray())

这样得到的稀疏矩阵和上面的密集矩阵完全对应,同时节省内存(适合大矩阵场景)。


内容的提问来源于stack exchange,提问作者RustyBrain

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 04:55:30