2016-11-18 87 views
1

我有一个来自csv文件中'CTTR'列的输入数据。默认情况下不存在0的数组的Python设置值

0 
2 
2 
23 
18 
28 
27 
58 
41 
12 
35 
20 

我的代码,我是该指数

import pandas as pd 
import numpy as np 

df = pd.read_csv("book1.csv") 
vals = np.array(df['CTTR']) 
new = np.array([vals[i-2] + 2*vals[i-1] + 4*vals[i] + 2*vals[i+1] + vals[i+2] for i in range(2,len(vals)-2)])/10. 

for i in new: 
    print i 

但输出是不是我expeted。当索引[0],[1],[10]和[11]时,某些数组不存在。我的意思是当索引[0],vals [i-2]和vals [i-1]不存在,我的代码跳过这一步。

输出

7.6 
16.2 
20.3 
28.3 
33.9 
40.8 
36.6 
27.8 

我的预期输出

0.6 
3.5 
7.6 
16.2 
20.3 
28.3 
33.9 
40.8 
36.6 
27.8 
24.5 
16.2 

从而输出与输入相同的量的大写金额。 所以如何设置一个值为0默认情况下数组不存在? 为〔实施例

[0] = (vals[i-2] + 2*vals[i-1] + 4*vals[i] + 2*vals[i+1] + vals[i+2])/10 
[0] = (0 + 0 +4*0 + 2*2 + 2) /10 
[0] = 0.6 

回答

1
In [340]: list(range(2,len(vals)-2)) 
Out[340]: [2, 3, 4, 5, 6, 7, 8, 9] 

相同数目的值作为new的,8.

至于如何获得最终值的问题;列表理解可以在速度rewriten为一个循环,很少有松动:

alist = [] 
for i in range(2,len(vals)-2): 
    newval = [vals[i-2] + 2*vals[i-1] + 4*vals[i] + 2*vals[i+1] + vals[i+2] 
    alist.append(newval) 
np.array(alist)/10 

的扩展范围,我们可以在“如果”语句抛出来处理出界的情况:

alist = [] 
for i in range(len(vals)): 
    if i<2: ... 
    else: 
     newval = [vals[i-2] + 2*vals[i-1] + 4*vals[i] + 2*vals[i+1] + vals[i+2] 
    alist.append(newval) 
np.array(alist)/10 

另一种选择是垫与一些0阵列

In [354]: vals1=np.concatenate(([0,0],vals,[0,0])) 
In [355]: 
In [355]: new = np.array([vals1[i-2] + 2*vals1[i-1] + 4*vals1[i] + 2*vals1[i+1] 
    ...: + vals1[i+2] for i in range(2,len(vals1)-2)])/10. 
In [356]: new 
Out[356]: 
array([ 0.6, 3.5, 7.6, 16.2, 20.3, 28.3, 33.9, 40.8, 36.6, 
     27.8, 24.5, 16.2])