首页 > 解决方案 > 根据特定列对 numpy-array 进行排序

问题描述

考虑一个 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 解决。

标签: pythonnumpysorting

解决方案


您可以使用结构化的 numpy 数组和numpy 的 sortorder=中的可选关键字来做到这一点:

>>> 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')])

推荐阅读