我有一個凹凸不平的陣列,它在不同半徑的圓圈中均勻填充了強度讀數(對於上下文,這是一個用於原恆星形成模型的一維輻射傳輸項目:更好的模型存在,我的主管讓我有製作一個經驗,所以我瞭解別人如何工作)。將徑向強度的一維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
分享你的代碼,如果你已經實施它? – Divakar
我剛剛用一個工作示例更新了我的代碼。 – Franz