2011-11-21 73 views
0

我有一个不均匀长度值的列表,现在我想将它们转换为从1到100的列表。 因此,如果列表有100个值,那么在位置10将是列表[10]Python list value intersection

现在,当我有一个248值的列表,我想要做一个这样的线图和X轴范围从1-100%,所以我可以问/相交什么值在位置10.

或者另一种选择可能是它的值为248(线图),你在x轴上询问2.48的值,它返回某个y值。然后重复100次,每次为x轴值加2.48。

numpy或matplotlib能够做到这一点吗?我不需要整个解释c.q.码。但是,一个好例子或者一个好的方向碰撞会很好。

http://docs.scipy.org/doc/numpy/reference/generated/numpy.interp.html是我需要的

XP = [1,2,3]

FP = [3,2,0]

np.interp(2.5,XP,FP)

1.0

回答

2

简单!只需使用numpy.linspace让其产生的x位置绘制值:

import numpy as np 
import matplotlib.pyplot as plt 

vals=np.random.random(248) 
x=np.linspace(1,100,len(vals)) 

plt.plot(x,vals) 
plt.show() 

进行分采样值列表,你可以使用numpy的“先进”索引:

vals=np.array(vals) 
sample=vals[np.round(np.linspace(0,len(vals)-1,100)).astype(int)] 

现在要找到“位置10”的值,您只需获得sample[10]


请注意,像Python列表这样的numpy数组是0索引的。我知道你问索引从1到100(这可以做),但如果你遵循0索引约定并且允许sample从Python索引和索引,那么使用Python和numpy的其余部分将更容易0〜99

sample=np.r_[0,vals[np.round(np.linspace(0,len(vals)-1,100)).astype(int)]]

+0

这确实是几乎做的。现在我想知道1,2,3,4,5,6,7,8,9 ....等等的价值 – Jasper

0

不舒尔你真的打算这样做,但是Python通常不需要外部模块此:

class NormalizedList(list): 
    def __getitem__(self, index): 
     length = len(self) 
     denorm_index = int ((index * length)/100.0 + 0.5) 
     return list.__getitem__(self, denorm_index) 


mylist = NormalizedList(range(248)) 

print mylist[50]