numpy 3D meshgrid仅作为视图

时间:2012-08-16 15:07:21

标签: python numpy scipy numpy-broadcasting

我有一个由间距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's linear interpolation,这需要输入:

  

班级scipy.interpolate.LinearNDInterpolator(points, values)

     

参数:

     

points:ndarray of floats,shape (npoints, ndims)数据点坐标。

     

values:浮点数或复数形式的ndarray,形状(npoints, ...)数据值。

如何从points创建一组假xi,yi,zi(通过魔法广播)?现在我正在创建一个中间数组来提供插值函数 - 有更好的方法吗?

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

3 个答案:

答案 0 :(得分:3)

>>> 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 enumerate(args)])

答案 1 :(得分:1)

您可以采用与其他答案中所述类似的方式构建必要的points数组:

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很可能不是最佳选择,因为它是专为分散数据插值而设计的。它构造了数据点的Delaunay三角剖分,但在这种情况下,原始数据已经具有非常规则的结构,可以更有效地利用它。

由于网格是矩形,因此可以将插值建立为三个1-D插值的张量积。 Scipy没有这个内置(到目前为止),但它很容易做到,请看这个帖子:http://mail.scipy.org/pipermail/scipy-user/2012-June/032314.html (使用例如interp1d而不是pchip来获得1-D插值)

答案 2 :(得分:0)

我不相信你有任何方法可以将一些东西传递给LinearNDInterpolator而不是一个完整的副本(因为三维中也没有常规网格的功能)。所以避免创建完整数组的唯一地方就是在创建这个点数组时,我不知道你现在是怎么做的,所以也许它在这方面已经很有效了,但我想它可能不值得避免此

其他np.mgrid + reshape也许这样的东西可能是一个选项(也不难写为n维度):

# Create broadcastest versions of xi, yi and zi
# np.broadcast_arrays does not allocate the full arrays
xi, yi, zi = np.broadcast_arrays(xi[:,None,None], yi[:,None,None], zi[:,None,None])

# then you could use .flat to fill a point array:
points = np.empty((xi.size, 3), dtype=xi.dtype)
points[:,0] = xi.flat
points[:,1] = yi.flat
points[:,2] = zi.flat

.repeat函数相反,此处创建的临时数组大于原始xi等数组。