2016-12-18 261 views
1

首先一個簡單的例子從2D numpy的陣列的numpy的陣列創建塊numpy的陣列有效地

import numpy as np 

a = np.ones((2,2)) 
b = 2*np.ones((2,2)) 
c = 3*np.ones((2,2)) 
d = 4*np.ones((2,2)) 
e = np.array([[a,b],[c,d]]) 
print(np.vstack(np.array([np.hstack(e[i,:]) for i in range(2)]))) 

產生

[[ 1. 1. 2. 2.] 
[ 1. 1. 2. 2.] 
[ 3. 3. 4. 4.] 
[ 3. 3. 4. 4.]] 

這是完全一樣的print(np.bmat(e.tolist()))print(np.bmat([[a,b],[c,d]]))結果(以np.bmat創建可以投射的numpy矩陣的事實爲模,使用np.asarray())。

但是,我的問題是,我有一個代碼,我創建了一個大的numpy數組36(現在,將變得更晚,像400)2D numpy數組,我想創建一個大塊numpy數組在他們之外。我想有效地做到這一點,如果可能的話,避免列表和numpy數組之間的任何轉換,因爲這是更大的循環結構的一部分,因此會多次完成(每次的數組都不相同)。那可能嗎?

+0

好的,也許我不清楚。事實上,這個簡單的例子是有效的。但在我真正的問題中,我創建了一個大的numpy數組,並且我不想將它轉換爲列表 – ThunderBiggi

+0

如果你有像36個數組,那麼初始化o/p數組然後迭代地切成o/p數組並進行分配? – Divakar

+0

我不太明白你的意思。數組的數量是我計劃在不久的將來增加的參數的函數,所以它應該是完全自動的 – ThunderBiggi

回答

3
np.swapaxes(e, 1, 2).reshape([4, 4]) 

如果您檢查哪些元素應該從e被吸引到生產我們所需的輸出順序,你會發現,我們要沿着軸3,然後1,然後2去,然後按0 reshape平沿軸3的元素,然後是2,然後是1,然後是0,因此我們在調用reshape之前交換軸1和2。

+0

這正是我所需要的。我只是要編輯我的問題,並說我已經嘗試過重塑,似乎並不奏效。 – ThunderBiggi