为什么创建嵌套对象列表时Python似乎崩溃?

0 投票
1 回答
822 浏览
提问于 2025-04-18 16:00

我刚开始学习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 这种方式,但这只是我的个人喜好。

撰写回答