6

我有一个结构化的 numpy 数组,我按顺序对其进行排序。它工作得很好,但只有一个方向!

降序:

sort(myStructuredArray,order=my_order)[::-1]

上升:

sort(myStructuredArray,order=my_order)

my_order 的顺序类似于[col1,col2,-col3,col4,-col5,...,colN],对于某些列,我想像 col1,col2 和 colN 一样将其按升序排序,而对于其他列,则按 col3 和 col5 (minus signal) 降序排序。在这个例子中,我想先按 col1 升序对数组进行排序,然后按 col2 升序,然后按 col3 降序,然后按 col4 升序,然后按 col5 降序,依此类推……我该怎么做?

谢谢

4

1 回答 1

7

你可以这样做numpy.lexsort

In [1]: import numpy as np
In [2]: a = np.array([(4,0), (1,9), (1,0), (4,9)],
                     dtype=[('x',int),('y',float)])

In [3]: a
Out[3]: 
array([(4, 0.0), (1, 9.0), (1, 0.0), (4, 9.0)], 
      dtype=[('x', '<i8'), ('y', '<f8')])

In [4]: a['x']
Out[4]: array([4, 1, 1, 4])

In [5]: a['y']
Out[5]: array([ 0.,  9.,  0.,  9.])

参数的顺序优先级与 的lexsort相反np.sort(..., order=...)。因此,首先按降序排序'x',然后按升序排序'y'

In [6]: a[np.lexsort((a['y'], -a['x']))]
Out[6]: 
array([(4, 0.0), (4, 9.0), (1, 0.0), (1, 9.0)], 
      dtype=[('x', '<i8'), ('y', '<f8')])

笔记:

  • 假设您的所有值都是数字的(因为负数不会反转字符串排序),这是可行的。
  • 我在某处看到过a['x'][::-1]用作键而不是,-a['x']但现在这对我不起作用。
于 2013-04-12T16:11:18.013 回答