2016-10-12 38 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