使用numpy矢量化在2D数组中仅对一个轴进行矢量化

时间:2014-06-08 18:46:52

标签: python arrays python-2.7 numpy vectorization

我有以下函数来获得两个向量ab之间的欧几里德距离。

def distance_func(a,b):
    distance = np.linalg.norm(b-a)
    return distance

在这里,我希望a成为向量数组的元素。所以我使用numpy vectorize迭代数组。 (为了获得比使用for循环迭代更好的速度)

vfunc = np.vectorize(distance_func)

我使用以下方法获得欧几里德距离数组

a = np.array([[1,2],[2,3],[3,4],[4,5],[5,6]])
b = np.array([1,2])

vfunc(a,b)

但是这个函数返回:

  

数组([[0.,0。],          [1.,1。],          [2.,2。],          [3.,3。],          [4.,4。]])

这是对第二个向量分别执行操作np.linalg.norm(a-b)的结果。 如何使用numpy vectorize以这种方式获取欧几里德距离数组?

2 个答案:

答案 0 :(得分:4)

您不需要使用vectorize,您可以这样做:

a = np.array([[1,2],[2,3],[3,4],[4,5],[5,6]])
b = np.array([1,2])

np.linalg.norm(a-b, axis=1)

给出:

[ 0.          1.41421356  2.82842712  4.24264069  5.65685425]

(我认为这是你想要的,但如果没有,请同时展示你期望的结果。)

答案 1 :(得分:1)

如果您想计算所有数据点之间的欧氏距离,您应该使用为此效果提供的功能之一

from sklearn.metrics import euclidean_distances
from scipy.spatial import distance_matrix

它们经过优化,可以完全向量化的方式计算几个点a几个b的距离。

import numpy as np
a = np.random.randn(100, 2)
b = np.random.randn(200, 2)

d1 = euclidean_distances(a, b)
d2 = distance_matrix(a, b, p=2)
print d1.shape  # yields (100, 200), one distance for each possible couple
print d2.shape

速度考虑

In [90]: %timeit d1 = euclidean_distances(a, b)
1000 loops, best of 3: 403 us per loop

In [91]: %timeit d2 = distance_matrix(a, b, p=2)
1000 loops, best of 3: 699 us per loop