2010-07-07 77 views
2

我使用稀疏矩陣作爲壓縮數據的均值,當然,當我失去時,我所做的是從大於指定閾值的所有值創建稀疏字典。我想我的壓縮數據大小是我的用戶可以選擇的變量。在稀疏矩陣中查找n個最大數字

我的問題是,我有一個稀疏矩陣,有很多近零值,我必須做的是選擇一個閾值,以便我的稀疏字典具有特定的大小(或最終重建錯誤是具體率) 下面是我如何創建我的字典(從計算器,我認爲採取> <):

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)) 

我如何才能找到treshold使其等於我的數組(SMAT)的第n個最大的價值?

回答

2

scipy.stats.scoreatpercentile(arr,per)在給定的百分返回值:如果期望的百分在arr位於兩個點之間

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

的值內。

所以,如果你設置per=(len(smat)-n)/len(smat)然後

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

應該給您(接近)陣列SMAT的第n個最大的價值。

+0

正是我需要的感謝! – Manux 2010-07-07 15:25:11

+0

不客氣! – unutbu 2010-07-07 15:28:43

+0

Fwiw,scipy/stats.py會執行np.sort(),然後進行插值。 有一個std :: nth_element和std :: partial_sort, 但sort()真的很快。 – denis 2010-07-13 10:56:38