2

scipy.ndimage.map_coordinates基本的に、単なるスカラーではなく、多値構造を返すことは可能ですか? 5回補間するのではなく、1回の補間で一度に5つの値を取得できるようにしたいと考えています。

これは、MWE で問題を実証するための私の試みです。スカラーの 3D 補間から始めます。それはポイントではないので、今のところポイント間を移動しません。

import numpy as np
from scipy import ndimage
coords = np.array([[1.,1.,1.]])
a = np.arange(3*3*3).reshape(3,3,3)
ndimage.map_coordinates(a,coords.T) # array([13.])

aここで、値を 1 つだけでなく、ペアにしたいとします。私の本能は

a = np.arange(3*3*3*2).reshape(3,3,3,2)
a[1,1,1] # array([26.,27.])
ndimage.map_coordinates(a[:,:,:],coords.T)  # I'd like array([26.,27.])

目的の出力の代わりに、次の結果が得られます。

RuntimeError                              Traceback (most recent call last)
(...)/<ipython-input-84-77334fb7469f> in <module>()
----> 1 ndimage.map_coordinates(a[:,:,:],np.array([[1.,1.,1.]]).T)

/usr/lib/python2.7/dist-packages/scipy/ndimage/interpolation.pyc in map_coordinates(input, coordinates, output, order, mode, cval, prefilter)
    287         raise RuntimeError('input and output rank must be > 0')
    288     if coordinates.shape[0] != input.ndim:
--> 289         raise RuntimeError('invalid shape for coordinate array')
    290     mode = _extend_mode_to_code(mode)
    291     if prefilter and order > 1:

RuntimeError: invalid shape for coordinate array

探している答えを与える構造 ( 、 など)aの形状の順列が見つかりません。coordsまた、 を使用するよりもこれを行うためのより良い方法がある場合はmap_coordinates、先に進んでください。行くべき道かもしれないと思っscipy.interpolate.interp1dたのですが、ドキュメントやそれが何をするのかについてのインクリングが見つかりません...

4

1 に答える 1

2

それは不可能だと思います。

しかし、テンソル積の補間は難しくありません。

import numpy as np
from scipy.interpolate import interp1d

def interpn(*args, **kw):
    """Interpolation on N-D. 

    ai = interpn(x, y, z, ..., a, xi, yi, zi, ...)
    where the arrays x, y, z, ... define a rectangular grid
    and a.shape == (len(x), len(y), len(z), ...)
    """
    method = kw.pop('method', 'cubic')
    if kw:
        raise ValueError("Unknown arguments: " % kw.keys())
    nd = (len(args)-1)//2
    if len(args) != 2*nd+1:
        raise ValueError("Wrong number of arguments")
    q = args[:nd]
    qi = args[nd+1:]
    a = args[nd]
    for j in range(nd):
        a = interp1d(q[j], a, axis=j, kind=method)(qi[j])
    return a

import matplotlib.pyplot as plt

x = np.linspace(0, 1, 6)
y = np.linspace(0, 1, 7)
k = np.array([0, 1])
z = np.cos(2*x[:,None,None] + k[None,None,:]) * np.sin(3*y[None,:,None])

xi = np.linspace(0, 1, 60)
yi = np.linspace(0, 1, 70)
zi = interpn(x, y, z, xi, yi, method='linear')

plt.subplot(221)
plt.imshow(z[:,:,0].T, interpolation='nearest')

plt.subplot(222)
plt.imshow(zi[:,:,0].T, interpolation='nearest')

plt.subplot(223)
plt.imshow(z[:,:,1].T, interpolation='nearest')

plt.subplot(224)
plt.imshow(zi[:,:,1].T, interpolation='nearest')

plt.show()
于 2012-11-11T22:25:56.137 に答える