两个numpy数组上的Python zip

两个numpy数组上的Python zip,python,numpy,for-loop,indices,Python,Numpy,For Loop,Indices,下面是一个工作示例,您可以复制所有变量并运行for循环以检查 我有两个列表,一个是长度=13,另一个是长度=7 varying_DA = [70,78,86,90,94,98,100,102,106,110,114,122,130] test_array = [1,2,3,4,5,6,7,8,9,10,11,12,13] #DUMMY array varying_Hinv = [60,76,92,100,108,124,140] 我想循环浏览上述两个列表,即使用两个for循环,如: for v

下面是一个工作示例,您可以复制所有变量并运行
for
循环以检查

我有两个列表,一个是长度=13,另一个是长度=7

varying_DA = [70,78,86,90,94,98,100,102,106,110,114,122,130]
test_array = [1,2,3,4,5,6,7,8,9,10,11,12,13] #DUMMY array
varying_Hinv = [60,76,92,100,108,124,140]
我想循环浏览上述两个列表,即使用两个
for
循环,如:

for vary_DA,test in zip(varying_DA,test_array): 

    for vary_Hinv,min_a,max_a in zip(varying_Hinv,min_aH,max_aH):
因此,在上述
for
循环中,它从
70
for
vary_DA
开始,并循环通过
vary_Hinv
的7个值,即60,76,…,124140。然后转到
vary\u DA的
78
,依此类推,直到
vary\u DA的
130
结束

对于每个
vary\u DA
vary\u Hinv
值,我有
min\u aH
max\u aH
的特定值

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]]) 

# As you can see it is a 13x7 matrix, 7 for the 7 different vary_Hinv
# values and 13 for the 13 different vary_DA values    

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]]) 
即当
vary_DA=70
vary_Hinv=60
时,
min_aH=24
max_aH=54
。 当
vary_DA=70
vary_Hinv=76
时,
min_aH=30
max_aH=60
依此类推。

现在,我想将这些特定值
min\u aH
max\u aH
用于
循环的
,但从下面的工作示例中可以看出,它失败了

ii = 0

for vary_DA,test in zip(varying_DA,test_array): 

    jj = 0 

    for vary_Hinv,min_a,max_a in zip(varying_Hinv,min_aH,max_aH):

        print vary_DA,vary_Hinv,ii,jj,min_aH[ii][jj],max_aH[ii][jj]

        jj = jj + 1

ii = ii + 1
索引器错误:标量变量的索引无效。

底线: 当我能清楚地做到以下几点时:

In [12]: min_aH[0]
Out[12]: array([24, 30, 30, 30, 30, 30, 30])

In [13]: min_aH[0][0]
Out[13]: 24
为什么它在
for
循环中失败?我如何让它工作

编辑

我在上面的工作示例中犯了一个错误。在第二个
for
循环中,
打印应该是:

print vary_DA,vary_Hinv,ii,jj,min_a[ii][jj],max_a[ii][jj]

我以前有
min\u-aH
max\u-aH
而不是
min\u-a
max\u-a
。有没有人能告诉我上述方法是否有效

这在Python 3.6上适用:

varying_DA = [70,78,86,90,94,98,100,102,106,110,114,122,130]
test_array = [1,2,3,4,5,6,7,8,9,10,11,12,13] #DUMMY array
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]]) 

ii = 0

for vary_DA,test in zip(varying_DA,test_array): 

    jj = 0 

    for vary_Hinv,min_a,max_a in zip(varying_Hinv,min_aH,max_aH):

        print(vary_DA,vary_Hinv,ii,jj,min_aH[ii][jj],max_aH[ii][jj])

        jj = jj + 1

ii = ii + 1

下面是一些注释,首先,您的示例使用python 3运行时没有错误,输出为:

70 60 0 0 24 54
70 76 0 1 30 60
70 92 0 2 30 60
...
78 60 0 0 24 54
78 76 0 1 30 60
78 92 0 2 30 60
78 100 0 3 30 60
...
我不相信这是你想要的,因为最后四行的最后两个数字的值应该与前四行不同。我认为您希望显示的最后四行是:

