numpy:将扫描数据的单个2D阵列重塑为3个2D阵列



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

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步长中的间距不必是恒定的

实现这一点的最Python的方法是什么有没有一种简单的方法可以进行整形?我可以使用for循环,跟踪当前的x和y坐标,如果它们发生变化,则移动到新的列/行,将值插入数组中。但这似乎非常乏味和缓慢。。。

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

最新更新