如何使 np.argsort 将空字符串放在数组的末尾而不是开头

How make np.argsort place empty strings at the END of an array instead of at the beginning

我真的很惊讶这个问题之前没有出现在论坛上(至少从我所看到的)。无论如何,我目前正在尝试使用 np.argsort 以字母方式对字符串列表进行排序,其中许多是空的,如下所示:

list = [ "Carrot", "Star", "Beta", "Zoro" , ""]

现在,任何对 np.argsort(list) 的调用都会 return 以下索引数组:

[4,2,0,1,3] # => ["", "Beta", "Carrot", "Star", "Zoro"]

有没有办法指定 argsort 函数的顺序,以便将空字符串放在数组的末尾,如下所示:

[2,0,1,3,4] # => ["Beta", "Carrot", "Star", "Zoro", ""]

任何输入将不胜感激!

获得所需订单的一种简单方法是使用 np.roll:

lst = [ "Carrot", "Star", "Beta", "Zoro" , ""]
arr = np.array(lst)
idx = np.roll(arr.argsort(),np.count_nonzero(arr))
arr[idx]
# array(['Beta', 'Carrot', 'Star', 'Zoro', ''], dtype='<U6')

如果你想使用 Numpy 方法,请在 Numpy 数组上使用它们,而不是在 "ordinary" Python 列表。

所以从生成一个 Numpy 数组开始,为了演示目的, 延长一点:

list = [ "Carrot", "Star", "Beta", "None", "none", "Zoro" , "", "zzz"]
lst = np.array(list)

然后:

  • 更改 lst 中的每个空字符串或例如none / None 与 a 波浪号(ASCII 中的最后一个字符),
  • 对其应用 argsort(而不是原始数组)。

执行此操作的代码是:

np.argsort(np.where(~np.isin(lst, ['', 'None', 'none']), lst, '~'))

给出:

array([2, 0, 1, 5, 7, 3, 4, 6], dtype=int64)

所以索引涉及:

  • "None"(指数==3),
  • "none"(指数==4),
  • """(空字符串,索引== 6

在最后,但是例如关于"zzz"的索引7就在他们面前