2016-05-13 86 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

谢谢。它运作良好。 –