Python嵌套zip循环遍历Numpy数组遇索引错误的解决问询
嵌套循环遍历二维数组时的IndexError问题解决
你遇到的这个IndexError: invalid index to scalar variable问题,核心是内层循环的配对逻辑搞错了,而且你后来修改的代码也不可行,我给你拆解下原因和正确的实现方式:
原代码错误根源
先看你内层循环的写法:
for vary_Hinv,min_a,max_a in zip(varying_Hinv,min_aH,max_aH):
这里有两个关键问题:
- 配对逻辑完全不符合需求:你想要的是「对每个
varying_DA(对应二维数组的某一行),遍历所有varying_Hinv(对应该行的每一列)」,但zip在这里把varying_Hinv的第j个元素和min_aH的第j行绑定了,相当于把行和列强行配对,完全偏离了你要的「全行×全列」的组合逻辑。 - 报错的直接原因:你说单独索引
min_aH[0][0]没问题,但循环里报错——大概率是你实际运行的代码里,不小心把min_aH[ii][jj]写成了min_a[ii][jj]。因为min_a是min_aH的一整行(一维数组),当你写min_a[ii][jj]时,比如ii=0,min_a[0]是一个标量(比如24),再去加第二个索引[jj],自然会触发「给标量变量加无效索引」的错误。
你修改后的代码可行吗?
答案是完全不可行。min_a是一维数组,只能用单个索引(比如min_a[jj])来取该行的第j个元素,但你用min_a[ii][jj]相当于先取min_a[ii]得到一个标量,再试图给标量加索引,必然报错。
正确的实现方式
推荐用enumerate来直接获取索引,避免手动维护ii、jj的麻烦,逻辑也更清晰:
写法1:只遍历varying_DA和varying_Hinv
import numpy as np varying_DA = [70,78,86,90,94,98,100,102,106,110,114,122,130] varying_Hinv = [60,76,92,100,108,124,140] min_aH = np.array([[24,30,30,30,30,30,30],[36,42,42,47,47,47,47], [36,42,42,42,42,42,42],[36,42,42,42,42,42,42], [42,47,47,47,53,47,53],[42,53,47,47,53,53,53], [47,47,47,47,47,53,47],[47,47,47,47,47,59,59], [53,53,59,59,59,59,64],[47,65,59,59,47,47,64], [53,47,41,47,53,47,47],[36,41,41,41,53,47,47], [36,36,41,41,53,47,47]]) max_aH = np.array([[54,60,60,60,60,60,60],[60,66,66,66,66,66,66], [66,66,72,72,72,72,72],[66,72,72,72,78,78,78], [72,78,78,78,84,84,84],[78,84,84,89,89,84,84], [78,84,78,89,84,84,78],[84,84,78,84,84,89,89], [84,84,84,89,89,89,89],[84,89,84,89,101,101,101], [89,89,95,101,95,101,101],[96,96,95,107,95,101,101], [96,101,95,107,107,101,101]]) # 正确的循环写法 for ii, vary_DA in enumerate(varying_DA): for jj, vary_Hinv in enumerate(varying_Hinv): print(vary_DA, vary_Hinv, ii, jj, min_aH[ii][jj], max_aH[ii][jj])
写法2:如果需要同时用到test_array
如果你确实需要遍历test_array和varying_DA的配对,外层可以结合zip和enumerate:
test_array = [1,2,3,4,5,6,7,8,9,10,11,12,13] for ii, (vary_DA, test) in enumerate(zip(varying_DA, test_array)): for jj, vary_Hinv in enumerate(varying_Hinv): print(vary_DA, vary_Hinv, test, ii, jj, min_aH[ii][jj], max_aH[ii][jj])
这样运行后,第一次循环会输出70 60 0 0 24 54,完全符合你给出的示例,而且不会有任何索引错误。
内容的提问来源于stack exchange,提问作者Srivatsan
相关产品推荐
相关产品推荐

