我在寻找一种方法来克隆1-D numpy数组以创建3-D数组时遇到了麻烦。举例来说,我有
z = np.array([0, 2, 3, 5, 7, 9, 10])
这表示3-D空间中的垂直列(例如,以米为单位)。我想创建一个水平尺寸(x,y),以便最终数组具有尺寸(len(z), len(x), len(y))
,其中每个x,y点的每一列都相同。我这样做是为了使空间尺寸与我拥有的其他3-D数据匹配。
因此,以数组z
作为输入,并假设水平尺寸为ndimx = 3,ndimy = 2,我想找到一个输出数组的函数
np.array([ [[0, 0], [0, 0], [0, 0]],
[[2, 2], [2, 2], [2, 2]],
[[3, 3], [3, 3], [3, 3]],
[[5, 5], [5, 5], [5, 5]],
[[7, 7], [7, 7], [7, 7]],
[[9, 9], [9, 9], [9, 9]],
[[10, 10], [10, 10], [10, 10]] ])
,其形状为(7,3,2)。起初,这对我而言似乎微不足道,但是经过多年尝试np.dstack(),np.astype(),np.repeat()以及与().T进行转置,我无法正确获得尺寸顺序。
这很关键,垂直列是第一维。我愿意打赌答案的确是微不足道的,我只是找不到能够实现此目的的神奇的numpy函数。
有什么建议吗?
答案 0 :(得分:1)
我们可以简单地使用np.broadcast_to
来查看输入z
,而没有额外的内存开销,因此实际上几乎没有性能-
np.broadcast_to(z[:,None,None],(len(z),ndimx,ndimy))
样品运行-
In [23]: z
Out[23]: array([ 0, 2, 3, 5, 7, 9, 10])
In [24]: ndimx=3; ndimy=2
In [25]: np.broadcast_to(z[:,None,None],(len(z),ndimx,ndimy))
Out[25]:
array([[[ 0, 0],
[ 0, 0],
[ 0, 0]],
[[ 2, 2],
[ 2, 2],
[ 2, 2]],
[[ 3, 3],
[ 3, 3],
[ 3, 3]],
[[ 5, 5],
[ 5, 5],
[ 5, 5]],
[[ 7, 7],
[ 7, 7],
[ 7, 7]],
[[ 9, 9],
[ 9, 9],
[ 9, 9]],
[[10, 10],
[10, 10],
[10, 10]]])
答案 1 :(得分:0)
In [360]: z = np.array([0, 2, 3, 5, 7, 9, 10])
In [361]: z1 = np.stack([z,z], axis=1)
In [362]: z2 = np.stack([z1,z1,z1],axis=1)
In [363]: z2
Out[363]:
array([[[ 0, 0],
[ 0, 0],
[ 0, 0]],
[[ 2, 2],
[ 2, 2],
[ 2, 2]],
[[ 3, 3],
[ 3, 3],
[ 3, 3]],
...
[[10, 10],
[10, 10],
[10, 10]]])