按正确顺序创建Numpy Grid

时间:2017-11-03 13:22:15

标签: arrays numpy

我有几个在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执行此操作,我在this问题中找到了以下代码:

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在所有维度中获得正确的订单?

1 个答案:

答案 0 :(得分:1)

您可以在ij中指定矩阵索引np.meshgrid作为indexing参数来获取反转顺序,默认情况下它是 cartesian 索引顺序{{ 1}}:

xy

在3d中,这可能是:

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]])