如何在不使用连接的情况下连接两个 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 团队在优化非数字用例上花费的时间很少,因此这不足为奇。我不太清楚你的输入数组 str1
和 str2
的确切形式,所以我不能完全保证代码适用于你的特定用例。
我正在编写代码,它利用 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 团队在优化非数字用例上花费的时间很少,因此这不足为奇。我不太清楚你的输入数组 str1
和 str2
的确切形式,所以我不能完全保证代码适用于你的特定用例。