如何在python中对二维数组进行排序

时间:2014-09-23 10:09:27

标签: python arrays sorting numpy tuples

Tool = [[0 for x in xrange(3)] for y in xrange(len(xTool)-1)]
for l in xrange((len(xTool) - 1)):
  Tool[l][0] = yTool[l]; Tool[l][1] = xTool[l]; Tool[l][2] = zTool[l]  

我从点坐标开始,它分别位于3个列表(xTool,yTool,zTool)中,分别代表我所有点的x,y和z坐标。

这里的目的是创建一个包含3列和多行(超过10,000)的矩阵,其中每行代表点的3个坐标。我要做的下一步是像这样的矢量转换:(这只有不重要的,只有当你真的想要了解我在做什么时

rTool = numpy.zeros_like(Tool)   
for rt in xrange((len(xTool) - 1)):
  rTool[rt][0] = (Tool[rt][0] * cos(angle)) - (Tool[rt][1] * sin(angle))
  rTool[rt][1] = (Tool[rt][0] * sin(angle)) + (Tool[rt][1] * cos(angle))
  rTool[rt][2] = Tool[rt][2]

最后,我要做的就是订购我的第二栏([1])的rTool。例如,我打印了5个rTool条目。通过根据第二列对它们进行排序,最后一行应该是第一列。我真的很难做到这一点,我怀疑这是因为我有元组而不是真正的3列数学矩阵。

[[ -584.89837646 -3648.6472168    402.177948  ]
 [ -542.8659668  -3663.34545898   405.76959229]
 [ -500.831604   -3678.04785156   409.32122803]
 [ -458.79336548 -3692.75854492   412.7930603 ]
 [ -416.74984741 -3637.48022461   416.15090942]]

请不要犹豫要求澄清,我希望你能帮助我!感谢。

3 个答案:

答案 0 :(得分:1)

首先,学习numpy。在普通的python中做这种事情与pythonic的所有事情相反。

完成后:

sorted_rtool = rTool[np.argsort(rTool[:,1])]

推动numpy home的重要性:

rTool = np.dot(Tool, R)

不仅更加清洁,而且还要快几个数量级。

答案 1 :(得分:0)

您可以使用'键'参数' sort'或者'排序',请参阅https://wiki.python.org/moin/HowTo/Sorting#Key_Functions

在你的情况下:

rTool.sort(key=lambda x: x[1])

rToolSorted = sorted(rTool, key=lambda x: x[1])

答案 2 :(得分:0)

您正在寻找key关键字list.sort()(或内置sorted())查看Key Functions部分here

人们通常只使用lambda函数作为排序键,因为它简洁,并且您经常不会多次使用sort函数。它只是一个函数,它返回一个对象key,列表的每个元素都在该对象上排序。

所以你可以这样做:

def keyFunc(element):
  return element[1]

rTool.sort(key=keyFunc)

或:

rTool.sort(key=lambda x: x[1])

在这两种情况下,您都可以使用rTool = sorted(rTool, key=...),不同之处在于list.sort()执行就地排序,如果您不需要原始数组则效率更高。

key函数可以是你想要的任何东西,只要它返回一些可以排序的东西,所以如果你的点是具有x, y, z属性的对象,那么你可以做rTool.sort(key x: x.y)