2011-10-13 31 views
2

私は第1軸で補間したい配列を持っています。現時点では、私は、この例のようにそれをやっている:Pythonで3D配列を補間する。ループを避けるには?

import numpy as np 
from scipy.interpolate import interp1d 

array = np.random.randint(0, 9, size=(100, 100, 100)) 
new_array = np.zeros((1000, 100, 100)) 
x = np.arange(0, 100, 1) 
x_new = np.arange(0, 100, 0.1) 

for i in x: 
    for j in x: 
     f = interp1d(x, array[:, i, j]) 
     new_array[:, i, j] = f(xnew) 

私が使用するデータは、5日間の10年は、ドメイン内の各緯度と経度の値の平均を表します。私は毎日の値の配列を作成したい。

私もスプラインを使ってみました。私は彼らがどのように動作するかは分かりませんが、それほど速くはありませんでした。

forループを使用せずにこれを行う方法はありますか? forループを使用する必要がある場合、これを高速化する他の方法はありますか?

ご協力いただきありがとうございます。

答えて

6

あなたがinterp1dする軸引数を指定することができます:簡単な例として

それが動作するように

 
import numpy as np 
from scipy.interpolate import interp1d 
array = np.random.randint(0, 9, size=(100, 100, 100)) 
x = np.linspace(0, 100, 100) 
x_new = np.linspace(0, 100, 1000) 
new_array = interp1d(x, array, axis=0)(x_new) 
new_array.shape # -> (1000, 100, 100) 

+0

良い点! OPが本当に1D補間(双線形ではない)を望むなら、これが行く方法です。 –

+0

これもうまくいきます。ありがとうございました!興味深いことに、(この場合は少なくとも)この方法では、補間された配列の平均値が元の配列の平均値に近づくことに注意してください。 – nicholaschris

5

定期的にグリッド化されたデータを補間するため、scipy.ndimage.map_coordinatesを使用してください。

import numpy as np 
import scipy.ndimage as ndimage 

interp_factor = 10 
nx, ny, nz = 100, 100, 100 
array = np.random.randint(0, 9, size=(nx, ny, nz)) 

# If you're not familiar with mgrid: 
# http://docs.scipy.org/doc/numpy/reference/generated/numpy.mgrid.html 
new_indicies = np.mgrid[0:nx:interp_factor*nx*1j, 0:ny, 0:nz] 

# order=1 indicates bilinear interpolation. Default is 3 (cubic interpolation) 
# We're also indicating the output array's dtype should be the same as the 
# original array's. Otherwise, a new float array would be created. 
interp_array = ndimage.map_coordinates(array, new_indicies, 
             order=1, output=array.dtype) 
interp_array = interp_array.reshape((interp_factor * nx, ny, nz)) 
+0

グレートおかげで、それが見えます。マスクされた配列でも動作しますか? – nicholaschris

+0

編集:ありがとう、それはうまくいくように見えます。私は補間される配列としてマスクされた配列でそれを使用しています。それは問題を複雑にするだろうか? output = array.dtypeを設定した場合、奇妙な結果が出ますが、出力をデフォルトのままにしておくと正常に動作しているようです。 – nicholaschris

関連する問題