如何将点打印为数组?

时间:2017-02-21 16:23:49

标签: python python-2.7 python-3.x

如何改进适用于数组列表的以下公式。我不想手动输入x和y,我想知道这个距离与哪些点相关

例如:dis: (2,4) & (-4,2) = ??              dis: (-4,2) & (10,-5) = ??

import math
array = [(2, 4), (-4, 2),(10, -5)]


def Distance(x1, y1, x2, y2):

    dist= math.sqrt((x2-x1)**2 +(y2-y1)**2)
    return dist

Distance(array)

2 个答案:

答案 0 :(得分:1)

这将返回一个列表,其中包含作为元组(x,y)输入的每两个连续点之间的(欧几里德)距离。这些代码片段假定使用Python 3.x,因此如果您使用的是Python 2.7,则可能需要进行小的更改。你的标签对此不太清楚。

import math


def distances(lst):
    ln = len(lst)
    dists = []
    if ln >= 2:  # if array contains no or only 1 tuple, return []
        for index, tup in enumerate(lst[:ln - 1]):
            x1, y1 = tup
            x2, y2 = lst[index + 1]  # gets x and y of next tuple in the array
            dists.append(math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2))
    return dists


array0 = []
array1 = [(2, 4), (-4, 2)]
array2 = [(5, 2), (-1, 3), (6, -6)]
array3 = [(2, 4), (-4, 2), (10, -5), (9, -2)]

print(distances(array0))
print(distances(array1))
print(distances(array2))
print(distances(array3))

输出:

[]
[6.324555320336759]
[6.082762530298219, 11.40175425099138]
[6.324555320336759, 15.652475842498529, 3.1622776601683795]

如果您想按照您提到的方式打印距离:

import math


def distances(lst):
    ln = len(lst)
    if ln >= 2:
        for index, tup in enumerate(lst[:ln - 1]):
            x1, y1 = tup
            x2, y2 = lst[index + 1]
            dist = math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2)
            print(lst[index:index + 2], "=", dist)


array = [(5, 2), (-1, 3), (6, -6)]

distances(array)

输出:

[(5, 2), (-1, 3)] = 6.082762530298219
[(-1, 3), (6, -6)] = 11.40175425099138

使用numpy模块而不是math:

可以实现与以前相同的功能
import numpy as np


def distances(lst):
    ln = len(lst)
    dists = []
    if ln >= 2:
        for index, tup in enumerate(lst[:ln - 1]):
            dists.append(np.linalg.norm(lst[index + 1] - tup))
    return dists


array0 = np.array([])
array1 = np.array([(2, 4), (-4, 2)])
array2 = np.array([(5, 2), (-1, 3), (6, -6)])
array3 = np.array([(2, 4), (-4, 2), (10, -5), (9, -2)])

print(distances(array0))
print(distances(array1))
print(distances(array2))
print(distances(array3))

输出:

[]
[6.324555320336759]
[6.0827625302982193, 11.401754250991379]
[6.324555320336759, 15.652475842498529, 3.1622776601683795]

如果您只想要列表中包含的两个元组之间的距离:

import math


def distance(lst):
    return math.sqrt((lst[1][0] - lst[0][0]) ** 2 + (lst[1][1] - lst[
        0][1]) ** 2)


array = [(2, 4), (-4, 2)]

print(distance(array))

输出:

6.324555320336759

答案 1 :(得分:0)

假设您正在使用Python 2.7,因为它不清楚:

import math


def Distance(x1, y1, x2, y2):
    return math.sqrt((x2-x1)**2 +(y2-y1)**2)

points = [(5, 2), (-1, 3), (6, -6)]

pairs = [(points[i], points[i+1]) for i in range(len(points)-1)]

for val in pairs:
    print 'Distance between {0} and {1}: {2}'.format(val[0], val[1], Distance(*val[0]+val[1]))

我们使用列表推导来计算每对点(假设您只需要每对中列表中的连续值),然后使用元组解包将这些值作为Distance方法的输入。< / p>

如果你在Python 3.x中,最后一行应该是:

print('Distance between {0} and {1}: {2}'.format(val[0], val[1], Distance(*val[0], *val[1])))

使用您给出的示例,打印:

Distance between (5, 2) and (-1, 3): 6.0827625303
Distance between (-1, 3) and (6, -6): 11.401754251