我想创建一个包含原始数组特定元素的新数组。 我创建了一个最小的例子,它可以实现我想要实现的目标,但实际数据却没有,我无法弄清楚其本质区别。
首先是最小的例子: 我想得到字母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和这个论坛的新手,请告诉我是否可以改进我的问题,或者任何内容都不清楚。
答案 0 :(得分:1)
简短的回答,你的错误表明你已超出范围, 对于似乎有用的最小例子也是如此。 我不知道为什么它首先适用于最小的例子。
详细答案:
在最小示例中,B_new
列的6
列从0
索引到5
。
您的内部循环遍历B_new
的列数。
并且对于每次迭代,它j
递增yearsf
,即3
。
在第三次迭代中,j
是6
,其大于最大索引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
并设置k
从1
开始
我会建议你将外部循环变成类似的东西
for i in range(B_feat.shape[0])
并删除语句i+=1