Sorting 是否有包含“argsort”实现或包装器的Nim库?

Sorting 是否有包含“argsort”实现或包装器的Nim库?,sorting,nim-lang,Sorting,Nim Lang,我正在寻找argsort的版本,例如或。在Nim中是否有argsort的实现。。。或者尼姆可以在某个图书馆找到?它不见了似乎有点奇怪 更新 以下内容似乎适用于argsort: proc argsort[T](a : T) : seq[int] = result = toSeq(0..a.len - 1) sort(result, proc (i, j: int): int = cmp(a[i], a[j])) 不过,据推测,它可以更高效地以本机方式编写,并避免使用函数指针……它还没有进

我正在寻找
argsort
的版本,例如或。在Nim中是否有
argsort
的实现。。。或者尼姆可以在某个图书馆找到?它不见了似乎有点奇怪

更新

以下内容似乎适用于
argsort

proc argsort[T](a : T) : seq[int] =
  result = toSeq(0..a.len - 1)
  sort(result, proc (i, j: int): int = cmp(a[i], a[j]))

不过,据推测,它可以更高效地以本机方式编写,并避免使用函数指针……

它还没有进入灵活状态,但Arraymancer有一个
argsort


如果您已经找到了解决方案,我建议您写一个答案,这样这个问题就可以解决了。@Samadi-更新建议了一个解决方法。。。但是,也许有一个开放性的问题可以激励人们围绕本机实现编写包装器?还是更重要的是有一个封闭的问题?这是一个很好的观点@shaunc,我没有想到这一点。这个实现有什么不是“本地”的呢?这比我的答案好!
import arraymancer,algorithm,sequtils

proc argsort*[T](t: Tensor[T], order = SortOrder.Ascending): Tensor[int] =
  ## Returns the indices which would sort `t`. Useful to apply the same sorting to
  ## multiple tensors based on the order of the tensor `t`.
  ##
  ## Sorts the raw underlying data!
  # TODO: should we clone `t` so that if `t` is a view we don't access the whole
  # data?
  assert t.rank == 1, "Only 1D tensors can be sorted at the moment!"
  proc cmpIdxTup(x, y: (T, int)): int = system.cmp(x[0], y[0])
  # make a tuple of input & indices
  var tups = zip(toOpenArray(t.storage.Fdata, 0, t.size - 1),
                 toSeq(0 ..< t.size))
  # sort by custom sort proc
  tups.sort(cmp = cmpIdxTup, order = order)
  result = newTensorUninit[int](t.size)
  for i in 0 ..< t.size:
    result[i] = tups[i][1]

let x = @[3,9,4,1,5].toTensor()

echo x.argsort()
Tensor[system.int] of shape [5]" on backend "Cpu"
    3   0   2   4   1