以正确的顺序创建数字网格



我有几个数组,在我的 x-,...-、y 轴上有点,并希望创建一个包含所有点的网格,如下所示:

x = [1, 2, 3]
y = [20, 40, 60, 80]
result = []
for xi in x:
    for yi in y:
        result.append([xi, yi])
np.array(result)

这给了我

array([[ 1, 20],
       [ 1, 40],
       [ 1, 60],
       [ 1, 80],
       [ 2, 20],
       [ 2, 40],
       [ 2, 60],
       [ 2, 80],
       [ 3, 20],
       [ 3, 40],
       [ 3, 60],
       [ 3, 80]])

要使用numpy执行此操作,我在此问题中找到了以下代码:

np.vstack(np.meshgrid(x, y)).reshape(2, -1).T

但这以错误的顺序给出了结果:

array([[ 1, 20],
       [ 2, 20],
       [ 3, 20],
       [ 1, 40],
       [ 2, 40],
       [ 3, 40],
       [ 1, 60],
       [ 2, 60],
       [ 3, 60],
       [ 1, 80],
       [ 2, 80],
       [ 3, 80]])

它首先通过 x 值,然后通过 y 值。

我可以通过使用

np.vstack(reversed(np.meshgrid(y, x))).reshape(2, -1).T

但这在 3D 中不再有效,其中

np.vstack(np.meshgrid(x, y, z)).reshape(3, -1).T
首先遍历 z 值,然后遍历

X 值,然后遍历 Y 值。

如何使用 numpy 获得所有维度的正确顺序?

您可以在 np.meshgrid 中指定矩阵索引ij作为 indexing 参数以获得相反的顺序,默认情况下它是笛卡尔索引顺序xy

x = [1, 2, 3]
y = [20, 40, 60, 80]
np.stack(np.meshgrid(x, y, indexing='ij'), axis=-1).reshape(-1, 2)
#array([[ 1, 20],
#       [ 1, 40],
#       [ 1, 60],
#       [ 1, 80],
#       [ 2, 20],
#       [ 2, 40],
#       [ 2, 60],
#       [ 2, 80],
#       [ 3, 20],
#       [ 3, 40],
#       [ 3, 60],
#       [ 3, 80]])

在 3d 中,这可能是:

np.stack(np.meshgrid(x, y, z, indexing='ij'), axis=-1).reshape(-1, 3)

最新更新