Python中如何复用Ii0的排序规则重排Iv0列表?
同步重排两个numpy数组列表(复用同一排序规则)
我有两个包含numpy数组的列表Ii0和Iv0,已经通过argsort()对Ii0中的元素按数组第二列重新排序得到Ii01,现在需要用完全相同的排序顺序对Iv0进行重排,得到符合预期的Iv01。
当前错误代码
import numpy as np Ii0 = [np.array([[0, 1],[0, 2],[1, 3],[2, 4],[4,3]]), np.array([[0, 1],[0, 2],[1, 3],[2, 5],[4,3],[3,4]])] Iv0 = [np.array([[10],[20],[30],[40],[50]]), np.array([[25],[38],[41],[97],[65],[54]])] Ii01 = [i[i[:,1].argsort()] for i in Ii0] Iv01 = [i[i[:,0].argsort()] for i in Iv0] print("Iv01 =",Iv01)
当前输出
Iv01 = [array([[10], [20], [30], [40], [50]]), array([[25], [38], [41], [54], [65], [97]])]
预期输出
Iv01 = [array([[10], [20], [30], [50], [40]]),array([[25], [38], [41], [65], [54], [97]])]
解决方案
核心是复用Ii0排序时生成的索引,而非用Iv0自身元素生成索引,步骤如下:
- 为
Ii0中每个数组生成基于第二列的排序索引 - 将该索引分别应用到
Ii0和Iv0的对应数组,保证排序顺序一致
修正后的代码
import numpy as np Ii0 = [np.array([[0, 1],[0, 2],[1, 3],[2, 4],[4,3]]), np.array([[0, 1],[0, 2],[1, 3],[2, 5],[4,3],[3,4]])] Iv0 = [np.array([[10],[20],[30],[40],[50]]), np.array([[25],[38],[41],[97],[65],[54]])] # 生成Ii0每个数组对应的排序索引(基于第二列) sort_indices = [arr[:, 1].argsort() for arr in Ii0] # 用索引重排Ii0得到Ii01 Ii01 = [arr[idx] for arr, idx in zip(Ii0, sort_indices)] # 用相同索引重排Iv0得到Iv01 Iv01 = [val_arr[idx] for val_arr, idx in zip(Iv0, sort_indices)] print("Iv01 =", Iv01)
代码说明
原错误在于Iv01的生成逻辑是用Iv0自身第一列的值排序,和Ii0的排序规则无关。通过先提取Ii0的排序索引列表sort_indices,再将其应用到Iv0对应数组上,就能确保两个列表的元素排序顺序完全同步,最终得到符合预期的Iv01。
内容的提问来源于stack exchange,提问作者Klimt865
相关产品推荐
相关产品推荐

