IndexError:数组的数组索引太多,绝对是一个很大的数组

时间:2016-03-14 14:23:25

标签: python arrays

我正在尝试通过拍摄更新情节的png图像并将它们拼接在一起来制作电影。有三个变量:degrees,ksB和mp。每帧仅改变mp;另外两个是不变的。所有时间的mp数据都存储在X中。这是代码的相关部分:

def plot(fname, haveMLPY=False):
    # Load data from .npz file.
    data = np.load(fname)
    X = data["X"]
    T = data["T"]
    N = X.shape[1]
    A = data["vipWeights"]
    degrees = A.sum(1)
    ksB = data["ksB"]

    # Initialize a figure.
    figure = plt.figure()

    # Generate a plottable axis as the first subplot in 1 rows and 1 columns.
    axis = figure.add_subplot(1,1,1)

    # MP is the first (0th) variable. Plot one trajectory for each cell over time.
    axis.plot(T, X[:,:,0], color="black")

    # Decorate the plot.
    axis.set_xlabel("time [hours]")
    axis.set_ylabel("MP [nM]")
    axis.set_title("PER mRNA concentration across all %d cells" % N)
    firstInd = int(T.size / 2)

    if haveMLPY:
        import circadian.analysis
        # Generate a and plot Signal object, which encapsulates wavelet analysis.
        signal = circadian.analysis.Signal(X[firstInd:, 0, 0], T[firstInd:])
        signal.showSpectrum(show=False)


    files=[]   
    # filename for the name of the resulting movie
    filename = 'animation'
    mp = X[10**4-1,:,0]
    from mpl_toolkits.mplot3d import Axes3D  
    for i in range(10**4):
        print i
        mp = X[i,:,0]
        data2 = np.c_[degrees, ksB, mp]

        # Find best fit surface for data2
        # regular grid covering the domain of the data
        mn = np.min(data2, axis=0)
        mx = np.max(data2, axis=0)
        X,Y = np.meshgrid(np.linspace(mn[0], mx[0], 20), np.linspace(mn[1], mx[1], 20))
        XX = X.flatten()
        YY = Y.flatten()
        order = 2    # 1: linear, 2: quadratic
        if order == 1:
            # best-fit linear plane
            A = np.c_[data2[:,0], data2[:,1], np.ones(data2.shape[0])]
            C,_,_,_ = scipy.linalg.lstsq(A, data2[:,2])    # coefficients

            # evaluate it on grid
            Z = C[0]*X + C[1]*Y + C[2]

            # or expressed using matrix/vector product
            #Z = np.dot(np.c_[XX, YY, np.ones(XX.shape)], C).reshape(X.shape)

        elif order == 2:
            # best-fit quadratic curve
            A = np.c_[np.ones(data2.shape[0]), data2[:,:2], np.prod(data2[:,:2], axis=1), data2[:,:2]**2]
            C,_,_,_ = scipy.linalg.lstsq(A, data2[:,2])

            # evaluate it on a grid
            Z = np.dot(np.c_[np.ones(XX.shape), XX, YY, XX*YY, XX**2, YY**2], C).reshape(X.shape)

        fig = plt.figure()
        ax = fig.add_subplot(111, projection='3d')
        ax.plot_surface(X, Y, Z, rstride=1, cstride=1, alpha=0.2)
        ax.scatter(degrees, ksB, mp)
        ax.set_xlabel('degrees')
        ax.set_ylabel('ksB')
        ax.set_zlabel('mp')
        # form a filename
        fname2 = '_tmp%03d.png'%i
        # save the frame
        savefig(fname2)
        # append the filename to the list
        files.append(fname2)
    # call mencoder 
    os.system("mencoder 'mf://_tmp*.png' -mf type=png:fps=10 -ovc lavc -lavcopts vcodec=wmv2 -oac copy -o " + filename + ".mpg")
    # cleanup
    for fname2 in files: os.remove(fname2)

基本上,所有数据都存储在X中。格式X [i,i,i]表示X [时间,神经元,数据类型]。每次循环,我想更新时间,但仍然为所有神经元绘制mp(第0个变量)。

当我运行此代码时,我得到“IndexError:数组索引太多”。我让它打印我,看看代码出错了。当i = 1时,我得到一个错误,这意味着代码循环一次,但第二次出现错误。

但是,我有10 ^ 4个时间步的数据。您可以在提供的代码的第一行中看到,我成功访问了X [10 ** 4-1,:,0]。这就是为什么让我感到困惑的是为什么X [1,:,0]会超出范围。如果有人能解释为什么/帮助我解决这个问题,那就太好了。

回溯错误是

Traceback (most recent call last):
File"/Users/angadanand/Documents/LiClipseWorkspace/Circadian/scripts    /runMeNets.py", line 196, in module  
plot(fname)  
File"/Users/angadanand/Documents/LiClipseWorkspace/Circadian/scripts    /runMeNets.py", line 142, in plot  
mp = X[i,:,0]  
IndexError: too many indices for array

谢谢!

1 个答案:

答案 0 :(得分:3)

您的问题是您在循环中覆盖了X

X,Y = np.meshgrid(np.linspace(mn[0], mx[0], 20), np.linspace(mn[1], mx[1], 20))

之后它会有另一种形状并包含不同的数据。我建议将第二个X更改为x_grid并检查您需要的位置"其他" X以及原文。

例如:

X_grid, Y_grid = np.meshgrid(np.linspace(mn[0], mx[0], 20), np.linspace(mn[1], mx[1], 20))