使用for循环

时间:2016-03-09 13:37:48

标签: python arrays

我想创建一个包含原始数组特定元素的新数组。 我创建了一个最小的例子,它可以实现我想要实现的目标,但实际数据却没有,我无法弄清楚其本质区别。

首先是最小的例子: 我想得到字母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

我收到了

[[ 2.  3.  3.  6.  5.  4.]
 [ 3.  4.  6.  2.  4.  7.]
 [ 3.  4.  6.  6.  9.  1.]]

现在有了我的实际数据:

    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_feat)并且我无法弄清楚索引上升到80的位置。

由于我是python和这个论坛的新手,请告诉我是否可以改进我的问题,或者任何内容都不清楚。

1 个答案:

答案 0 :(得分:1)

简短的回答,你的错误表明你已超出范围, 对于似乎有用的最小例子也是如此。 我不知道为什么它首先适用于最小的例子。

详细答案: 在最小示例中,B_new列的6列从0索引到5。 您的内部循环遍历B_new的列数。 并且对于每次迭代,它j递增yearsf,即3。 在第三次迭代中,j6,其大于最大索引5。 您对索引k存在完全相同的问题。

建议: 内部循环中的迭代次数必须是组的数量 要处理的列,在最小示例中为2。按列组,我 只是表示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

请注意,我删除+1切片中的B_new并设置k1开始 我会建议你将外部循环变成类似的东西 for i in range(B_feat.shape[0])并删除语句i+=1