我想用原始数组的特定元素创建一个新数组。 我创建了一个最小的示例,它可以实现我想要实现的目标,但在实际数据上却没有,我无法找出本质区别。
首先是最小的例子: 我想获取字母 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_new 的第一行和第一列的新数组 B_feat,然后跳过 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 和这个论坛的新手,如果我可以改进我的问题或任何不清楚的地方,请告诉我。
最佳答案
简短的回答,你超出了错误提示的范围, 对于似乎有效的最小示例也是如此。 我不知道为什么它首先适用于最小示例。
详细答案:
在最小示例中,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
请注意,我删除了 B_new
切片中的 +1
并设置了 k
从 1
开始
我会建议你把外部循环变成类似
for i in range(B_feat.shape[0])
并删除语句 i+=1
关于python - 使用for循环时索引越界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35893173/