如何在不使用连接的情况下连接两个 numpy ndarray

How to concatenate two numpy ndarrays without using concatenate

我正在编写代码,它利用 Numba 来 JIT 编译我的 python 代码。 该函数接受两个与输入长度相同的数组,随机选择一个切片点和 returns 一个元组,其中包含两个由两个输入字符串的部分组成的 Frankenstein 数组。 然而,Numba 还不支持 numpy.concatenate 函数(不知道它是否会支持)。由于我不愿意放弃 Numpy,有没有人知道在没有连接函数的情况下连接两个 Numpy 数组的高效解决方案?

def randomSlice(str1, str2):
    lenstr = len(str1)
    rnd = np.random.randint(1, lenstr)
    return (np.concatenate((str1[:rnd], str2[rnd:])), np.concatenate((str2[:rnd], str1[rnd:])))

这可能适合你:

import numpy as np
import numba as nb

@nb.jit(nopython=True)
def randomSlice_nb(str1, str2):
    lenstr = len(str1)
    rnd = np.random.randint(1, lenstr)

    out1 = np.empty_like(str1)
    out2 = np.empty_like(str1)

    out1[:rnd] = str1[:rnd]
    out1[rnd:] = str2[rnd:]

    out2[:rnd] = str2[:rnd]
    out2[rnd:] = str1[rnd:]
    return (out1, out2)

在我的机器上,使用 Numba 0.27 并通过 timeit 模块计时,以确保我没有在统计中计算 jit 时间(或者你可以 运行 它一次,然后时间后续调用),numba 版本在各种大小的 int 或 float 输入数组上提供了一个小但不可忽略的性能提升。如果数组的 dtype 类似于 |S1,那么 numba 会明显变慢。 Numba 团队在优化非数字用例上花费的时间很少,因此这不足为奇。我不太清楚你的输入数组 str1str2 的确切形式,所以我不能完全保证代码适用于你的特定用例。