从三个1D阵列创建一个numpy 3D坐标数组,第一个索引变化最快

时间:2017-07-29 16:48:28

标签: python numpy

类似问题here 我有三个任意1D数组,例如:

x_p = np.array((0.0,1.1, 2.2, 3.3, 4.4))
y_p = np.array((5.5,6.6,7.7))
z_p = np.array((8.8, 9.9))

我需要

points = np.array([[0.0, 5.5, 8.8],
                   [1.1, 5.5, 8.8],
                   [2.2, 5.5, 8.8],
                   ...
                   [4.4, 7.7, 9.9]])

1)第一个索引变化最快.2)点是浮点坐标,而不是整数索引。 3)我从版本1.7.0注意到,numpy.meshgrid已使用默认indexing='xy'更改了行为并需要使用

np.vstack(np.meshgrid(x_p,y_p,z_p,indexing='ij')).reshape(3,-1).T

获取最后一个索引快速变化的结果点,这不是我想要的。(仅在1.7.0中提到,meshgrid支持维度> 2,我没有检查)

2 个答案:

答案 0 :(得分:1)

您可以使用np.transpose置换轴以实现所需格式的输出 -

np.array(np.meshgrid(x_p, y_p, z_p)).transpose(3,1,2,0).reshape(-1,3)

示例输出 -

In [104]: np.array(np.meshgrid(x_p, y_p, z_p)).transpose(3,1,2,0).reshape(-1,3)
Out[104]: 
array([[ 0. ,  5.5,  8.8],
       [ 1.1,  5.5,  8.8],
       [ 2.2,  5.5,  8.8],
       [ 3.3,  5.5,  8.8],
       [ 4.4,  5.5,  8.8],
       [ 0. ,  6.6,  8.8],
       [ 1.1,  6.6,  8.8],
       [ 2.2,  6.6,  8.8],
       [ 3.3,  6.6,  8.8],
       [ 4.4,  6.6,  8.8],
       [ 0. ,  7.7,  8.8],
       [ 1.1,  7.7,  8.8],
       ....
       [ 3.3,  7.7,  9.9],
       [ 4.4,  7.7,  9.9]])

答案 1 :(得分:1)

我发现了一些反复试验。

我认为ij v xy索引永远存在于meshgrid中(它是sparse参数的新参数。它只影响3个返回元素的顺序。

为了让x_p变化最快,我把它放在参数列表的最后,然后使用::-1来反转最后的列顺序。

我使用stack在最后一个新轴上加入数组,所以我不需要转置。但重塑和转置都很便宜(时间明智)。因此,它们可以任意组合使用,并且可以理解。

In [100]: np.stack(np.meshgrid(z_p, y_p, x_p, indexing='ij'),3).reshape(-1,3)[:,::-1]
Out[100]: 
array([[ 0. ,  5.5,  8.8],
       [ 1.1,  5.5,  8.8],
       [ 2.2,  5.5,  8.8],
       [ 3.3,  5.5,  8.8],
       [ 4.4,  5.5,  8.8],
       [ 0. ,  6.6,  8.8],
       ...
       [ 2.2,  7.7,  9.9],
       [ 3.3,  7.7,  9.9],
       [ 4.4,  7.7,  9.9]])