簡體   English   中英

根據特定列對 numpy-array 進行排序

[英]Sort a numpy-array according to specific column

考慮一個 numpy 數組,如下所示:

  coords =   [[34. 22.]
              [11. 38.]
              [22. 56.]
              [23. 22.]
              [86. 30.]]

此數組包含 5 個點的 x 和 y 坐標。 我正在尋找這個數組中具有最小 y 坐標的點。 我可以很容易地找到它使用

idx = np.argpartition(coords[:,1],1)[0]
pt = coords[idx]

沒問題。 除了coords中實際上有兩個點具有相同的最小 y 值:22

我想要具有較小 x 值的點,即不是[34 22]我想要[23 22]

這已經不是小事了。 因為我希望能夠為任意坐標矩陣找到這樣的點。 即可能有許多點具有相同的最小 y 坐標。 不止兩個。 然后我想根據它們的 x 坐標對它們進行排序。

我開始用一個丑陋的 for 循環來解決這個問題,但失敗了。 這是我到目前為止:

noPoints = coords.shape[0]

y = []
for i in range(0, noPoints-1):
    minIdx = 0
    for j in range(i+1, noPoints):
        if coords[j][1] < coords[i][1]:
            minIdx = j

好。 我可以找到最小的 y 值。 但就是這樣。 我開始相信這個任務不能用 numpy-arrays 來解決。

您可以使用結構化的numpy 數組和numpy 排序中order=可選關鍵字來做到這一點:

>>> x = np.array([(34.,22.),(11., 38.),(22.,56.),(23., 22.),(86.,30.)], dtype = [('x',float),('y',float)])
>>> x
array([(34., 22.), (11., 38.), (22., 56.), (23., 22.), (86., 30.)],
  dtype=[('x', '<f8'), ('y', '<f8')])
>>> x.sort(order = ['y','x'])
>>> x
array([(23., 22.), (34., 22.), (86., 30.), (11., 38.), (22., 56.)],
  dtype=[('x', '<f8'), ('y', '<f8')])

你可以使用np.lexsort

coords[np.lexsort((coords[:,1], coords[:,0]))]

輸出:

array([[11., 38.],
       [22., 56.],
       [23., 22.],
       [34., 22.],
       [86., 30.]])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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