gpt4 book ai didi

python - 了解 Mathematica 轮廓线提取

转载 作者:行者123 更新时间:2023-12-01 02:21:40 26 4
gpt4 key购买 nike

我的教授给我发了一本 Mathematica Notebook,他在其中绘制了二维轮廓,然后将轮廓提取为线条(即坐标元组列表的列表)。具体代码段如下:

xdiv = 0.05
zt = 1.
lis = Table[SomeFunction[x, y, zt], {y, -xmax, xmax, xdiv}, {x, -xmax, xmax, xdiv}];
plot = ListContourPlot[lis, PlotLegends -> Automatic, Contours -> {0}, ContourShading -> None];
lines = Cases[Normal@plot, Line[pts_, ___] :> xdiv*pts, Infinity];

我不完全理解代码到底是如何完成它的工作的,我正在寻求帮助以获得解释。我想用 python 编写类似的代码并了解如何实现。我还想知道是否可以在不使用 ContourPlot 函数的情况下提取线条。我对绘制轮廓并不是特别感兴趣,我只需要它的线条列表。

编辑:重新表述问题。另:matplotlib - extracting data from contour lines似乎解释了如何用 python 实现我的目标。但是,我不太明白它是如何做的,并判断在性能方面是否有更好的方法来实现它(我正在处理非常大的列表,所以这个轮廓提取似乎是一个瓶颈)。我一直在寻找更多的解释来了解究竟发生了什么。提供的答案确实很好地解释了 Mathematica 代码。我将详细了解 matplotlib 方法。

最佳答案

以下是对正在发生的情况的一些解释,并带有示例函数:

SomeFunction[x_, y_, zt_] := Sin[3 x + y^2]
xmax = 4;

xdiv = 0.05;
zt = 1.;
lis = Table[SomeFunction[x, y, zt], {y, -xmax, xmax, xdiv}, {x, -xmax, xmax, xdiv}];
plot = ListContourPlot[lis, PlotLegends -> Automatic, Contours -> {0},
ContourShading -> None];
normalplot = Normal@plot

enter image description here

cases = Cases[normalplot, Line[pts_, ___], Infinity];
Length[cases]
First[cases]
17
Line[{{16.2216, 1.}, {17., 1.29614}, ... , {16.7818, 160.782}, {16.2216, 161.}}]

Cases 语句从标准化图中提取每一行。 (Normal 将图形形式简化为适合 Cases 的图形形式。)有 17 条单独的行,其形式为 Line[List[{x, y}, {x , y}, ...]].

对于每一行List[{x, y}, {x, y}, ...] 都由pts 表示,因此

lines = Cases[normalplot, Line[pts_, ___] :> xdiv*pts, Infinity]

将每个pts列表乘以xdiv

0.05 * {{16.2216, 1.}, {17., 1.29614}, ... , {16.7818, 160.782}, {16.2216, 161.}}
= {{0.81108, 0.05}, {0.85, 0.0648069}, ... {0.839088, 8.03909}, {0.81108, 8.05}}

可以绘制线条。

ListLinePlot[lines, AspectRatio -> 1]

enter image description here

关于python - 了解 Mathematica 轮廓线提取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47899122/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com