2016-08-12 11 views
1

私は4つのアレイdata(50,8,2048,256)の8つの2048x256ピクセルイメージを含む50グループです。 timesは、各画像が撮影された時間を示す形状の配列(50,8)です。4Dナンシーアレイの最適化

私は、各グループのすべての画像の各ピクセルで一次多項式の近似を計算し、形状の配列(50,2048,256,2)を与えます。これは本質的に、50個のグループのそれぞれのベクトルプロットです。私は多項式を格納するために使用するコードは、次のとおり

fits = np.ones((50,2048,256,2)) 
times = times.reshape(50,8,1).repeat(2048,2).reshape(50,8,2048,1).repeat(256,3) 
for group in range(50):  
    for xpos in range(2048): 
     for ypos in range(256): 
      px_data = data[:,:,ypos,xpos] 
      fits[group,ypos,xpos,:] = np.polyfit(times[group,:,ypos,xpos],data[group,:,ypos,xpos],1) 

今挑戦は私がfitsから多項式係数を使用してアレイ状のnew_data(50,12,2048,256)を生成することですnew_timeからの時間を使用して、12個の画像の50個のグループを生成する。

私は画像を生成するためにnp.polyval(fits, new_time)のようなものを使うことができますが、私はどのようにフレーズするかと非常に混同しています。それは次のようなものです:

new_data = np.ones((50,12,2048,256)) 
for i,(times,fit) in enumerate(zip(new_times,fits)): 
    new_data[i] = np.polyval(fit,times) 

しかし、私は放送エラーを取得しています。どんな支援も大歓迎です! [OK]を

更新 ので、私はそれが仕事をするようにコードを少し変更して、私がしたい正確に何をすべきか、それはすべてのこれらのループとひどく遅いです(グループの意味あたり〜1分、これはほとんど私を取ります走る1時間!)。誰もがこれをスピードアップするために最適化する方法を提案できますか?

# Generate the polynomials for each pixel in each group 
fits = np.ones((50,2048,256,2)) 
times = np.arange(0,50*8*grptme,grptme).reshape(50,8) 
times = times.reshape(50,8,1).repeat(2048,2).reshape(50,8,2048,1).repeat(256,3) 
for group in range(50): 
    for xpos in range(2048): 
     for ypos in range(256): 
      fits[group,xpos,ypos] = np.polyfit(times[group,:,xpos,ypos],data[group,:,xpos,ypos],1) 

# Create new array of 12 images per group using the polynomials for each pixel 
new_data = np.ones((50,12,2048,256)) 
times = np.arange(0,50*12*grptme,grptme).reshape(50,12) 
times = times.reshape(50,12,1).repeat(2048,2).reshape(50,12,2048,1).repeat(256,3) 
for group in range(50): 
    for img in range(12): 
     for xpos in range(2048): 
      for ypos in range(256): 
       new_data[group,img,xpos,ypos] = np.polynomial.polynomial.polyval(times[group,img,xpos,ypos],fits[group,xpos,ypos]) 
+0

フィットと時間は両方とも多次元配列になりますが、numpy.polyvalのドキュメントは1D配列が必要であることを示しています。あなたは 'numpy.polynomial.polynomial.polyval'(ドキュメンテーション[here](http://docs.scipy。org/doc/numpy/reference/generated/numpy.polynomial.polynomial.polyval.html#numpy.polynomial.polynomial.polyval)) – Ajean

+0

@Ajeanこれは正しい関数のように見えます。しかし、それをデータセットにどのように適用するかについてのアドバイスはありますか?私は、グループの多項式係数を使用して、各グループに12の画像を生成したいと思っています(50,12,2048,256)。 –

答えて

0

スピードに関しては、何度も何度も避けなければならないループがたくさんあります。私があなたの問題を完全に理解していれば、8つのデータポイントの50グループに2048×256回の一次多項式を当てはめたいと思っています。だからフィット感のためにイメージの形は役割を果たしません。だから、私の提案は、だから私は行くだろうnp.polyfitであなたはドキュメンテーション文字列

x : array_like, shape (M,) 
    x-coordinates of the M sample points ``(x[i], y[i])``. 
y : array_like, shape (M,) or (M, K) 
    y-coordinates of the sample points. Several data sets of sample 
    points sharing the same x-coordinates can be fitted at once by 
    passing in a 2D-array that contains one dataset per column. 

から同時に

でx値のyの値のいくつかのセットの範囲のために合うことができるので、あなたのイメージを平坦化することです

# Generate the polynomials for each pixel in each group 
fits = np.ones((50,2048*256,2)) 
times = np.arange(0,50*8*grptme,grptme).reshape(50,8) 
data_fit = data.reshape((50,8,2048*256)) 
for group in range(50): 
    fits[group] = np.polyfit(times[group],data_fit[group],1).T 
fits_original_shape = fits.reshape((50,2048,256,2)) 

のためにあなたが最後のインデックス内のパラメータを持つようにしたいので、移調が必要であるが、np.polyfitは、最初にそれらを持っているし、別のデータが設定されます

し、それを評価するためには、再び基本的に同じトリックです:

# Create new array of 12 images per group using the polynomials for each pixel 
new_data = np.zeros((50,12,2048*256)) 
times = np.arange(0,50*12*grptme,grptme).reshape(50,12) 
#times = times.reshape(50,12,1).repeat(2048,2).reshape(50,12,2048,1).repeat(256,3) 
for group in range(50): 
    new_data[group] = np.polynomial.polynomial.polyval(times[group],fits[group].T).T 
new_data_original_shape = new_data.reshape((50,12,2048,256)) 

それはあなたの配列の形状と一致するように、2つの転置が再びにより異なるデータセット対パラメータの順序付けに必要とされています。

おそらく、いくつかの先進的なエンジョイマジックでグループ全体のループを避けることもできますが、これでコードはすでにはるかに速く実行されます。

私はそれが助けてくれることを願っています!

+0

これをリファクタリングして、これが私の試行より約4%速いと計算します。より速い方が良いですが、さらに速くなるとさらに優れています! –