python - numpy:将扫描数据的单个二维数组重塑为 3 个二维数组
问题描述
我有以下形式的数组:
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 坐标并在它们发生变化时移动到新的列/行,以将值插入到数组中。但这似乎非常乏味和缓慢......
解决方案
TL;博士
data.T.reshape(3,m,n).transpose((0,2,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]]
- 让我们看看
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]])]
- 解决方案是
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]]])
推荐阅读
- repo - 回购初始化停止总是检查最新的回购
- docker - 运行 Docker 构建时出现未指定的错误 (0x80004005)
- heap-memory - 在 cloudwatch 中收集 JVM 指标,例如堆使用情况 GC 信息以获取 Fargate 服务
- sharepoint - 在 sharepoint 现代网站上嵌入最新的网络聊天
- typescript - 如何在异步方法中返回承诺?
- jquery - 在 wordpress upolad 媒体窗口上显示自定义消息?
- python - 如何将嵌套的 JSON 转换为 Pandas 数据框?
- firebase - 无法从 Firestore 中提取数据
- html - 如何使 Django 视图需要用户登录?
- python - 使用 Fixtures 与传递方法作为参数