好的,所以我有一个xy坐标表,有很多不同的点,如下所示:
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:只能将length-1数组转换为Python标量
那么我怎样才能让它正常运行?
在进行计算时,我怎么能让它自己忽略呢?与对象1(第1行)一样,我不希望它计算与自身的分离。我尝试将ID添加到zip中,并在计算之前在for循环中添加if语句,如if id != id:
,但这不起作用。有没有人知道如何做到这一点?
我的另一个问题是,如何将所有数据写入扁平数组?现在,我让它创建一个空的数组,我用计算值写出来,但最后得到一个(5,5)数组。但我想要一个(5,1),以便我可以将其绘制为直方图。有什么想法吗?
答案 0 :(得分: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])
如果这是所需的行为