【问题标题】:numpy: reshape single 2D array of scan data into 3 2D arraysnumpy:将扫描数据的单个二维数组重塑为 3 个二维数组
【发布时间】:2021-09-25 06:44:26
【问题描述】:

我有一个如下形式的数组:

x_1    y_1    z_1,1
x_1    y_2    z_1,2
x_1    y_3    z_1,3
...    ...     ...
x_1    y_n    z_1,m
x_2    y_1    z_2,1
x_2    y_2    z_2,2
x_2    y_3    z_2,3
...    ...     ...
x_2    y_m    z_2,m
...    ...     ...
x_n    y_m    z_n,m

这是扫描数据,因此 x 和 y 坐标与该坐标处的测量值 (z)。我想将其绘制为等高线图,为此需要类似于我的np.meshgrid() 生成的数组。所以我需要以下形式的三个数组(都是形状:m行乘n列):

X = [x_1  x_2  x_3  ...  x_n
     x_1  x_2  x_3  ...  x_n
     ...                  .
          ...             .
               ...        .
     x_1  x_2  x_3  ...  x_n]


Y = [y_1  y_1  y_1  ...  y_1
     y_2  y_2  y_2  ...  y_2
     ...                  .
          ...             .
               ...        .
     y_m  y_m  y_m  ...  y_m]


Z = [z_1,1  z_2,1  z_3,1  ...  z_n,1
     z_1,2  z_2,2  z_3,2  ...  z_n,2
      ...                        .
             ...                 .
                    ...          .
     z_1,m  z_2,m  z_3,m  ...  z_n,m]

注意事项:

  • n 和 m 不一定相等,并且可以在扫描之间变化。
  • x 和 y 步长的间距不一定要保持不变

什么是最 Pythonic 的实现方式? 有没有使用重塑的简单方法?我可以使用 for 循环来做到这一点,跟踪当前的 x 和 y 坐标并在它们发生变化时移动到新的列/行,以将值插入到数组中。但这似乎非常乏味和缓慢......

【问题讨论】:

    标签: python arrays numpy reshape


    【解决方案1】:

    TL;DR
    data.T.reshape(3,m,n).transpose((0,2,1))


    1. 复制您的数据结构
    In [60]: m, n = 3, 5
    ...: x, y, z = (
    ...:     np.array(list(range(m))*n).reshape(n,m).T.flatten(),
    ...:      np.array(list(range(n))*m),
    ...:      np.arange(n*m))
    ...: a = np.array((x, y, z)).T
    ...: print(a)
    [[ 0  0  0]
     [ 0  1  1]
     [ 0  2  2]
     [ 0  3  3]
     [ 0  4  4]
     [ 1  0  5]
     [ 1  1  6]
     [ 1  2  7]
     [ 1  3  8]
     [ 1  4  9]
     [ 2  0 10]
     [ 2  1 11]
     [ 2  2 12]
     [ 2  3 13]
     [ 2  4 14]]
    
    1. 让我们看看meshgrid想做什么
    In [62]: np.meshgrid(range(m), range(n))
    Out[62]: 
    [array([[0, 1, 2],
            [0, 1, 2],
            [0, 1, 2],
            [0, 1, 2],
            [0, 1, 2]]),
     array([[0, 0, 0],
            [1, 1, 1],
            [2, 2, 2],
            [3, 3, 3],
            [4, 4, 4]])]
    
    1. 解决办法是
    In [63]: a.T.reshape(3,m,n).transpose((0,2,1))
    Out[63]: 
    array([[[ 0,  1,  2],
            [ 0,  1,  2],
            [ 0,  1,  2],
            [ 0,  1,  2],
            [ 0,  1,  2]],
    
           [[ 0,  0,  0],
            [ 1,  1,  1],
            [ 2,  2,  2],
            [ 3,  3,  3],
            [ 4,  4,  4]],
    
           [[ 0,  5, 10],
            [ 1,  6, 11],
            [ 2,  7, 12],
            [ 3,  8, 13],
            [ 4,  9, 14]]])
    

    【讨论】:

    • 完美!和一个单线启动。真正的蟒蛇。我可以用 n = np.argmax(data[:,0] != data[0,0]); m = np.size(data[:,0])/n 自己确定 m,n 非常感谢
    猜你喜欢
    • 1970-01-01
    • 2021-03-15
    • 1970-01-01
    • 1970-01-01
    • 2017-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-21
    相关资源
    最近更新 更多