Numpy:如何巧妙地填充数组?

时间:2012-03-16 16:50:03

标签: python arrays numpy

我想在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 ] ...

有没有好的方法来写它?

3 个答案:

答案 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)

@ 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))

第一行初始化一堆0和1,并将它们打包成2x108数组。第二行几乎没有成为108x2数组。然后,最后一行重新切片数组,使其为6x6x6,看起来就像你要找的那样。

唯一需要注意的是元素的数量。假设你想要一个6x6x6的最终3D数组,就像在我的例子中那样,你乘以所有轴的长度(它给出216),然后除以2(= 108)。该数字是1和0的数字,以及.reshape((2, n))函数调用中使用的数字。

它如此之快的原因是初始化0或1的向量非常快,比复制任意数组更快。然后,像.transpose().reshape()这样的移动元素几乎不会改变元素的引用方式,而不是在内存中移动元素本身。