【问题标题】:Generating data from meshgrid data (Numpy)从网格数据生成数据(Numpy)
【发布时间】:2017-02-04 11:11:45
【问题描述】:

我想问一下如何从网格中生成相应的值。我有一个函数“foo”,它接受一个长度为 2 的一维数组,并返回一些实数。

import numpy as np

def foo(X):  
    #this function takes a vector, e.g., np.array([2,3]), and returns a real number.
    return sum(X)**np.sin( sum(X) );

x = np.arange(-2, 1, 1)          # points in the x axis
y = np.arange( 3, 8, 1)          # points in the y axis
X, Y = np.meshgrid(x, y)         # X, Y : grid

我使用 meshgrid 生成 X 和 Y 网格。

那么,如何使用“foo”函数生成相应的 Z 值,以便在 3D 中绘制它们,例如,使用带有 X、Y、Z 值的 plot_surface 函数绘制?

这里的问题是如何使用“foo”函数生成与 X 和 Y 具有相同形状的 Z 值。由于我的“foo”函数只需要一个一维数组,我不知道如何将这个函数与 X 和 Y 一起使用来生成相应的 Z 值。

【问题讨论】:

  • 对于网格中的每个点 (x, y) 是否需要 z = foo([x, y])

标签: python numpy matplotlib


【解决方案1】:

使用np.dstack 在“深度”中堆叠两个numpy 数组,然后修改foo 函数,使其仅在堆叠数组的最后一个轴上运行。这很容易使用带有参数axis=-1np.sum 来完成,而不是使用内置的sum

import numpy as np

def foo(xy):
    return np.sum(xy, axis=-1) ** np.sin(np.sum(xy, axis=-1))

x = np.arange(-2, 1, 1)          # points in the x axis
y = np.arange( 3, 8, 1)          # points in the y axis
X, Y = np.meshgrid(x, y)         # X, Y : grid
XY = np.dstack((X, Y))

现在,你应该得到:

>>> XY.shape
(5, 3, 2)
>>> foo(XY)
array([[ 1.        ,  1.87813065,  1.1677002 ],
       [ 1.87813065,  1.1677002 ,  0.35023496],
       [ 1.1677002 ,  0.35023496,  0.2136686 ],
       [ 0.35023496,  0.2136686 ,  0.60613935],
       [ 0.2136686 ,  0.60613935,  3.59102217]])

如果你想达到同样的效果,但修改foo,那么你可以使用np.apply_along_axis,它应该完全符合你的需要:

>>> np.apply_along_axis(foo, -1, XY)
array([[ 1.        ,  1.87813065,  1.1677002 ],
       [ 1.87813065,  1.1677002 ,  0.35023496],
       [ 1.1677002 ,  0.35023496,  0.2136686 ],
       [ 0.35023496,  0.2136686 ,  0.60613935],
       [ 0.2136686 ,  0.60613935,  3.59102217]])

【讨论】:

  • 感谢您提供出色的解决方案。这正是我想做的。但是,将这种方法应用于我的代码块时,我遇到了一些问题。我实际上发布了关于这个问题的另一个问题link。我实际的 foo 函数其实是 return X[0] + X[1]; 之类的,所以它不能对嵌套数组进行迭代操作,只能取 (2,) 的形式。因此,如果我将 XY 放入我的实际 foo 函数中,它会吐出我们的错误。这种情况下,怎么能像你那样生成Z呢?
  • 糟糕,抱歉,我忘记了!
  • 顺便问一下,如果我只想使用目前只能采用 (2,) 形状的 foo 函数,您能告诉我应该如何更改您的 ode 吗?
  • @AnnDescomp 我已就您的其他问题发布了答案。看看这是否适合你...
  • 我现在正在查看“...”索引。另外,我想知道是否有一种方法可以使用我当前的 foo 函数生成 Z,它可以显式地将一个 (2,) 形状的 Numpy 数组作为参数。
猜你喜欢
  • 1970-01-01
  • 2016-06-14
  • 1970-01-01
  • 2020-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-12
相关资源
最近更新 更多