Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中对二维数组排序_Python_Arrays_Sorting_Numpy_Tuples - Fatal编程技术网

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

如何在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] =

我从点坐标开始,它位于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] = 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)