用于表面图的python xyz数据转换

ip

我想根据xy和z数据在matplotlib中绘制3D曲面。为此,我需要执行看似简单的数据转换,但不确定如何进行。

我的x和y数据是统一的整数,因为它将是图像的表面。我的数据以512x512 numpy数组的形式存在。数组的值是z值,索引是x和y值。

因此,如果arr是我的数组,请arr[x, y]给我z表单如下所示:

z z z z ... z (512 columns)
z z z z ... z
z z z z ... z
z z z z ... z
. . . .
. . . .
z z z z (512 rows)

如何以三列x,y,z的形式获取数据,以便进行表面绘图?转换后应如下所示:

  x | y | z
  ---------
  0 | 0 | z
  1 | 0 | z
  2 | 0 | z
  . | . | .
  . | . | .
511 | 0 | z
  0 | 1 | z
  1 | 1 | z
  2 | 1 | z
  . | . | .
  . | . | .

我尝试与之合作np.meshgridnp.flatten但无法使其按我想要的方式工作。也许有一个更简单的熊猫解决方案。也许我什至可以用原始数据形式绘制它?

任何建议表示赞赏:)

Jdehesa

您将这样使用np.meshgrid

# Make coordinate grids
x, y = np.meshgrid(np.arange(arr.shape[0]), np.arange(arr.shape[1]), indexing='ij')
# Flatten grid and data and stack them into a single array
data = np.stack([x.ravel(), y.ravel(), arr.ravel()], axis=1)

例如:

import numpy as np

arr = np.arange(12).reshape((3, 4))
x, y = np.meshgrid(np.arange(arr.shape[0]), np.arange(arr.shape[1]), indexing='ij')
data = np.stack([x.ravel(), y.ravel(), arr.ravel()], axis=1)
print(data)

输出:

[[ 0  0  0]
 [ 0  1  1]
 [ 0  2  2]
 [ 0  3  3]
 [ 1  0  4]
 [ 1  1  5]
 [ 1  2  6]
 [ 1  3  7]
 [ 2  0  8]
 [ 2  1  9]
 [ 2  2 10]
 [ 2  3 11]]

编辑:

实际上,如果您要使最终数组的x值首先增加(如您给出的示例中所示),则可以这样做:

x, y = np.meshgrid(np.arange(arr.shape[0]), np.arange(arr.shape[1]), indexing='xy')
data = np.stack([x.ravel(), y.ravel(), arr.T.ravel()], axis=1)

在这种情况下,您将获得:

[[ 0  0  0]
 [ 1  0  4]
 [ 2  0  8]
 [ 0  1  1]
 [ 1  1  5]
 [ 2  1  9]
 [ 0  2  2]
 [ 1  2  6]
 [ 2  2 10]
 [ 0  3  3]
 [ 1  3  7]
 [ 2  3 11]]

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章