如何使用numpy的Meshgrid函数以随机间隔而不是等间距?

时间:2016-07-21 04:33:44

标签: python numpy random plot

从概念上讲,这就是我想做的事情。我想在2D平面中选择随机点,然后绘制表面形状的表面图。类似地,另一种(次优理念)可以是对网格网格进行评级并选择N个随机点及其相应的高度,然后在表面图中绘制它们。

目前,我能够制作表面图的唯一成功方法是使用以下内容进行同样的交叉点:

<table>
<tr>
  <th>Nickname</th>
</tr>

<tr>
  <td>One</td>
</tr>
<tr>
  <td>Big Name</td>
</tr>
<tr>
  <td>A Very Big Name</td>
</tr>

<tr>
  <td>This is a very big name</td>
</tr>
</table>

然后使用标准绘制事物:

start_val, end_val = -1,1
N = 100
x_range = np.linspace(start_val, end_val, N)
y_range = np.linspace(start_val, end_val, N)
(X,Y) = np.meshgrid(x_range, y_range)
Z = np.sin(2*np.pi*X) + 4*np.power(Y - 0.5, 2) #function height for the sake of an example

这导致了函数的漂亮情节,就像我预期的那样。

但是,我想在已知间隔中选择随机点。为此我尝试了替代方案:

fig = plt.figure()
ax = fig.gca(projection='3d')
surf = ax.plot_surface(X, Y, Z, cmap=cm.coolwarm)
plt.title('Original function')

plt.show()

不幸的是,这导致无意义:

enter image description here

而不是像具有均匀间隔点的原始内容更好的东西:

enter image description here

是否有人知道如何完成任务(或类似任务)我试图做但能够以合理的方式绘制随机点或包含一些随机性?

1 个答案:

答案 0 :(得分:2)

用于meshgrid的x和y范围不应该是随机顺序。这是因为绘制一个表面,仅仅在XYZ空间中有一堆点是不够的:我们还需要知道哪些点与哪个相连。这是根据数组中值的相邻性确定的。

示例:如果x_range是[1,2,3]且y_range是[5,9],那么我们知道点(1,5),(2,5),(1,9)和( 2,9)形成要包含在曲面中的矩形的顶点(当然,具有相应的Z值)。如果x_range是[1,3,2],我们将改为具有基于(1,5),(3,5),(1,9)和(3,9)的矩形。

要得到z = f(x,y)的图形,我们需要对x和y数组进行排序,以便我们看到这样的矩形:

plot

(对于参数图,x,y,z是参数u,v的函数,我们不一定会对x和y值进行排序;但是u和v可能会是,并且它们的顺序将决定顺序X,Y。)