谁知道怎么用 python 画等值面图啊?

2016-07-13 17:06:06 +08:00
 nccers

老师给了我一组数据, 让我把图画出来 效果是这样的 http://v1.freep.cn/3tb_160713170646njy5512293.jpg 数据在这里 http://yun.baidu.com/share/link?shareid=3048138222&uk=637680708 啊 我快要崩溃了, python 到底要怎样才能生成三维网格? 到底要怎样才能三维插值? 谁能帮帮我啊!

5412 次点击
所在节点    Python
9 条回复
justou
2016-07-13 18:16:33 +08:00
nccers
2016-07-13 19:48:27 +08:00
@justou 我都看了 contour3d 需要一个三维网格与对应的值, interpn 也只能对三维网格插值, 问题是我的数据是散点, 要用 mgrid 生成三维网格然后再用, griddata 插值, 我现在就卡在 griddata 插值上了, 这个函数搜来搜去只有 matlab 的例子, python 只有简单的一句话没有例子 .我是实在没办法了, 能帮我写个例子么?
nccers
2016-07-13 19:50:04 +08:00
@justou griddata 插值 1D 和 2D 都有例子, 可 3D 没有, 怎么办才好...
lazydao
2016-07-13 20:23:15 +08:00
为啥一点要 Python ?
nccers
2016-07-13 20:29:18 +08:00
@lazydao 我和老师夸下海口, 说自己能用 python 画出来. 汗
nccers
2016-07-13 20:30:29 +08:00
nccers
2016-07-13 20:32:22 +08:00
python 卡在 griddata 函数上了 他需要构建一个 ndarray 的 tuple 但没例子我也不知道这个 tuple 是什么样子的啊
justou
2016-07-14 02:16:44 +08:00
不太清楚你的问题细节, 写了个 3d 插值的例子:

# -*- coding: utf-8 -*-
import numpy as np
from scipy.interpolate import interpn
from enthought.mayavi import mlab

mlab.options.offscreen = True

original_points = 20j
interp_points = 40j
figsize = (1280, 720)

x, y, z = np.mgrid[-15:14:original_points, -12:12:original_points, -14:15:original_points]
# x.shape: 20x20x20
# y.shape: 20x20x20
# z.shape: 20x20x20
s = np.sin(x*y*z)/(x*y*z) # s.shape: 20x20x20
mlab.contour3d(x, y, z, s)
mlab.savefig("original.png", size=figsize)

xs, ys, zs = np.mgrid[-15:14:interp_points, -12:12:interp_points, -14:15:interp_points]

# Construct a 3d array of 3-dimensional points.
arr_4d = np.concatenate((xs[..., None], ys[..., None], zs[..., None]), axis=3) # shape: 40x40x40x3
ss = interpn((x[:, 0, 0], y[0, :, 0], z[0, 0, :]), s, arr_4d, method="nearest")

# Weirdly though, this will also work, why?(゚д゚)
sss = interpn((x[:, 0, 0], y[0, :, 0], z[0, 0, :]), s, (xs, ys, zs), method="nearest")
print np.all(ss == sss) # True

mlab.contour3d(xs, ys, zs, ss)
mlab.savefig("interpolate.png", size=figsize)
justou
2016-07-14 02:21:43 +08:00
axis 改成-1 好一点
np.concatenate((xs[..., None], ys[..., None], zs[..., None]), axis=-1)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/292271

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX