【问题标题】:How can I sort a python list by key without .sort()?如何在没有 .sort() 的情况下按键对 python 列表进行排序?
【发布时间】:2021-12-30 21:58:29
【问题描述】:

我想转换这段代码以使其与 Numba 兼容。 Numba 支持的唯一排序方法是 sorted(),但不使用 key 参数。我必须在没有其他库导入或者只是一些 numpy 的情况下手动排序。有人可以给我一种有效的方法来做这种事情吗?谢谢

import random

n = 1000
index = list(range(n))
keys = list(range(n))
random.shuffle(keys)

index.sort(key=lambda x: keys[x])) <= HOW TO CONVERT THIS ?

编辑:

import numpy as np
from numba import jit

@jit(nopython=True)
def fourier_fit_extra(data, harmonic, extra=0):
    size = len(data)
    x = np.arange(0, size, 1)
    m = np.ones((x.shape[0], 2))
    m[:, 1] = x
    scale = np.empty((2,))
    for n in range(0, 2):
        norm = np.linalg.norm(m[:, n])
        scale[n] = norm
        m[:, n] /= norm
    lsf = (np.linalg.lstsq(m, data, rcond=-1)[0] / scale)[::-1]
    lsd = data - lsf[0] * x
    size_lsd = len(lsd)
    four = np.zeros(size_lsd, dtype=np.complex128)
    for i in range(size_lsd):
        sum_f = 0
        for n in range(size_lsd):
            sum_f += lsd[n] * np.exp(-2j * np.pi * i * n * (1 / size_lsd))
        four[i] = sum_f
    freq = np.empty(size)
    mi = (size - 1) // 2 + 1
    freq[:mi] = np.arange(0, mi)
    freq[mi:] = np.arange(-(size // 2), 0)
    freq *= 1.0 / size
    lx = np.arange(0, size + extra)
    out = np.zeros(lx.shape)

    # IT'S USED TO SORT FOURIER REALS
    index = [v for _, v in sorted([(np.absolute(four[v]), v) for v in list(range(size))])][::-1]

    for i in index[:1 + harmonic * 2]:
        out += (abs(four[i]) / size) * np.cos(2 * np.pi * freq[i] * lx + np.angle(four[i]))
    return out + lsf[0] * lx

【问题讨论】:

  • 由于显示的代码根本不使用 Numba,代码将如何以阻止您使用 sort 方法或 sorted 的方式使用 Numba功能?
  • ^^ 即为什么不将列表单独排序为您想要对 Numba 执行的任何操作?
  • 顺便说一句,lambda x: keys[x] 是一种麻烦的写法keys.get
  • numba 是否适用于元组?如果是这样,您可以拥有一个元组列表,其中每个元组的第一个元素是键,第二个元素是值。然后常规的sorted() 将首先对键进行排序,然后是值,因为这就是元组比较的工作原理
  • 您指的是文档中的这一段吗? “Numba 支持使用位置和命名参数的函数调用,以及具有默认值和 args 的参数(注意 *args 的参数只能是元组,而不是列表)。不支持显式 **kwargs。”这似乎并不禁止使用 key 参数,只定义接受 *arbitrary 关键字参数的函数。

标签: python sorting numba


【解决方案1】:

对于这种特殊类型的输入,您可以通过以下方式实现排序:

for value in index[:]:
    index[keys[value]] = value 

如果键不是来自range(n) 的排列(如您的问题中所示),则创建临时元组,调用sorted,然后再次从元组中提取值:

result = [value for _, value in sorted(
              [(keys[value], value) for value in index]
         )]

【讨论】:

  • 您的第一段代码不起作用,但第二段代码例外,谢谢!
猜你喜欢
  • 2012-10-17
  • 2021-11-27
  • 2019-02-17
  • 2021-04-22
  • 1970-01-01
  • 2020-10-10
  • 1970-01-01
  • 2020-01-25
  • 2017-10-09
相关资源
最近更新 更多