78 60 1 0 36 60
78 76 1 1 42 66
78 92 1 2 42 66
78 100 1 3 47 66
根据你的描述。这是因为 ii=ii+1 在初始循环之外,因此ii始终不会更改值。工作版本(同样在python 3.6中)是:

ii = 0

for vary_DA,test in zip(varying_DA,test_array): 

    jj = 0 

    for vary_Hinv,min_a,max_a in zip(varying_Hinv,min_aH,max_aH):

        print (vary_DA,vary_Hinv,ii,jj,min_aH[ii][jj],max_aH[ii][jj])

        jj = jj + 1

    ii = ii + 1
ii = 0
for vary_DA,test,min_a,max_a in zip(varying_DA,test_array,min_aH,max_aH): 

    jj = 0 

    for vary_Hinv,mn,mx in zip(varying_Hinv,min_a,max_a):

        print (vary_DA,vary_Hinv,ii,jj,min_aH[ii][jj],max_aH[ii][jj],mn,mx)

        jj = jj + 1
    ii = ii + 1
尽管这根本没有利用压缩值,如果它尝试压缩,则无法实现所需的输出。你可以在这里看到,如果我打印出压缩的值,你只会得到每个列表中的最小值和最大值,但我相信你想要单独的值

ii = 0

for vary_DA,test in zip(varying_DA,test_array): 

    jj = 0 

    for vary_Hinv,min_a,max_a in zip(varying_Hinv,min_aH,max_aH):

        print (vary_DA,vary_Hinv,ii,jj,min_aH[ii][jj],max_aH[ii][jj],min_a,max_a)

        jj = jj + 1

    ii = ii + 1
结果:

70 60 0 0 24 54 [24 30 30 30 30 30 30] [54 60 60 60 60 60 60]
70 76 0 1 30 60 [36 42 42 47 47 47 47] [60 66 66 66 66 66 66]
70 92 0 2 30 60 [36 42 42 42 42 42 42] [66 66 72 72 72 72 72]
...
78 60 1 0 36 60 [24 30 30 30 30 30 30] [54 60 60 60 60 60 60]
78 76 1 1 42 66 [36 42 42 47 47 47 47] [60 66 66 66 66 66 66]
78 92 1 2 42 66 [36 42 42 42 42 42 42] [66 66 72 72 72 72 72]
...
最后,正确使用zip来获得所需的值,从而使迭代器ii和jj变得不必要:

ii = 0

for vary_DA,test in zip(varying_DA,test_array): 

    jj = 0 

    for vary_Hinv,min_a,max_a in zip(varying_Hinv,min_aH,max_aH):

        print (vary_DA,vary_Hinv,ii,jj,min_aH[ii][jj],max_aH[ii][jj])

        jj = jj + 1

    ii = ii + 1
ii = 0
for vary_DA,test,min_a,max_a in zip(varying_DA,test_array,min_aH,max_aH): 

    jj = 0 

    for vary_Hinv,mn,mx in zip(varying_Hinv,min_a,max_a):

        print (vary_DA,vary_Hinv,ii,jj,min_aH[ii][jj],max_aH[ii][jj],mn,mx)

        jj = jj + 1
    ii = ii + 1
给予:

70 60 0 0 24 54 24 54
70 76 0 1 30 60 30 60
70 92 0 2 30 60 30 60
...
78 60 1 0 36 60 36 60
78 76 1 1 42 66 42 66
78 92 1 2 42 66 42 66
...
根据需要,最后删除迭代器,如下所示:

for vary_DA,test,min_a,max_a in zip(varying_DA,test_array,min_aH,max_aH): 
    for vary_Hinv,mn,mx in zip(varying_Hinv,min_a,max_a):
        print (vary_DA,vary_Hinv,mn,mx)
这应该是我们想要的


我还能够使用Python2.7成功地运行您的示例代码和我的响应,因此我不确定基于这里的内容,您为什么会出现这种错误

我可以让你的代码运行没有错误。你的输入和你的问题完全一样吗?@jpp:它不是把索引器扔到
print
行吗?i、 索引部分添加了我的完整代码作为答案(因为没有更好的方法)。如果复制粘贴,是否看到错误?如果您这样做,则可能是Python2.7v3.6的问题。