[英]numpy structured array sorting by multiple columns
一個最小的 numpy 結構化數組生成器:
import numpy as np
index = np.arange(4)
A = np.stack((np.sin(index), np.cos(index)),axis=1)
B = np.eye(4).astype(int)
C = np.array([1, 0, 1, 0], dtype=bool)
goodies = [(a, b, c, d) for a, b, c, d in zip(index, A, B, C)]
dt = [('index', 'int'), ('two_floats', 'float', 2),
('four_ints', 'int', 4), ('and_a_bool', 'bool')]
s = np.array(goodies, dtype=dt)
生成最小的 numpy 結構化數組:
array([(0, [ 0. , 1. ], [1, 0, 0, 0], True),
(1, [ 0.84147098, 0.54030231], [0, 1, 0, 0], False),
(2, [ 0.90929743, -0.41614684], [0, 0, 1, 0], True),
(3, [ 0.14112001, -0.9899925 ], [0, 0, 0, 1], False)],
dtype=[('index', '<i8'), ('two_floats', '<f8', (2,)), ('four_ints', '<i8', (4,)), ('and_a_bool', '?')])
我想and_a_bool
降序排序,然后按two_floats
的第二列升序排序,這樣 output 將是
array([(2, [ 0.90929743, -0.41614684], [0, 0, 1, 0], True),
(0, [ 0. , 1. ], [1, 0, 0, 0], True),
(3, [ 0.14112001, -0.9899925 ], [0, 0, 0, 1], False),
(1, [ 0.84147098, 0.54030231], [0, 1, 0, 0], False)],
dtype=[('index', '<i8'), ('two_floats', '<f8', (2,)), ('four_ints', '<i8', (4,)), ('and_a_bool', '?')])
這個答案中提到了np.lexsort
,但我不知道如何在這里應用它。
我正在尋找使用現有 numpy 方法而不是專用代碼的東西。 我的 arrays 不會很大,所以我對就地排序或生成新數組沒有強烈的偏好,
制作一個temp
排序數組:
In [133]: temp=np.zeros(s.shape, dtype='bool,float')
In [134]: temp['f0']=~s['and_a_bool']
In [135]: temp['f1']=s['two_floats'][:,1]
In [136]: temp
Out[136]:
array([(False, 1. ), ( True, 0.54030231), (False, -0.41614684),
( True, -0.9899925 )], dtype=[('f0', '?'), ('f1', '<f8')])
現在argsort
(不需要指定order
因為我按所需順序選擇temp
字段):
In [137]: np.argsort(temp)
Out[137]: array([2, 0, 3, 1])
並將該排序應用於s
:
In [138]: s[_137]
Out[138]:
array([(2, [ 0.90929743, -0.41614684], [0, 0, 1, 0], True),
(0, [ 0. , 1. ], [1, 0, 0, 0], True),
(3, [ 0.14112001, -0.9899925 ], [0, 0, 0, 1], False),
(1, [ 0.84147098, 0.54030231], [0, 1, 0, 0], False)],
dtype=[('index', '<i8'), ('two_floats', '<f8', (2,)), ('four_ints', '<i8', (4,)), ('and_a_bool', '?')])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.