Gio*_*dis 5 python sorting numpy
我在Python中有一个numpy数组,它是n-by-n(在这个例子中是3-by-3)并且在所有对角线位置都包含零值.例如
array([[ 0. , -0.65 , 1.3 , 0.56],
[ 0.45 , 0. , 0.54, 43 ],
[ 0.5 , 0.12 , 0. , 7 ]
[ 0.2 , 0.3 , 0.4 , 0 ]])
Run Code Online (Sandbox Code Playgroud)
是否可以在不修改对角线位置的情况下对数组进行排序,以便看起来像下面的那个?因为所有排序函数都会考虑对角线位置中存在的"零"并改变它们的相对位置.
array([[ 0. , 1.3 , 0.56 , -0.65],
[ 43 , 0. , 0.54 , 0.45 ],
[ 7 , 0.5 , 0. , 0.12 ]
[ 0.4 , 0.3 , 0.2 , 0 ]])
Run Code Online (Sandbox Code Playgroud)
如果不能进行上述操作,那么每行中的N个最大值及其对应的索引就足够了.
直到现在我已经尝试了排序和argsort但没有结果.
最简单的方法是删除零,排序,然后沿对角线将零添加回去:
>>> a = [[0,1,2],[3,0,0],[5,6,0]]
>>> no_zeroes = [r[:i] + r[i+1:] for i, r in enumerate(a)]
>>> no_zeroes
[[1, 2], [3, 0], [5, 6]]
>>> sorted_no_zeroes = [sorted(r, reverse=True) for r in no_zeroes]
>>> sorted_no_zeroes
[[2, 1], [3, 0], [6, 5]]
>>> sorted_with_zeroes = [r[:i] + [0] + r[i:] for i, r in enumerate(sorted_no_zeroes)]
>>> sorted_with_zeroes
[[0, 2, 1], [3, 0, 0], [6, 5, 0]]
Run Code Online (Sandbox Code Playgroud)
包装成一个函数:
>>> def sort_ignoring_zeroes(a):
... s = [sorted(r[:i] + r[i+1:], reverse=True) for i, r in enumerate(a)]
... return [r[:i] + [0] + r[i:] for i, r in enumerate(s)]
...
>>> sort_ignoring_zeroes(
[[ 0. , 1.3 , 0.56 , -0.65],
... [ 43 , 0. , 0.54 , 0.45],
... [ 7 , 0.5 , 0. , 0.12]])
[[0, 1.3, 0.56, -0.65],
[43, 0, 0.54, 0.45],
[7, 0.5, 0, 0.12]]
>>>
Run Code Online (Sandbox Code Playgroud)