我很难找到克隆一维numpy数组来创建三维数组的方法。比如说,我有
z = np.array([0, 2, 3, 5, 7, 9, 10])这表示三维空间中的垂直列(例如,以米为单位)。我想要创建一个水平维(x,y),这样最终的数组就有维度(len(z), len(x), len(y)),其中每个x,y点上的每一列都是相同的。我这样做是为了使空间维数与我所拥有的其他三维数据相匹配。
因此,以数组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()和transposes与().T的实验,我无法正确地确定维度顺序。
这里最关键的是,垂直列是第一个维度。我敢打赌答案确实是微不足道的,我只是找不到神奇的numpy函数来完成它。
有什么建议吗?
发布于 2018-12-04 07:46:59
我们只需在没有额外内存开销的情况下,就可以在没有额外内存开销的情况下获得输入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]]])发布于 2018-12-04 07:54:10
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]]])https://stackoverflow.com/questions/53607928
复制相似问题