在稀疏矩阵中找出n个最大数
我正在使用稀疏矩阵来压缩数据,当然会有一些损失。我做的就是从所有大于某个特定阈值的值中创建一个稀疏字典。我希望我的压缩数据大小可以让用户自己选择。
我的问题是,我有一个稀疏矩阵,里面有很多接近零的值。我需要选择一个阈值,这样我的稀疏字典就能达到特定的大小(或者最终重建误差达到特定的水平)。下面是我创建字典的方法(我想这是从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 大的值(大约)。