我有以下代码,可以将0移动到标准Python列表的一端。
def _moveZeros(x):
if x==0:
return x
else:
return -1
l = [1,0,5,6,0,0,7,2]
l.sort(key=_moveZeros)
print(l)
在这种情况下,输出是[1,5,6,7,2,0,0,0]。
如何用Numpy数组实现类似的功能?
在numpy中,花哨的索引是很有用的 :)
import numpy as np
a = np.array([1,0,5,6,0,0,7,2])
a = np.hstack([a[a != 0], a[a == 0]])
我不是在排序,我是在a上创建两个新的视图,一个包含所有不同于0的元素,另一个包含所有的0,然后水平堆叠成一个新的数组。
如果你想要0以外的数字,只需将其替换为 k
虽然不是很优雅,但也能用。
import numpy as np
aaa = [1,0,5,6,0,0,7,2]
zero_idxs = np.where(np.array(aaa)==0)[0]
non_zero_idxs = [i for i in range(len(aaa)) if i not in zero_idxs]
np.hstack((np.array(aaa)[non_zero_idxs], np.zeros((len(zero_idxs)), dtype=int)))
Returns
array([1, 5, 6, 7, 2, 0, 0, 0])
在这种情况下 hstack
的方法是好的,但万一你需要在更普遍的情况下使用这个方法。
你可以用所需的排序值构建一个新的数组 然后将argsort应用于此。这样就可以得到对原始数组重新排序的索引。
In [86]: l = np.array([1,0,5,6,0,0,7,2])
In [87]: m = l==0
In [88]: m
Out[88]: array([False, True, False, False, True, True, False, False])
In [89]: i = np.argsort(m)
In [90]: i
Out[90]: array([0, 2, 3, 6, 7, 1, 4, 5])
In [91]: l[i]
Out[91]: array([1, 5, 6, 7, 2, 0, 0, 0])