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



我正在编写利用Numba JIT编译python代码的代码。该函数接受两个长度相同的数组作为输入,随机选择一个切片点,并返回一个元组,其中两个弗兰肯斯坦数组由两个输入字符串的一部分组成。然而,Numba还不支持numpy.contenate函数(不知道它是否会)。由于我不愿意放弃Numpy,有人知道在没有concatenate函数的情况下连接两个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的确切形式有点不清楚,所以我不能完全保证代码适用于您的特定用例。

最新更新