2016-08-12 129 views
1

我有一個形狀(50,8,2048,256)的四維陣列data這是50組包含8個2048x256像素圖像的組。 times是一個形狀(50,8)的數組,給出每個圖像拍攝的時間。優化4D Numpy陣列構建

我計算一個一階多項式擬合在每個像素的每個組中的所有圖像,給我一個形狀的數組(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) 

現在的挑戰是,我想以產生陣列形狀的new_data(50,12,2048,256)其中,I使用的多項式係數從fits和時間從new_time生成50組12個圖像。

我想我可以使用像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) 

但我得到廣播錯誤。任何援助將不勝感激!

更新 好了,我改變了代碼一點,這樣它的工作,我希望做的事情,但它與所有這些循環(〜每組字義1 minute此會帶我幾乎非常緩慢一個小時跑!)。任何人都可以提出一種方法來優化它來加速它?

# 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'的文檔表明它想要一維數組。你可以看看'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

關於速度,我看到了很多循環,這是由於numpy的美麗應該和經常可以避免的循環。如果我完全理解你的問題,你想在50個8個數據點2048 * 256次的組合上擬合一階多項式。所以爲了適合你的形象不起作用。所以我的建議是扁平化您的圖像,因爲與np.polyfit你可以在同一時間

適合各種x值幾套y值的從文檔字符串

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. 

所以我會去對於

# 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)) 

兩個轉置再次需要因參數對不同數據的排序設置。

也許人們也可以避免使用一些先進的numpy魔術循環遍佈組,但是由於代碼運行速度更快。

我希望它有幫助!

+0

只是重構它,並計算出這比我的嘗試快大約4%。更快更好,但更快會更好! –