使用for循环时索引越界

2024-06-22 11:01:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用原始数组的特定元素创建一个新数组。 我创建了一个最小的例子,在那里它实现了我想要实现的目标,但是在实际数据上却没有,我无法找出本质上的区别。在

首先是最简单的例子: 我想得到字母A-C下每一行的数字,并将其保存在数组B峎feat中。在

    import numpy as np
    years  = 5 #A-E
    yearsf = 3 #A-C

    B_new =(['0','A','B','C','D','E','A','B','C','D','E'],
            ['X','2','3','3','3','4','6','5','4','3','4'],
            ['Y','3','4','6','7','3','2','4','7','9','8'],
            ['Z','3','4','6','3','4','6','9','1','4','7']) 

    B_feat = np.zeros((3,2*yearsf))     

    i=0
    for row in B_feat:
        j=0    
        k=0
        for element in row:
            B_feat[i][j:int(j+yearsf)]=B_new[i+1][k+1:int(k+yearsf+1)]
            j+=yearsf
            k+=years
        i+=1        

    print B_feat

我收到了

^{pr2}$

现在有了实际数据:

    years  = 9
    yearsf = 4
    np.shape(B_new)  = (244, 181)
    np.shape(B_feat) = (243, 76)

我想要一个新的数组B峎feat,它忽略了B峎new的第一行和第一列,然后跳过9列并开始“提取”下9行元素中的前4个。在

    import numpy as np
    i=0
    for row in B_feat:
        j=0    
        k=0
        for element in row:
            B_feat[i][j:int(j+yearsf)]=B_new[i+1][int(k+1+years):int(k+years+yearsf+1)]
            j+=yearsf
            k+=years

        i+=1 

运行代码时,收到以下错误:

    IndexError: index 80 is out of bounds for axis 0 with size 76

我真的不理解这个错误,因为我认为0轴是向下的行(在这里我有243个用于Büu feat),并且我无法确定索引在哪里上升到80。在

由于我是python和这个论坛的新手,请让我知道我是否可以改进我的问题或任何不明确的陈述。在


Tags: 数据inimportnumpy元素newfornp
1条回答
网友
1楼 · 发布于 2024-06-22 11:01:27

简而言之,你已经超出了错误提示的范围, 对于最简单的例子也是如此。 首先,我不知道为什么它对最小的例子有效。在

详细回答: 在最小的示例中,B_new具有从0到{}索引的6列。 内部循环迭代B_new的列数。 对于每个迭代,它将j递增yearsf,即3。 在第三次迭代中,j6,它大于最大索引5。 索引k也有同样的问题。在

建议: 内部循环中的迭代次数必须是组数 要处理的列数,2在最小示例中。按列组,I 简单地说是“a-C”下面的一组列。 你的循环可以变成这样:

i=0
for row in B_feat:
    for j,k in zip( range(0,B_feat.shape[1], yearsf),
    range(1,B_new.shape[1], years)):
        print 'i = ', i, ', j = ', j, ', k = ', k
        B_feat[i][j:int(j+yearsf)]=B_new[i+1][k:int(k+yearsf)]
    i+=1

注意,我删除了B_new片中的+1,并设置了k 从^{开始 我建议你把外部循环变成 for i in range(B_feat.shape[0])并删除语句i+=1

相关问题 更多 >