簡體   English   中英

兩個Numpy數組上的Python zip

[英]Python zip on two numpy arrays

下面是一個工作示例,您可以復制所有變量並運行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循環,它開始70vary_DA和遍歷的7個值vary_Hinv ,即60,76,...,124140。 然后,對vary_DA轉到78vary_DA ,直到對vary_DA130 vary_DA

我有一個特定的值min_aHmax_aH每個的vary_DAvary_Hinv值。

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 = 70vary_Hinv = 60min_aH = 24max_aH = 54 vary_DA = 70vary_Hinv = 76min_aH = 30max_aH = 60 ,依此類推。

現在,我想在for循環中使用min_aHmax_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

IndexError:標量變量的索引無效。

底線:我可以清楚地做到以下幾點:

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應為:

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

我以前有min_aHmax_aH而不是min_amax_a 有人可以讓我知道以上是否有效嗎?

一些評論,首先使用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

盡管這根本沒有利用壓縮值,但如果嘗試達到期望的輸出,則將無法實現。 您可以在這里看到是否打印出壓縮值,您只是獲得了min_aH和max_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],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,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)

這應該可以按需工作。

我還能夠使用python 2.7成功運行您的示例代碼和響應,所以我不確定為什么會根據這里的內容得到該錯誤。

這對我適用於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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM