簡體   English   中英

動態追加 N 維數組

[英]dynamically append N-dimensional array

如果每個數組都有形狀(1000, 2, 100),使用起來很方便

con = np.concatenate((array_A, array_B))

連接它們,因此 con 具有形狀 (2000, 2, 100)。

我想在函數中動態附加或連接“con”。 該步驟描述如下:

First, read data from the first file and process data to generate an array.

Secondly, read date from the second file and append generated array into the first array

....

def arrayappend():
     for i in range(n):
         #read data from file_0 to file_n-1
         data = read(file_i)
         #data processing to generate an array with shape (1000, 2, 100)
         con = function(data)
         # append con

假設您的所有文件都生成相同的形狀對象,並且您希望在第一維上連接它們,則有幾個選項:

 alist = []
 for f in files:
    data = foo(f)
    alist.append(f)
 arr = np.concatenate(alist, axis=0)

concatenate需要一個列表。 如果您想添加新軸( np.array(alist)np.stack等),則有多種變化。

附加到列表很快,因為它只是意味着添加一個指向data對象的指針。 concatenate從組件創建一個新數組; 它已編譯但仍然相對較慢。

如果您必須/想要在每個階段創建一個新數組,您可以編寫:

 arr = function(files[0])
 for f in files[1:]:
     data = foo(f)
     arr = np.concatenate((arr, data), axis=0)

但是,這可能會更慢,如果文件加載步驟足夠慢,您可能不會注意到差異。

小心你可以從arr = np.zeros((0,2,100))並讀取循環中的所有文件。 您必須確保初始的“空”數組具有兼容的形狀。 新用戶經常遇到這個問題。

如果您絕對想在迭代期間執行此操作,則:

def arrayappend():
  con = None
  for i, d in enumerate(files_list):
    data = function(d)
    con = data if i is 0 else np.vstack([con, data])

這應該垂直堆疊。

非常不漂亮,但它達到你想要的嗎? 這是未優化的方式。

def arrayappend():
    for i in range(n):
        data = read(file_i)
        try:
            con
            con = np.concatenate((con, function(data)))
        except NameError:
            con = function(data)
    return con

第一個循環將采用除了分支,隨后不會。

暫無
暫無

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

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