2012-03-16 63 views

回答

6

使用np.tile

import numpy as np 
a = np.array([0, 1]) 
my_tiled_array = np.tile(a, (3, 3)) 

結果:

array([[0, 1, 0, 1, 0, 1], 
     [0, 1, 0, 1, 0, 1], 
     [0, 1, 0, 1, 0, 1]]) 

編輯:
作爲@DSM暗示的評論,如果你真的想要一個三維陣列 - 這是不是從我的代碼示例中完全清楚 - 您可以使用:

my_3d_tiled_arr = np.tile(a, (3, 3, 3)) 

結果:

array([[[0, 1, 0, 1, 0, 1], 
     [0, 1, 0, 1, 0, 1], 
     [0, 1, 0, 1, 0, 1]], 

     [[0, 1, 0, 1, 0, 1], 
     [0, 1, 0, 1, 0, 1], 
     [0, 1, 0, 1, 0, 1]], 

     [[0, 1, 0, 1, 0, 1], 
     [0, 1, 0, 1, 0, 1], 
     [0, 1, 0, 1, 0, 1]]]) 
+1

是不是一個2D數組? (這完全有可能 - 甚至可能 - 當然這就是OP真正想要的。) – DSM 2012-03-16 17:20:25

+0

@DSM,謝謝你的評論。我將再添一個例子(希望)涵蓋所有的基礎。 – bernie 2012-03-16 17:26:33

1

如果你想有一個1-d陣列,(再次,目前還不清楚你想要什麼),你可以這樣做:

np.mod(np.arange(10),2) 
Out[4]: array([0, 1, 0, 1, 0, 1, 0, 1, 0, 1]) 

可能,當然,如果需要的話,可以重新塑造。但是,我認爲伯尼的回答更好,更清晰。

+0

+1很高興看到另一種方式,感謝您的回答 – bernie 2012-03-31 08:27:28

1

@ bernie的方法很棒。實現相同目標的更快捷方式可以是將元素(虛擬)移動到周圍,而不是複製一對[0, 1]很多次。你可以做到以下幾點:

import numpy as np 
A1 = np.concatenate([np.zeros(108), np.ones(108)]).reshape((2,108)) 
A2 = A1.transpose() 
A3 = A2.reshape((6,6,6)) 

第一行初始化了一堆的零和的,並將它們打包成一個2x108陣列。第二行幾乎沒有成爲108x2陣列。然後,最後一行對數組進行重新切片,因此它是6x6x6,看起來像您正在尋找的內容。

唯一需要注意的是元素的數量。假設你想要一個6x6x6的最終3D數組,就像在我的例子中那樣,你乘以所有軸的長度(這給出了216),然後除以2(= 108)。該數字是「1」和「0」的數字,並且是.reshape((2, n))函數調用中使用的數字。

它的速度如此之快的原因是,初始化零或向量的矢量非常快,比複製任意數組要快。然後,像.transpose().reshape()這樣的移動元素幾乎不改變元素被引用的方式,而不是將元素本身移入內存中。

+0

+1,不錯的一個。這一個進入我的numpy配方文件 – doug 2012-03-19 07:10:24