我编写了一个Python脚本,用二维操作点操作,我对我写几行的方式感到不满意,这些线给我这些点到特定点的距离,坐标(X_0,Y_0)在以下内容:
def f(x):
return sqrt((x[1]-X_0)**2+(x[0]-Y_0)**2)
distances = N.zeros((n_points),dtype=float) #array that will contain the distances after calculation
for temp_x,temp_i in zip(my_points,range(n_points)): #my_points my array of points of shape (2,n_points)
distances[temp_i] = f(temp_x)
这个脚本有效,但我更喜欢整洁的东西,使用不同的函数f,然后简单地说:
distances = f(m_points)
没有循环,无需在之前定义距离。
我的问题在于f的定义,我已经通过使用numpy.vectorize写了1d到1d数组的映射但是从不,2d到1d。
这次可能使用lambda
指令?
编辑:在写下我的问题时,我实际上已经想到了使用map(lambda ...
这样做,这似乎给了我我想要的东西:
distances = map(lambda (x,y): sqrt((x-X_0)**2+(y-Y_0)**2),my_points)
现在看起来不复杂。谢谢!
答案 0 :(得分:3)
这样的事情可以解决你的问题吗?
import numpy as np
def distance(P,P0):
return np.sqrt( (P[:,0]-P0[0])**2 + (P[:,1]-P0[1])**2)
# Draw 100 random points
P = np.random.uniform(0,100,(10,2))
# Point to measure distance to
P0 = (50,50)
# Print all distances
print distance(P,P0)
答案 1 :(得分:0)
从阅读你的问题看来,你的两个主要问题似乎是定义的函数和for循环。
首先,我喜欢你正确定义的函数的解决方案。虽然可以使用lambda完成此任务,但解决方案的复杂性可能在labda表达式中非常拥挤。不过,
lambda x : sqrt((x[1]-X_0)**2+(x[0]-Y_0)**2)
,
是您正在寻找的表达方式。
其次,我认为内置的map()
函数是for循环的完美替代品。可以找到map
的文档here。
总之,您对此问题的一线解决方案是:
distances = map(lambda x : sqrt((x[1]-X_0)**2+(x[0]-Y_0)**2), my_points)