簡體   English   中英

python:字典和numpy.array問題

[英]python: dictionary and numpy.array issue

我有一本字典,其中包含與字符串關聯的數組(相同長度)。 我的目標是用相同的鍵創建一個新的字典,但剪切數組,僅保留我需要的元素。 我編寫了一個函數來執行此操作,但是問題是它返回的字典具有與每個鍵關聯的相同數組(正確的剪切長度),而我控制的打印命令顯示了正確的關聯。 功能如下:

def extract_years(dic,initial_year,final_year):

    dic_extr = {}
    l = numpy.size(dic[dic.keys()[0]])

    if final_year != 2013 : 
        a = numpy.zeros((final_year - initial_year)*251)
    elif final_year == 2013 :
        a = numpy.zeros(l - (initial_year-1998)*251)

    for i in range(0,len(dic)):
        #print i
        for k in range (0,numpy.size(a)):
            a[k] = dic[dic.keys()[i]][(initial_year-1998)*251 + k]          
            #print k

        dic_extr[dic.keys()[i]] = a
        print dic.keys()[i]
        print dic_extr[dic.keys()[i]]


    print dic_extr.keys()
    print dic_extr
    return dic_extr

如我所說, print dic_extr[dic.keys()[i]]顯示正確的結果,而最終的print dic_extr顯示具有與每個鍵關聯的相同數組的字典。

在Python中,每個對象都是一個指針。 因此,您必須為外部for循環的每次迭代創建一個新的a實例。 您可以這樣做,例如,在該循環內部初始化a數組,如下所示:

def extract_years(dic,initial_year,final_year):

    dic_extr = {}
    l = numpy.size(dic[dic.keys()[0]])

    for i in range(0,len(dic)):

        if final_year != 2013 : 
            a = numpy.zeros((final_year - initial_year)*251)
        elif final_year == 2013 :
            a = numpy.zeros(l - (initial_year-1998)*251)

        for k in range (0,numpy.size(a)):
            a[k] = dic[dic.keys()[i]][(initial_year-1998)*251 + k]          
            #print k

        dic_extr[dic.keys()[i]] = a
        print dic.keys()[i]
        print dic_extr[dic.keys()[i]]


    print dic_extr.keys()
    print dic_extr
    return dic_extr

也許這不是最優雅的解決方案,但我認為它應該有效。

我認為您遇到了可變性和python定義變量的方法的典型問題:

  1. 您可以使用numpy.zeros()a定義為可變類型。
  2. 然后,您在其中創建a一個特定值,但是實際上您有一個指向實際值的指針列表的指針。
  3. 通過使用dic_extr[dic.keys()[i]] = a您可以將此指針復制到dic_extr數組中,而不是指針列表中。
  4. 然后,更改指針列表引用的對象。
  5. 通過使用dic_extr[dic.keys()[i]] = a可以將指針列表的指針復制到dic_extr數組中,而不是指針列表本身。

最后,兩個指針都指向相同的指針列表。 簡單的例子:

a = [1, 2, 3, 4, 5]
b = a
b[0] = 10
print(a) # returns [10, 2, 3, 4, 5]

您可以使用dic_extr[dic.keys()[i]] = a[:]來實際復制a。

這也是對python中可變性的很好解釋。

暫無
暫無

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

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