我想創造一個numpy的3D陣列如下:Numpy:如何巧妙地填充數組?
[ 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 ] ...
有沒有把它寫的好辦法?
我想創造一個numpy的3D陣列如下:Numpy:如何巧妙地填充數組?
[ 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 ] ...
有沒有把它寫的好辦法?
使用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-d陣列,(再次,目前還不清楚你想要什麼),你可以這樣做:
np.mod(np.arange(10),2)
Out[4]: array([0, 1, 0, 1, 0, 1, 0, 1, 0, 1])
可能,當然,如果需要的話,可以重新塑造。但是,我認爲伯尼的回答更好,更清晰。
+1很高興看到另一種方式,感謝您的回答 – bernie 2012-03-31 08:27:28
@ 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()
這樣的移動元素幾乎不改變元素被引用的方式,而不是將元素本身移入內存中。
+1,不錯的一個。這一個進入我的numpy配方文件 – doug 2012-03-19 07:10:24
是不是一個2D數組? (這完全有可能 - 甚至可能 - 當然這就是OP真正想要的。) – DSM 2012-03-16 17:20:25
@DSM,謝謝你的評論。我將再添一個例子(希望)涵蓋所有的基礎。 – bernie 2012-03-16 17:26:33