我有一个不均匀的值长度列表,现在我想将它们转换为1到100的列表。 因此,如果列表具有100个值,那么在位置10将是列表[10]
现在当我有一个248个值的列表时,我想制作一个这样的折线图,并且x轴的范围是1-100%,所以我可以询问/交叉10号位的值。
或者另一种选择可能是它长248个值(折线图)并且你在x轴上询问2.48的值,它返回一个特定的y值。然后通过每次为xaxis值添加2.48重复100次。
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
答案 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]
。
请注意,numpy数组(如Python列表)是0索引的。我知道你要求索引从1到100(并且可以完成 1 ),但如果你同意0索引约定并允许使用Python和numpy的其余部分会更容易sample
要从0到99建立索引。
1 sample=np.r_[0,vals[np.round(np.linspace(0,len(vals)-1,100)).astype(int)]]
答案 1 :(得分: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]