python – 根据另一个数组中的数据对numpy数组进行排序
发布时间:2020-12-20 13:11:25 所属栏目:Python 来源:网络整理
导读:我有两组数组数据和结果.结果包含数据中的相同元素,但具有额外的列且未按顺序排列.我想重新排列结果数组,使其与数据中的行的顺序相同,同时在执行排序时将关联的值与行的其余部分一起放入最后一列. data = np.array([[0,1,0],[1,[0,1]])result = np.array([[0
我有两组数组数据和结果.结果包含数据中的相同元素,但具有额外的列且未按顺序排列.我想重新排列结果数组,使其与数据中的行的顺序相同,同时在执行排序时将关联的值与行的其余部分一起放入最后一列.
data = np.array([[0,1,0],[1,[0,1]]) result = np.array([[0,1],0]]) # this is what the final sorted array should look like: ''' array([[0,0]]) ''' 我已经尝试做argsort以便将数据转换为排序顺序然后将其应用于结果但是argsort似乎根据每个元素对数组的顺序进行排序,而我希望排序处理数据的每一行[:,4]作为一个整体. ind = np.argsort(data) indind =np.argsort(ind) ind array([[0,2,3,2],3]]) 按行排序的好方法是什么? 解决方法
方法#1
这是一种方法,将每一行视为索引元组,然后在数据和结果之间找到与这些线性索引等价物相对应的匹配索引.这些索引将表示行的新顺序,当将其索引到结果中时,将为我们提供所需的输出.实现看起来像这样 – # Slice out from result everything except the last column r = result[:,:-1] # Get linear indices equivalent of each row from r and data ID1 = np.ravel_multi_index(r.T,r.max(0)+1) ID2 = np.ravel_multi_index(data.T,r.max(0)+1) # Search for ID2 in ID1 and use those indices index into result out = result[np.where(ID1[:,None] == ID2)[1]] 方法#2 如果保证数据中的所有行都在结果中,您可以使用另一种基于argsort的方法,如下所示 – # Slice out from result everything except the last column r = result[:,r.max(0)+1) sortidx_ID1 = ID1.argsort() sortidx_ID2 = ID2.argsort() out = result[sortidx_ID1[sortidx_ID2]] 示例运行更一般的案例 – In [37]: data Out[37]: array([[ 3,5],[ 4,9,4],[ 7,11],[ 5,4,4]]) In [38]: result Out[38]: array([[ 7,11,55],8],[ 3,5,7],88]]) In [39]: r = result[:,:-1] ...: ID1 = np.ravel_multi_index(r.T,r.max(0)+1) ...: ID2 = np.ravel_multi_index(data.T,r.max(0)+1) ...: In [40]: result[np.where(ID1[:,None] == ID2)[1]] # Approach 1 Out[40]: array([[ 3,88]]) In [41]: sortidx_ID1 = ID1.argsort() # Approach 2 ...: sortidx_ID2 = ID2.argsort() ...: In [42]: result[sortidx_ID1[sortidx_ID2]] Out[42]: array([[ 3,88]]) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |