64

我想知道 Python 中是否有一个函数可以确定两个有理数之间的距离,但我没有告诉它哪个数字更大。例如

>>>distance(6,3)
3
>>>distance(3,6)
3

显然我可以写一个简单的定义来计算哪个更大,然后做一个简单的减法:

def distance(x, y):
    if x >= y:
        result = x - y
    else:
        result = y - x
    return result

但我宁愿不必调用这样的自定义函数。根据我有限的经验,我经常发现 Python 有一个内置函数或模块,可以完全按照您的意愿执行操作,并且比您的代码执行速度更快。希望有人能告诉我有一个内置函数可以做到这一点。

4

10 回答 10

130

abs(x-y)将完全符合您的要求:

In [1]: abs(1-2)
Out[1]: 1

In [2]: abs(2-1)
Out[2]: 1
于 2012-11-28T09:49:13.653 回答
23

尽管abs(x - y)并且等效地abs(y - x)起作用,但以下单行代码也起作用:

  • math.dist((x,), (y,))(在 Python ≥3.8 中可用)

  • math.fabs(x - y)

  • max(x - y, y - x)

  • -min(x - y, y - x)

  • max(x, y) - min(x, y)

  • (x - y) * math.copysign(1, x - y),或等效(d := x - y) * math.copysign(1, d)地在 Python ≥3.8

  • functools.reduce(operator.sub, sorted([x, y], reverse=True))

所有这些都返回欧几里德距离(x,y)

于 2016-10-16T20:23:01.227 回答
8

如果你有一个数组,你也可以使用numpy.diff

import numpy as np
a = [1,5,6,8]
np.diff(a)
Out: array([4, 1, 2])
于 2016-11-15T09:09:51.503 回答
7

只需使用abs(x - y). 这会将两者之间的净差作为正值返回,无论哪个值更大。

于 2012-11-28T09:49:13.243 回答
2

这并没有解决最初的问题,但我想我会扩展 zinturs 给出的答案。如果您想确定任意两个数字之间的适当符号距离,您可以使用如下自定义函数:

import math

def distance(a, b):
    if (a == b):
        return 0
    elif (a < 0) and (b < 0) or (a > 0) and (b > 0):
        if (a < b):
            return (abs(abs(a) - abs(b)))
        else:
            return -(abs(abs(a) - abs(b)))
    else:
        return math.copysign((abs(a) + abs(b)),b)

print(distance(3,-5))  # -8

print(distance(-3,5))  #  8

print(distance(-3,-5)) #  2

print(distance(5,3))   # -2

print(distance(5,5))   #  0

print(distance(-5,3))  #  8

print(distance(5,-3))  # -8

请分享更简单或更 Pythonic 的方法,如果你有的话。

于 2017-11-19T16:17:33.967 回答
1

使用此功能。

它与您想要的相同约定。使用python的简单abs特性。

还有——有时答案很简单,我们想念它们,没关系:)

>>> def distance(x,y):
    return abs(x-y)
于 2012-11-28T09:49:29.410 回答
1

如此简单,只需使用 abs((a) - (b))。

无需任何额外注意迹象(正面,负面)即可无缝工作

def get_distance(p1,p2):
     return abs((p1) - (p2))

get_distance(0,2)
2

get_distance(0,2)
2

get_distance(-2,0)
2

get_distance(2,-1)
3

get_distance(-2,-1)
1
于 2019-11-11T16:13:58.343 回答
0

如果您打算使用 phi 发布的有符号距离计算片段(就像我所做的那样)并且您的 b 值可能为 0,您可能需要修复如下所述的代码:

import math

def distance(a, b):
    if (a == b):
        return 0
    elif (a < 0) and (b < 0) or (a > 0) and (b >= 0): # fix: b >= 0 to cover case b == 0
        if (a < b):
            return (abs(abs(a) - abs(b)))
        else:
            return -(abs(abs(a) - abs(b)))
    else:
        return math.copysign((abs(a) + abs(b)),b)

当 a > 0 和 b == 0 时,原始代码段无法正常工作。

于 2018-05-23T16:40:12.603 回答
-1

abs 函数绝对不是您需要的,因为它不计算距离。试试 abs (-25+15) 看看它不起作用。数字之间的距离为 40,但输出为 10。因为它正在做数学运算,然后删除前面的“减号”。我正在使用这个自定义功能:


def distance(a, b):
    if (a < 0) and (b < 0) or (a > 0) and (b > 0):
        return abs( abs(a) - abs(b) )
    if (a < 0) and (b > 0) or (a > 0) and (b < 0):
        return abs( abs(a) + abs(b) )

print distance(-25, -15) print distance(25, -15) print distance(-25, 15) print distance(25, 15)

于 2016-11-15T14:36:30.510 回答
-6

你可以试试:a=[0,1,2,3,4,5,6,7,8,9];

[abs(x[1]-x[0]) for x in zip(a[1:],a[:-1])]

于 2014-04-08T19:35:33.653 回答