python - python numpy 3D meshgrid仅作为视图

  显示原文与译文双语对照的内容

由间距 xi,yi,zi 定义了三次网格:


xi,yi,zi = [linspace(ox,ox+s*d,s) for ox,s,d in zip(origin,size,delta)]



我还在网格上设置了标量值 WW.shape() == size 。我想使用 scipy 插值的线性,它需要输入:

scipy.interpolate.LinearNDInterpolator(points, values) :

参数:

points: 浮点的ndarray,形状 (npoints, ndims) 数据点坐标。

values: float或者复杂的ndarray,形状 (npoints,.. .) 数据值。

如何从 xi,yi,zi 创建一套伪 points ( 通过神奇广播)? 现在我正在创建一个中间 array 来给插值函数提供反馈- 有更好的方法?

相关问题: 3D Numpy meshgrid 。 这个帖子中的答案实际上创建了网格- 我只想将它模拟为另一个函数( 纯numpy解决方案首选)的输入。

时间: 原作者:


>>> xi, yi, zi = [np.arange(3) for i in range(3)]


>>> xx, yy, zz = np.broadcast_arrays(xi,yi[:,np.newaxis],zi[:,np.newaxis,np.newaxis])


>>> xx.shape


(3, 3, 3)


>>> xx.strides


(0, 0, 8)



你可以看到它没有创建新的副本,因为前两个维度中的步骤是 0.

我还编写了一个n 维的版本:


def ndmesh(*args):


 args = map(np.asarray,args)


 return np.broadcast_arrays(*[x[(slice(None),)+(None,)*i] for i, x in enumera


te(args)])



原作者:

你可以按照与其他答案相同的方式构造必要的points array:


xx, yy, zz = np.broadcast_arrays(xi[:,None,None], yi[None,:,None], zi[None,None,:])


points = (xx.ravel(), yy.ravel(), zz.ravel())


ip = LinearNDInterpolator(points, data.ravel())



然而,如果有规则网格,那么使用 LinearNDInterpolator 很可能不是最好的选择,因为它是为分散数据插值设计的。 它构造了一个数据点三角三角形,但是原始数据已经是一个非常有效的结构。

由于网格是矩形的,所以可以将插值建立为三个 1-D 插值的张量乘积。 scipy 没有在( 到目前为止) 中生成,但是它相当容易,请参见这个线程: http://mail.scipy.org/pipermail/scipy-user/2012-June/032314.html ( 使用 比如 interp1d而不是pchip来获取 1-D 内插)

原作者:
...