计算100维n维的欧几里德范数?

时间:2013-03-04 03:18:46

标签: python numpy scipy

我在python中有一个100个值的列表,其中列表中的每个值对应一个n维列表。

例如

x=[[1 2],[2 3]] is a 2d list

我想计算所有这些点上的欧几里德范数。有没有标准的方法来做到这一点?

4 个答案:

答案 0 :(得分:1)

我在scipy上找到了这个,这很有效。 scipy

答案 1 :(得分:1)

如果我正确地解释了这个问题,那么你有一个100个n维向量的列表,你想要一个他们(欧几里得)规范的列表。

我认为在这里使用numpy最简单(也是最快!),

import numpy as np
a = np.array(x)
np.sqrt((a*a).sum(axis=1))

如果向量没有相同的维度,或者如果你想避免numpy,那么也许,

[sum([i*i for i in vec])**0.5 for vec in x]

,或者

import math
[math.sqrt(sum([i*i for i in vec])) for vec in x]

修改:不完全确定您的要求。所以,或者:看起来你有一个列表,每个元素都是一个n维向量,你想要每个连续对之间的欧几里德距离。 numpy(假设n是固定的),

x = [ [1,2,3], [4,5,6], [8,9,10], [13,14,15] ] # 3D example.
import numpy as np
a = np.array(x)
sqrDiff = (a[:-1] - a[1:])**2
np.sqrt(sqrDiff.sum(axis=1))

最后一行返回的地方,

array([ 5.19615242, 6.92820323, 8.66025404])

答案 2 :(得分:0)

试试这段代码:

from math import sqrt
valueList = [[[1,2], [2,3]], [[2,2], [3,3]]]

def distance(valueList):
  resultList = []
  for (point1, point2) in valueList:
    resultList.append(sqrt(sum(map(lambda (x1, x2): (x1 - x2) * (x1 - x2), zip(point1, point2)))))

  return resultList

print distance(valueList)

输出是 [1.4142135623730951,1.4142135623730951]

这里的valuelist包含2个值,但100个值没有问题..

答案 3 :(得分:0)

您可以这样做来计算每一行的欧几里德范数:

>>> a = np.arange(200.).reshape((100,2))
>>> a
array([[   0.,    1.],
       [   2.,    3.],
       [   4.,    5.],
       [   6.,    7.],
       [   8.,    9.],
       [  10.,   11.],
       ...
>>> np.sum(a**2,axis=-1) ** .5
array([   1.        ,    3.60555128,    6.40312424,    9.21954446,
         12.04159458,   14.86606875,   17.69180601,   20.51828453,
         23.34523506,   26.17250466,   29.        ,   31.82766093,
         34.6554469 ,   37.48332963,   40.31128874,   43.13930922,
         45.96737974,   48.7954916 ,   51.623638  ,   54.45181356,
         ...