【问题标题】:How to concatenate two numpy ndarrays without using concatenate如何在不使用连接的情况下连接两个 numpy ndarray
【发布时间】:2016-08-01 17:48:06
【问题描述】:

我正在编写代码,它利用 Numba 来 JIT 编译我的 python 代码。 该函数接受两个长度相同的数组作为输入,随机选择一个切片点并返回一个元组,其中包含两个由两个输入字符串的一部分组成的弗兰肯斯坦数组。 然而,Numba 还不支持 numpy.concatenate 函数(不知道它是否会支持)。由于我不愿意放弃 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:])))

【问题讨论】:

    标签: python numpy numba


    【解决方案1】:

    这可能对你有用:

    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 的确切形式,所以我不能完全保证该代码适用于您的特定用例。

    【讨论】:

    • 像魅力一样工作。我只是想知道由于替换 out1 和 out2 上的元素而产生的性能开销,但现在这正是我所需要的。非常感谢芽。 (为了记录,str输入只是普通的一维ndarrays)
    • 当你使用np.emptynp.empty_like 时,你只是为数组分配内存而不是填充它,所以它应该很快。大多数返回新数组的 numpy 函数都必须执行类似的操作,尽管通常使用较低级别的 C 函数,例如 PyArray_ConcatenateArrays。即使这样,您也可以看到该函数分配内存,然后将数据复制到其中。
    • 解决这个问题的唯一方法是预先分配输出数组并将它们传入,如果我要创建大量小数组,我偶尔会这样做再次。但这让代码更难看。
    猜你喜欢
    • 2022-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-22
    • 2015-12-14
    • 1970-01-01
    • 1970-01-01
    • 2021-03-28
    相关资源
    最近更新 更多