我想在numpy中创建一个3D数组,如下所示:
[ 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 :(得分: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在评论中建议的那样,如果你真的想要一个3D数组 - 我的代码示例中并不完全清楚 - 你可以使用:
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 :(得分:1)
如果你想要一维阵列,(再次,你不清楚你想要什么),你可以这样做:
np.mod(np.arange(10),2)
Out[4]: array([0, 1, 0, 1, 0, 1, 0, 1, 0, 1])
当然,如果需要,可以重新塑造。但是,我认为伯尼的答案要好得多,也更清楚。
答案 2 :(得分:1)
[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))
第一行初始化一堆0和1,并将它们打包成2x108
数组。第二行几乎没有成为108x2
数组。然后,最后一行重新切片数组,使其为6x6x6
,看起来就像你要找的那样。
唯一需要注意的是元素的数量。假设你想要一个6x6x6
的最终3D数组,就像在我的例子中那样,你乘以所有轴的长度(它给出216),然后除以2(= 108)。该数字是1和0的数字,以及.reshape((2, n))
函数调用中使用的数字。
它如此之快的原因是初始化0或1的向量非常快,比复制任意数组更快。然后,像.transpose()
和.reshape()
这样的移动元素几乎不会改变元素的引用方式,而不是在内存中移动元素本身。