在稀疏矩阵中找出n个最大数

2 投票
1 回答
595 浏览
提问于 2025-04-16 00:56

我正在使用稀疏矩阵来压缩数据,当然会有一些损失。我做的就是从所有大于某个特定阈值的值中创建一个稀疏字典。我希望我的压缩数据大小可以让用户自己选择。

我的问题是,我有一个稀疏矩阵,里面有很多接近零的值。我需要选择一个阈值,这样我的稀疏字典就能达到特定的大小(或者最终重建误差达到特定的水平)。下面是我创建字典的方法(我想这是从stackoverflow上找到的 >.< ):

n = abs(smat) > treshold #smat is flattened(1D)
i = mega_range[n] #mega range is numpy.arange(smat.shape[0])
v = smat[n]
sparse_dict = dict(izip(i,v))

我该如何找到这个阈值,使它等于我的数组(smat)中第n大的值呢?

1 个回答

2

scipy.stats.scoreatpercentile(arr,per) 这个函数会返回一个数组中某个百分位数对应的值:

import scipy.stats as ss
print(ss.scoreatpercentile([1, 4, 2, 3], 75))
# 3.25

如果你想要的百分位数在数组 arr 中的两个点之间,它会进行插值计算。

所以如果你设置 per=(len(smat)-n)/len(smat),那么

threshold = ss.scoreatpercentile(abs(smat), per)

这个计算应该会给你数组 smat 中第 n 大的值(大约)。

撰写回答