2016-11-14 82 views
0

我試圖從一組觀察到的恆星中生成model PSF。我繼ali_mthis answer(以下MCVE)提供的很好的例子偏心加權numpy histogram2d?

的5星我使用這個樣子的:

enter image description here

其中中心(峯值強度)是在垃圾箱[9, 9]。經由numpyhitsogram2d其組合的結果是這樣的:

enter image description here

示出在倉[8, 8]峯密度。在[9, 9]居中,我一定要得到的重心(見下文)爲:

cx, cy = np.array([1.] * len(stars)), np.array([1.] * len(stars)) 

代替。爲什麼是這樣?


import numpy as np 
from matplotlib import pyplot as plt 

stars = # Uploaded here: http://pastebin.com/tjLqM9gQ 

fig, ax = plt.subplots(2, 3, figsize=(5, 5)) 
for i in range(5): 
    ax.flat[i].imshow(
     stars[i], cmap=plt.cm.viridis, interpolation='nearest', 
     origin='lower', vmin=0.) 
    ax.flat[i].axhline(9., ls='--', lw=2, c='w') 
    ax.flat[i].axvline(9., ls='--', lw=2, c='w') 
fig.tight_layout() 

# (nstars, ny, nx) pixel coordinates relative to each centroid 
# pixel coordinates (integer) 
x, y = np.mgrid[:20, :20] 
# centroids (float) 
cx, cy = np.array([0.] * len(stars)), np.array([0.] * len(stars)) 
dx = cx[:, None, None] + x[None, ...] 
dy = cy[:, None, None] + y[None, ...] 

# 2D weighted histogram 
bins = np.linspace(0., 20., 20) 
h, xe, ye = np.histogram2d(dx.ravel(), dy.ravel(), bins=bins, 
          weights=stars.ravel()) 
fig, ax = plt.subplots(1, 1, subplot_kw={'aspect': 'equal'}) 
ax.hold(True) 
ax.imshow(h, cmap=plt.cm.viridis, interpolation='nearest', 
      origin='lower', vmin=0.) 
ax.axhline(8., ls='--', lw=2, c='w') 
ax.axvline(8., ls='--', lw=2, c='w') 

plt.show() 
+1

究竟是什麼問題有點不清楚。也許,如果你離開了這個問題的星系組成部分,這將有助於,狀態正是你所期待的,那怎麼比較你會得到什麼,並創建一個更小例子? – ImportanceOfBeingErnest

+0

這真的很簡單:我預計'np.histogram2d'以箱爲中心'[9,9]',就像我用它來生成它的陣列。我不明白它爲什麼以[8,8]爲中心。很抱歉,但我不認爲我可以讓這個例子更短... – Gabriel

回答

4

原因,直方圖不是在其中單個星強度分佈中心的點(9,9)爲中心,是該代碼來生成它移位圍繞直方圖的區間。

正如我在評論中已經建議,讓事情變得簡單。例如。我們不需要地塊來查看問題。另外,我不明白那些dxdy是,讓我們避開他們。

然後,我們可以計算出通過

import numpy as np 

stars = # Uploaded here: http://pastebin.com/tjLqM9gQ 

# The argmax of a single star results in (9,9) 
single_star_argmax = np.unravel_index(np.argmax(stars[0]), stars[0].shape) 

# Create a meshgrid of coordinates (0,1,...,19) times (0,1,...,19) 
y,x = np.mgrid[:len(stars[0,:,0]), :len(stars[0,0,:])] 
# duplicating the grids 
xcoord, ycoord = np.array([x]*len(stars)), np.array([y]*len(stars)) 
# compute histogram with coordinates as x,y 
# and [20,20] bins  
h, xe, ye = np.histogram2d(xcoord.ravel(), ycoord.ravel(), 
          bins=[len(stars[0,0,:]), len(stars[0,:,0])], 
          weights=stars.ravel()) 

# The argmax of the combined stars results in (9,9) 
combined_star_argmax = np.unravel_index(np.argmax(h), h.shape) 

print single_star_argmax 
print combined_star_argmax 
print single_star_argmax == combined_star_argmax 
# prints: 
# (9, 9) 
# (9, 9) 
# True 

原代碼唯一的問題確實是其0到20之間產生20點線bins = np.linspace(0., 20., 20)直方圖,
0. 1.05263158 2.10526316 ... 18.94736842 20.
這縮放窗口尺寸,以~1.05,並讓您的argmax已經「早一點」出現,然後預期。
你真正想要的是0和19 np.linspace(0,19,20)np.arange(0,20)
之間20分爲了避免這種錯誤,我們可以簡單地給原始數組作爲參數,bins=20的長度。

+0

謝謝IOBE,用於解釋和代碼。 – Gabriel