2016-05-13 32 views
0

我在Python中執行SVD,我的數據索引範圍是150,000到160,000。由於這種SVD正在變得非常耗費資源。如何在保留重複項的同時將此數據的範圍更改爲0-10,000。在Python中更改數字範圍

Eg: i have consecutive data points :150001,150001,155003,156004,157005 

it should map to :1,1,2,3,4 

這樣的範圍縮小,我不必交出一個高度稀疏的數據martrix。

我的主要要求是,我需要映射如(169,169,256,945,3445,9999)數據轉換成(0,0,1,2,3,4)

+4

聽起來這裏的答案只是「減去150000」。如果你需要幫助減去150000,我們將需要看到更多的上下文。 – user2357112

+0

如user2357112提到:'remapped_data = [num-150000 for num in data]' –

+0

Scipy具有稀疏矩陣函數。 – davo36

回答

1

下面的代碼記錄在數字列表中的唯一編號的指標在排名順序爲:

>>> import numpy as np 
>>> v = [169,169,256,945,945,945,345,9999] 
>>> np.hstack([0, np.cumsum(np.diff(v)!=0)]) 
array([0, 0, 1, 2, 2, 2, 3, 4]) 

請更新的問題,以反映這些要求。

0

我寫了一個小的功能這一點,我希望有一個更簡單的方法來做同樣的事情。

def range_minimizer(): 
    ind=0 

    for i in d1.index: 
     if i==0: 
      d1['new_index']=0 

     else: 
      if d1['movie'][i]==d1['movie'][i-1]: 
       d1['new_index'][i]=ind 
      else: 
       ind+=1 
       d1['new_index'][i]=ind 

FYI我的數據是這樣的

user movie rating 
0  1  169  2.5 
1  1 2471  3.0 
2  1 48516  5.0 
3  2 2571  3.5 
4  2 109487  4.0 

上的數據我得到的最終結果運行此功能後:

user movie rating ind 
0  1  169  2.5 0 
1  1 2471  3.0 1 
2  1 48516  5.0 2 
3  2 48516  3.5 2 
4  2 109487  4.0 3 
+0

咦?這與你的問題有什麼關係? 150001的東西在哪裏? – mwm314

+0

即時給你我的數據的另一個例子。儘管數據不同,但這一點仍然相同。 –

+0

爲什麼電影專欄改變了?你有意這麼做嗎? – mwm314

1

IIUC,你可以在一個系列(docs)使用rank(method='dense')

>>> df = pd.DataFrame({"a": [150001,150001,155003,156004,157005]}) 
>>> df 
     a 
0 150001 
1 150001 
2 155003 
3 156004 
4 157005 
>>> df["a_rank"] = df["a"].rank(method="dense").astype(int) 
>>> df 
     a a_rank 
0 150001  1 
1 150001  1 
2 155003  2 
3 156004  3 
4 157005  4 
+0

謝謝。它運作良好。 –