用数学方程对二维数组进行排序

时间:2016-09-20 22:23:00

标签: python arrays sorting

我有一个包含(x,y)的二维数组列表,但是我想用最小值的等式((x ^ 2 + y ^ 2)的平方根)对此列表进行排序。

例如,我有这四个2D列表:

(20,10)
(3,4)
(5,6)
(1.2,7)

如果我在此列表中取每个2D数组的平方根并返回排序列表的最小值,则输出为:

(3,4)
(1.2,7)
(6.5,4)
(5,6)
(20,10)

守则:

M=[ [20,10],[3,4],[5,6],[1.2,7],[6.5,4]]

S = np.sqrt(M)

A = []

print s

表示范围(0,h)中的i:

  for j in range(0,w):

     a[i] =s[i][j]+a[i]

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

使用列表的内置排序方法:

from math import sqrt

def dist(elem):
    return sqrt(pow(elem[0], 2) + pow(elem[1], 2))

def sorting_func(first, second):

    if dist(first) < dist(second):
        return 1
    elif dist(second) < dist(first):
        return -1
    else:
        return 0

bla= [(3, 2), (5, 4)]

bla.sort(sorting_func)

print bla

答案 1 :(得分:0)

下面的代码将解决您的要求,如果您希望了解订购的工作原理,请取消注释打印报表!!

import math
array = [(20,10), (3,4), (5,6), (1.2,7)]
sortList = []
count = 0
tempList = []
placeholder = []
#Compute the Equation of Minimum Value
for x,y in array:
    tempList.append(math.sqrt((x**2) + (y**2)))
    tempList.append(array[count])
    sortList.append(tempList)
    tempList = []
    count += 1
#Sort list
count = 1
placeholder  = sortList[0][:]
##print('ORIGINAL LIST\n', sortList)
while count < (len(sortList)):
    if sortList[count - 1][0] < sortList[count][0]:
##        print('THIS IS COUNT', count)
        count += 1
    else:
        placeholder = sortList[count - 1][:]
##        print("this is placeholder: ", placeholder)
        sortList[count - 1] = sortList[count]
##        print(sortList)
        sortList[count] = placeholder
##        print(sortList)
        placeholder = []
        count = 1

答案 2 :(得分:0)

将数据结构切换为元组列表,然后使用最小值作为关键函数进行排序(使用memoization提高效率):

M = [(20, 10), (3, 4), (5,6), (1.2, 7), (6.5, 4)]

def minimum_value(coordinate, dictionary={}):  # intentional dangerous default value
    if coordinate not in dictionary:
        dictionary[coordinate] = coordinate[0]**2 + coordinate[1]**2

    return dictionary[coordinate]

M_sorted = sorted(M, key=minimum_value)

print(M_sorted)

<强>输出

[(3, 4), (1.2, 7), (6.5, 4), (5, 6), (20, 10)]

由于我们只是排序,我们不需要计算平方根,正方形就足够了。