簡體   English   中英

如何在python中對二維數組進行排序

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM