如何在python中对二维数组排序
我从点坐标开始,它位于3个列表(xTool、yTool、zTool)中,分别表示我所有点的x、y和z坐标 这里的目标是创建一个包含3列和多行(超过10000行)的矩阵,其中每行表示点的3个坐标。我要做的下一步是像这样的向量变换:(只有当你真的想了解我在做什么时,这才是次要的如何在python中对二维数组排序,python,arrays,sorting,numpy,tuples,Python,Arrays,Sorting,Numpy,Tuples,我从点坐标开始,它位于3个列表(xTool、yTool、zTool)中,分别表示我所有点的x、y和z坐标 这里的目标是创建一个包含3列和多行(超过10000行)的矩阵,其中每行表示点的3个坐标。我要做的下一步是像这样的向量变换:(只有当你真的想了解我在做什么时,这才是次要的 Tool = [[0 for x in xrange(3)] for y in xrange(len(xTool)-1)] for l in xrange((len(xTool) - 1)): Tool[l][0] =
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]
最后,我要做的是根据我的第二列([1])对我的rTool进行排序。例如,我打印了我的rTool的5个条目。根据第二列对它们进行排序,最后一行应该是第一行。我真的很难做到这一点,我怀疑这是因为我有元组而不是真正的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]
请不要犹豫要求澄清,我希望您能帮助我!谢谢。您可以使用'sort'或'sorted'的'key'参数,请参阅 就你而言:
[[ -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]]
或
您正在查找
list.sort()
(或内置的sorted()
)的键
关键字查看键函数
部分
通常人们只使用lambda函数作为排序键,因为它很简洁,而且通常不会多次使用排序函数。它只是一个函数,返回一个对象键
,列表中的每个元素都在该键上排序
所以你可以做:
rToolSorted = sorted(rTool, key=lambda x: x[1])
或:
在这两种情况下,您都可以使用rTool=sorted(rTool,key=…)
,不同之处在于list.sort()
执行就地排序,如果不需要原始数组,则效率更高
key
函数可以是您想要的任何东西,只要它返回其他可以排序的东西,因此如果您的点是具有x,y,z
属性的对象,那么您可以执行rTool.sort(key x:x.y)
首先,学习numpy。用普通python做这种事情与python的一切都背道而驰
完成后:
rTool.sort(key=lambda x: x[1])
要提高numpy home的重要性:
sorted_rtool = rTool[np.argsort(rTool[:,1])]
它不仅干净得多,而且速度快了好几个数量级。为什么它与python的一切都背道而驰?“一切”是一个大词,但它在任何可以想象的方面都是一个错误的工具。在python中重新发明矩阵乘法之类的东西是重新发明轮子的一个坏例子。此外,它模糊了在您的代码中,它更容易出现错误,性能肯定会受到数量级的影响。我想说这通常是正确的,但我真的不喜欢
numpy
重用np.dot()
用于矩阵乘法和求和积以及点积。我认为这是不和谐的,因为它阻碍了实际发生的事情。如果你想说“使用numpy,因为你可以使它更像Python,而不是重新发明轮子”,然后你应该重新开始使用matrix
类,然后你只需要做M*N
就可以实现你想要的。我认为这比np.dot(M,N)
更像pythonic,如果Eelco有勇气推荐使用matrix
类,我希望他已经准备好面对下一轮投票风暴…;-)认真地说,numpy的矩阵
类是一个持续的痛苦来源,最好避免。等一年左右,使用numpy 1.10和Python 3.5,你可以做M@N
,看。好吧,我想我一直是对所提议的@operator最直言不讳的批评,我觉得它只比使用matrix类好一点点,所以你也不会看到我推荐;)。就我个人而言,我对几乎所有的线性产品都使用einsum,因为我不喜欢跟踪轴的走向。显式比隐式好。dot是如何掩盖实际发生的事情的?虽然它不能使轴显式,但它比乘法运算符显式得多,乘法运算符在应用于数组时可能意味着十几种不同的东西。5年前提出的类似问题是,您可能希望使用元组作为坐标,因此您将有一个三元组列表[(x,y,z,)(x,y,z)]
。元组是不可变的,但速度更快。
rTool.sort(key=lambda x: x[1])
sorted_rtool = rTool[np.argsort(rTool[:,1])]
rTool = np.dot(Tool, R)