如何使用 Numpy 数组复制 python 列表自定义排序功能?



我有以下代码将零移动到标准 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)))

返回

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])

最新更新