python 曲面图的 xyz 数据转换
python xyz data transformation for surface plot
我想根据 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.meshgrid
和 np.flatten
,但无法按我想要的方式工作。也许有更简单的 pandas 解决方案。或者我什至可以用数据的原始形式绘制它?
欢迎任何建议:)
您可以这样使用 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]]
我想根据 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.meshgrid
和 np.flatten
,但无法按我想要的方式工作。也许有更简单的 pandas 解决方案。或者我什至可以用数据的原始形式绘制它?
欢迎任何建议:)
您可以这样使用 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]]