【发布时间】:2012-03-16 16:50:02
【问题描述】:
我想在 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 ] ...
有什么好办法写吗?
【问题讨论】:
我想在 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 的向量非常快,比复制任意数组更快。然后,移动元素,就像 .transpose() 和 .reshape() 所做的那样,几乎不会改变引用元素的方式,而不是移动内存中的元素本身。
【讨论】: