2017-06-12 75 views
0

我有一個凹凸不平的陣列,它在不同半徑的圓圈中均勻填充了強度讀數(對於上下文,這是一個用於原恆星形成模型的一維輻射傳輸項目:更好的模型存在,我的主管讓我有製作一個經驗,所以我瞭解別人如何工作)。將徑向強度的一維numpy陣列轉換爲空間強度的二維陣列

我想取這個1d數組,並通過一個圓圈「旋轉」它,形成一個二維強度數組,然後可以用imshow顯示(或者用一點工作,aplpy)。最後一個數組需要是2d,並且投影需要是笛卡兒,而不是極座標。

我可以用嵌套for循環做到這一點,我可以用查找表來做到這一點,但我有一種感覺,必須有一種在numpy或其他東西中做的完美方式。

任何想法?

編輯:

我不得不回去,並重新創建的我(坦言可怕的)混亂的循環,如果我收到了陳述。如果我真的嘗試過,我可以通過壓縮東西來擺脫其中一個循環和一個if語句。但是,目的不是爲了使它適用於循環,而是看看是否有內置的方法來旋轉數組。 impB是一個與我之前說過的數據略有不同的數組。它實際上只是檢測粒子的半徑列表。然後,我將它們放入半徑箱中,以獲得每個半徑的強度(或者,如果您願意的話)。當我以無量綱方式運行模型時,R是我的半徑的比例因子。 iRes是分辨率比例因子,基本上我想要對我的放射性倉進行採樣的頻率。其他一切都應該清楚。

radJ = np.ndarray(shape=(2*iRes, 2*iRes)) # Create array of 2xRadius square 

for i in range(iRes): 
    n = len(impB[np.where(impB[:] < ((i+1.) * (R/iRes)))]) # Count number of things within this radius +1 
    m = len(impB[np.where(impB[:] <= ((i) * (R/iRes)))])  # Count number of things in this radius 
    a = (((i + 1) * (R/iRes))**2 - ((i) * (R/iRes))**2) * math.pi # A normalisation factor based on area.....dont ask 
    for x in range(iRes): 
     for y in range(iRes): 
      if (x**2 + y**2) < (i * iRes)**2: 
       if (x**2 + y**2) >= (i * iRes)**2: # Checks for radius, and puts in cartesian space 
        radJ[x+iRes,y+iRes] = (n-m)/a # Put in actual intensity bins 
        radJ[x+iRes,-y+iRes] = (n-m)/a 
        radJ[-x+iRes,y+iRes] = (n-m)/a 
        radJ[-x+iRes,-y+iRes] = (n-m)/a 
+0

分享你的代碼,如果你已經實施它? – Divakar

+0

我剛剛用一個工作示例更新了我的代碼。 – Franz

回答

0

嵌套循環是一種簡單的方法。隨着ri_data_ry包含您的半徑值(差到中間像素)和數組的旋轉,分別,我會建議:

from scipy import interpolate 
import numpy as np 
y = np.random.rand(100) 
ri_data_r = np.linspace(-len(y)/2,len(y)/2,len(y)) 
interpol_index = interpolate.interp1d(ri_data_r, y) 
xv = np.arange(-1, 1, 0.01) # adjust your matrix values here 
X, Y = np.meshgrid(xv, xv) 
profilegrid = np.ones(X.shape, float) 
for i, x in enumerate(X[0, :]): 
    for k, y in enumerate(Y[:, 0]): 
     current_radius = np.sqrt(x ** 2 + y ** 2) 
     profilegrid[i, k] = interpol_index(current_radius) 
print(profilegrid) 

這會給你你正在尋找什麼。你只需要加入你的數組並計算一個對稱數組ri_data_r,它與你的數據數組具有相同的長度,幷包含實際數據和數組中間的距離。代碼自動執行此操作。