在点阵列上应用函数的正确方法

时间:2014-05-30 07:32:54

标签: python function numpy

我编写了一个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)

现在看起来不复杂。谢谢!

2 个答案:

答案 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)