【问题标题】:Splitting values in an array 'logarithmically' / based on another array基于另一个数组“对数”拆分数组中的值
【发布时间】:2020-08-11 00:21:18
【问题描述】:

我有一个二维数组,其中每个元素都是傅立叶变换。我想“对数”分割变换。例如,让我们取其中一个数组并将其命名为a

a = np.arange(0, 512)

# I want to split a into 'bins' defined by b, below:
b = np.array([0] + [10 * 2**i for i in range(6)]) # [0, 10, 20, 40, 80, 160, 320, 640]

我想做的是类似于使用np.split,除了我想根据数组b 将值拆分为“bins”,这样a 在[0, 10) 之间的所有值都是在一个 bin 中,[10, 20) 之间的所有值在另一个 bin 中,等等。

我可以在某种复杂的 for 循环中做到这一点:

split_arr = []
for i in range(1, len(b)):
    fbin = []
    for amp in a:
        if (amp >= b[i-1]) and (amp < b[i]):
            fbin.append(amp)
    split_arr.append(fbin)

我有很多数组要拆分,这也很丑(只是我的看法)。有没有更好的办法?

【问题讨论】:

    标签: python arrays numpy


    【解决方案1】:

    你可以这样做,使用np.split

    np.split(a, np.searchsorted(a,b))
    

    如果你的数组a没有排序,在上面的命令之前排序:

    a = np.sort(a)
    

    np.searchsorted 查找 b 中的值的位置,这些值将插入到排序数组 a 中。换句话说,np.searchsorted 会找到您想要拆分阵列的位置。如果您不想在开头出现空数组,只需从 b 中删除 0

    【讨论】:

    • 刚刚计时。快速而简洁。我很高兴我等了几分钟来查看答案。我现在正在文档中查找np.searchsorted,因为我想进一步了解它。谢谢。
    • @rocksNwaves 欢迎您。我添加了另一行以获得更多解释。希望能帮助到你。如果它解决了您的问题,请随时接受答案。谢谢。
    • 所以这可能假设 a 首先是排序的......这就是它如此之快的原因。如果a 未排序,则需要考虑排序成本。仍然可能是最有效的方法,尤其是对于大型数组。
    • @Julien 是的,谢谢您的来信。已添加到帖子中。
    【解决方案2】:

    首先,您可以通过使用列表推导来减少“丑陋”:

    split_arr = [[amp for amp in a if (amp >= b[i-1]) and (amp < b[i])] for i in range(1, len(b))]
    

    然后您可以使用 numpy 快速并行化功能应用相同的逻辑(它的好处是看起来更干净):

    split_arr = [a[(a >= b[i-1]) & (a < b[i])] for i in range(1, len(b))]
    

    比较:

    %timeit [[amp for amp in a if (amp >= b[i-1]) and (amp < b[i])] for i in range(1, len(b))]
    1.29 ms ± 109 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
    
    %timeit [a[(a >= b[i-1]) & (a < b[i])] for i in range(1, len(b))]
    35.9 µs ± 4.52 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
    

    【讨论】:

    • 我真的很想知道投反对票的原因...
    猜你喜欢
    • 2021-12-03
    • 2022-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-03
    • 1970-01-01
    • 2022-12-11
    相关资源
    最近更新 更多