关于python:从三个1D数组创建一个numpy 3D坐标数组,第一个索引更改最快

Creating a numpy array of 3D coordinates from three 1D arrays, first index changing fastest

类似于这里的问题
我有三个任意的一维数组,例如:

1
2
3
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))

我需要

1
2
3
4
5
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,我没有检查)


我通过反复试验发现了这一点。

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

为了使x_p变化最快,我将其放在参数列表的最后,然后使用::-1在末尾反转列顺序。

我使用stack在最后将数组连接到新轴上,因此不需要转置。 但是重塑和转置都很便宜(在时间上)。 因此,它们可以以可行且可以理解的任何组合使用。

1
2
3
4
5
6
7
8
9
10
11
12
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]])

您可以用np.transpose排列轴以所需的格式获得输出-

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

样本输出-

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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]])