2016-08-04 41 views
1

我有幾個我想要初始化的數組。我想遍歷每個數組,以便該數組不包含任何數據,它會通過某種方法初始化,但如果它保存了數據,則會通過numpy.stack將新數據添加到該數組中。我嘗試這樣做:numpy,連接或初始化之間的循環選擇

a = np.array(0) 
b = np.array(0) 
c = np.array(0) 

while True: 

    data_set_num = infile.readline() 
    if not data_set_num: break 

    for arr in (a, b, c): 
     new_arr = get_new_array(infile) 
     try: 
      arr = np.stack((arr, new_arr)) 
     except: 
      arr = np.array(new_arr) 

但循環執行後,我沒有什麼:

>>> a.shape 
() 

同爲bc。很明顯,我不明白arr如何引用這三個數組。任何人都知道如何做我想做的事情?當然,我可以展開內部循環,但這似乎是非常「不合理」的。

+0

即使您糾正了錯誤,重複連接也是一種效率極低的數組處理方式。 – user2357112

+0

'arr'一個接一個地引用數組。然後它被np.stack((arr,new_arr))或'np.array(new_arr)'取代,兩者都返回新的數組。名稱'arr'被綁定到新的引用,而不是'a'或'b'或'c'。 –

+0

@Mad物理學家是的,我現在明白了。現在我的問題是如何做我需要做的事情?謝謝。 –

回答

1

除非通過堆棧連接數組是一種可怕的方式,否則您可能需要在代碼中修復名稱綁定問題。

問題是,arr引用(被綁定到)數組一個接一個(如你所期望的)。然後它被替換爲np.stack((arr, new_arr))np.array(new_arr),兩者都返回新陣列。名稱arr被綁定到新的參考,而不是abc

直接的解決方案是製作一個數組列表而不是使用a,b,c。做類似

x = [np.array(0) for _ in range(3)] 

while True: 

    data_set_num = infile.readline() 
    if not data_set_num: 
     break 

    for ind, arr in enumerate(x): 
     new_arr = get_new_array(infile) 
     try: 
      x[ind] = np.stack((arr, new_arr)) 
     except: 
      x[ind] = np.array(new_arr) 

這裏有幾個主要缺陷。首先,你不應該使用try...except這麼簡單。另一方面,如果您必須將數組堆疊在一起,請嘗試一次完成所有操作,而不是執行增量重新分配。

此外,您的代碼似乎在while True:循環內循環遍歷同一組數組。

1
import numpy as np 
arrays = [] 
while True: 
    #data_set_num = infile.readline() 
    #if not data_set_num: break 
    arr = np.array(0) 
    for count in range(3): 
     #new_arr = get_new_array(infile) 
     new_arr = np.array([[count+1,count+2],[count+3,count+4]]) 
     try: 
      arrays.append(np.stack((arr, new_arr))) 
     except: 
      arrays.append(np.array(new_arr)) 
    break 
print str(arrays[0]) 
print str(arrays[1]) 
print str(arrays[2]) 
+0

'print'會自動調用'str'。最後的三條語句可以簡化爲'for x in array:print x'。 –