为什么创建嵌套对象列表时Python似乎崩溃?
我刚开始学习Python,随便玩了玩想熟悉一下这个语言。基本上,我想生成随机游走并对它们进行分析。不过,我没能成功创建一个包含不同随机游走结果的不同ARMA模型拟合对象的列表。
import numpy as np
import matplotlib.pyplot as plt
import statsmodels.api as sm
def randwalk(N,sigma):
k=1
R=np.zeros(N)
while(k<N):
R[k]=R[k-1]+np.random.randn(1)*sigma
k+=1
return R
m=3
N=100
R1=np.zeros((N,m))
for k in range(m):
R1[:,k]=randwalk(N,0.1)
plt.plot(range(N),(R1))
plt.show()
ll= [(2,0),(2,0)]
fit=[]
for kk in range(len(ll)):
fit[kk]= [sm.tsa.ARMA(R1[:,ii], order=ll[kk]).fit() for ii in range(m)]
我试过用fit[kk]
和fit[kk][:]
,但都不行。我查过一些资料,比如在Python中创建对象列表和Python中的嵌套列表。
之后,ll[1]
会变得不同,比如(2,1)
。如果你手动运行循环体,sm.tsa.ARMA
似乎是可以工作的,前提是kk=0
。
最终,我想访问fit[:][:].bic
的值。
真的很抱歉,我觉得这只是一个基本的语法问题...
我在Windows 7上使用Canopy。
编辑:还有,
ll= [(2,0),(2,0)]
fit=[]
for kk in range(len(ll)):
fit.append([sm.tsa.ARMA(R1[:,ii], order=ll[kk]).fit() for ii in range(m)])
也不行。
1 个回答
1
列表和矩阵不一样,列表的大小是可以变化的,而且一开始是空的,所以如果你想访问一个新列表的第三个元素,那是没有意义的。你可以提前创建一个大小预定(但不是固定)的列表,然后再去访问里面的元素,或者你可以把新项目添加到列表的末尾:
# Create then assign
ll = [None] * some_length # or ll = range(some_length)
for k in range(some_length):
ll[k] = some_object[k]
# Append:
ll = list() # list() is equivalent to []
for k in range(some_length):
ll.append(some_object[k])
我个人更喜欢用 append
这种方式,但这只是我的个人喜好。