[英]How to sort two-dimensional array in python
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]]
不要犹豫,要求澄清,希望您能为我提供帮助! 谢谢。
首先,学习numpy。 在普通的python中做这种事情与所有pythonic背道而驰。
完成此操作后:
sorted_rtool = rTool[np.argsort(rTool[:,1])]
推动numpy home的重要性:
rTool = np.dot(Tool, R)
它不仅干净很多,而且速度也快了几个数量级。
您可以使用'sort'或'sorted'的'key'参数,请参见https://wiki.python.org/moin/HowTo/Sorting#Key_Functions
在您的情况下:
rTool.sort(key=lambda x: x[1])
要么
rToolSorted = sorted(rTool, key=lambda x: x[1])
您正在寻找list.sort()
的key
关键字(或内置的sorted()
)。在此处查看Key Functions
部分。
简而言之,人们通常只是将lambda函数用作排序键,而您通常不会多次使用sort函数。 它是一个返回对象key
的函数,在该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: xy)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.