2016-10-12 35 views
0

好了,所以我有XY的表座標這樣一羣不同點:通過表來計算分離循環 - 的Python

ID  X   Y 
    1 403.294 111.401 
    2 1771.424  62.183 
    3 804.812  71.674 
    4 2066.54  43.456 
    5 2208.55  40.907 

的每一行代表與它的ID,X的對象,和Y列。實際上,我的桌子包含大約1345行。我想要做的是循環遍歷每一行,並計算該對象與表中所有其他對象的分離,我將最終使用該對象創建直方圖。我至今是:

sep_dat = np.zeros(shape=(5,5))    #create array for writing into 
dat = np.loadtxt('SEA_mini_test.tab')   #table of data 
IDs = dat[:,0] 
X_dat = dat[:,1] 
X_dat = np.sort(X_dat) 
Y_dat = dat[:,2] 
Y_dat = np.sort(Y_dat) 
for i, x, y in zip(xrange(len(X_dat)), X_dat, Y_dat): 
    sep_dat[i] = math.sqrt((x-X_dat)**2+(y-Y_dat)**2) 
    np.savetxt('SEA_mini_seps.dat', sep_dat, fmt='%10.9f') 

但我還沒有得到它成功運行。我得到的最後一個錯誤是:

TypeError: only length-1 arrays can be converted to Python scalars

那麼我怎樣才能得到這個正常運行?

我怎麼能讓它在進行計算時忽略它本身?就像對象1(第1行)一樣,我不希望它計算與它本身的分離。我嘗試在zip中添加ID並在for循環中添加一個if語句,然後像if id != id:那樣計算,但這不起作用。有沒有人對我如何做到這一點有一個想法?

而我的另一個問題是,我怎麼能把所有的數據寫入一個扁平數組?現在,我已經創建了一個空數組,它用計算值寫出來,但最終我得到了一個(5,5)數組。但我想要一個(5,1),以便我可以將它繪製爲直方圖。有任何想法嗎?

+0

你爲什麼要單獨排序x和y? 你如何定義分離 - 與質心的距離? –

+0

你是什麼意思?分離只是sqrt(dx^2 + dy^2)。我只是試圖計算一個物體與所有其他物體的物理分離。 – Courtney

回答

1

發生錯誤是因爲math.sqrt()只能取一個浮點值,如果你傳遞一個np.array它會嘗試轉換爲浮點數。這隻適用於數組包含單個值的情況。

> math.sqrt(np.array([2])) 
1.4142135623730951 

> math.sqrt(np.array([2,1])) Traceback (most recent call last): 

    File "<ipython-input-49-f9a9c77bfbdf>", line 1, in <module> 
    math.sqrt(np.array([2,1])) 

TypeError: only length-1 arrays can be converted to Python scalars 

您可以使用np.sqrt(),它將返回一個平方根的數組。

> x = np.arange(1,5)  #[1,2,3,4] 
> y = x[::-1]   #[4,3,2,1] 
> z = x**2 + y**2  #[1*1+4*4,...,4*4+1*1] 
> np.sqrt(z) 
array([ 4.12310563, 3.60555128, 3.60555128, 4.12310563]) 

如果這是所期望的行爲

+0

那麼,如何不使用數學來計算平方根? – Courtney

+0

好的,我得到了它的工作。謝謝! – Courtney