繁体   English   中英

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

[英]Numpy : how to fill an array smartly?

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

有没有一个很好的方式来写它?

使用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]]])

如果你想要一维阵列,(再次,你不清楚你想要什么),你可以做类似的事情:

np.mod(np.arange(10),2)
Out[4]: array([0, 1, 0, 1, 0, 1, 0, 1, 0, 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的向量非常快,比复制任意数组更快。 然后,像.reshape() .transpose().reshape()这样的移动元素几乎不会改变元素的引用方式,而不是在内存中移动元素本身。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM