[英]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.