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

问题描述 投票:0回答:2

我有以下代码,可以将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数组实现类似的功能?

python list numpy sorting numpy-ndarray
2个回答
2
投票

在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


1
投票

虽然不是很优雅,但也能用。

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

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])
© www.soinside.com 2019 - 2024. All rights reserved.