簡體   English   中英

如何將 numpy 數組列表轉換為單個 numpy 數組?

[英]How to convert list of numpy arrays into single numpy array?

假設我有;

LIST = [[array([1, 2, 3, 4, 5]), array([1, 2, 3, 4, 5],[1,2,3,4,5])] # inner lists are numpy arrays

我嘗試轉換;

array([[1, 2, 3, 4, 5],
       [1, 2, 3, 4, 5],
       [1, 2, 3, 4, 5])

我現在正在通過 vstack 上的迭代來解決它,但是對於特別大的 LIST 來說真的很慢

你對最有效的方法有什么建議?

通常,您可以沿任何軸連接整個數組序列:

numpy.concatenate( LIST, axis=0 )

但是必須對列表中的形狀和每個陣列的維度擔心(用於2維3x5的輸出,你需要確保它們都是2維正由-5陣列的話)。 如果要將一維數組串聯起來作為二維輸出的行,則需要擴展它們的維數。

正如 Jorge 的回答所指出的,還有在 numpy 1.10 中引入的函數stack

numpy.stack( LIST, axis=0 )

這采用互補的方法:它為每個輸入數組創建一個新視圖,並在連接之前添加一個額外的維度(在這種情況下,在左側,因此每個n元素一維數組變成一個 1× n二維數組)。 只有當所有輸入數組都具有相同的形狀時,它才會起作用——即使沿着串聯軸也是如此。

vstack (或等效的row_stack )通常是一個更易於使用的解決方案,因為它將采用一維和/或二維數組的序列,並在必要時且僅在必要時自動擴展維度,然后將整個列表連接在一起。 如果需要新尺寸,則將其添加到左側。 同樣,您可以一次連接整個列表而無需迭代:

numpy.vstack( LIST )

語法快捷方式numpy.r_[ array1, ...., arrayN ]也展示了這種靈活的行為(注意方括號)。 這對於連接一些顯式命名的數組很有用,但對您的情況不利,因為此語法不接受數組序列,例如LIST

還有一個類似的函數column_stack和快捷方式c_[...] ,用於水平(按列)堆疊,以及一個幾乎類似的函數hstack盡管由於某種原因后者不太靈活(它對輸入更嚴格)數組的維數,並嘗試將一維數組端到端連接而不是將它們視為列)。

最后,在一維數組垂直堆疊的特定情況下,以下也適用:

numpy.array( LIST )

...因為數組可以由其他數組的序列構造而成,在開頭添加一個新維度。

從 NumPy 1.10 版開始,我們有了方法stack 它可以堆疊任何維度的數組(全部相等):

# List of arrays.
L = [np.random.randn(5,4,2,5,1,2) for i in range(10)]

# Stack them using axis=0.
M = np.stack(L)
M.shape # == (10,5,4,2,5,1,2)
np.all(M == L) # == True

M = np.stack(L, axis=1)
M.shape # == (5,10,4,2,5,1,2)
np.all(M == L) # == False (Don't Panic)

# This are all true    
np.all(M[:,0,:] == L[0]) # == True
all(np.all(M[:,i,:] == L[i]) for i in range(10)) # == True

享受,

我查了一些速度性能的方法,發現沒有區別! 唯一的區別是使用某些方法必須仔細檢查尺寸。

定時:

|------------|----------------|-------------------|
|            | shape (10000)  |  shape (1,10000)  |
|------------|----------------|-------------------|
| np.concat  |    0.18280     |      0.17960      |
|------------|----------------|-------------------|
|  np.stack  |    0.21501     |      0.16465      |
|------------|----------------|-------------------|
| np.vstack  |    0.21501     |      0.17181      |
|------------|----------------|-------------------|
|  np.array  |    0.21656     |      0.16833      |
|------------|----------------|-------------------|

正如你所看到的,我嘗試了 2 個實驗 - 使用np.random.rand(10000)np.random.rand(1, 10000)如果我們使用二維數組而不是np.stacknp.array創建額外的維度 - result.shape是 (1,10000,10000) 和 (10000,1,10000) 所以他們需要額外的行動來避免這種情況。

代碼:

from time import perf_counter
from tqdm import tqdm_notebook
import numpy as np
l = []
for i in tqdm_notebook(range(10000)):
    new_np = np.random.rand(10000)
    l.append(new_np)



start = perf_counter()
stack = np.stack(l, axis=0 )
print(f'np.stack: {perf_counter() - start:.5f}')

start = perf_counter()
vstack = np.vstack(l)
print(f'np.vstack: {perf_counter() - start:.5f}')

start = perf_counter()
wrap = np.array(l)
print(f'np.array: {perf_counter() - start:.5f}')

start = perf_counter()
l = [el.reshape(1,-1) for el in l]
conc = np.concatenate(l, axis=0 )
print(f'np.concatenate: {perf_counter() - start:.5f}')

暫無
暫無

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

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