【问题标题】:Calculate euclidean norm of 100 points of n-dimensions?计算100个n维点的欧几里得范数?
【发布时间】:2013-03-04 03:18:46
【问题描述】:

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

例如

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

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

【问题讨论】:

  • 所以 3d 值将是 y = [[1,2,3], [1,2,3], [1,2,3]]?
  • @zzk 是的,那是正确的
  • 呵呵.. 也许应该是 y=[[1,2,3],[1,2,3]].. 假设第一个 [1,2,3] 是一个点并且第二个 [1,2,3] 是 3d 中的另一个点..
  • 通过所有这些点的距离,你的意思是到原点的距离(即每个n维向量的大小),还是你的意思是所有点的距离从彼此?
  • 我的意思是欧几里得范数

标签: python numpy scipy


【解决方案1】:

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

【讨论】:

  • 当由于列表的大小而导致计算花费太多时间时,我支持这种方法。
【解决方案2】:

如果我正确解释了这个问题,那么您有一个包含 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])

【讨论】:

    【解决方案3】:

    试试这个代码:

    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 个值没有问题..

    【讨论】:

    • 100 个值你会怎么写?
    • 它应该已经工作了..只需调用距离(your-100-value-list)。假设您的每个值都是 n 维中的 2 个点。
    【解决方案4】:

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

    >>> 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,
             ...
    

    【讨论】:

      猜你喜欢
      • 2021-02-28
      • 1970-01-01
      • 2014-10-27
      • 2015-01-16
      • 1970-01-01
      • 1970-01-01
      • 2012-06-11
      • 1970-01-01
      • 2014-06-09
      相关资源
      最近更新 更多