numba jitted函数中的动态增长数组

2024-10-06 12:30:48 发布

您现在位置:Python中文网/ 问答频道 /正文

numba中似乎不支持numpy.resize。在

在nopython模式下使用numba.jit动态增长数组的最佳方法是什么?在

到目前为止,我所能做的最好的就是在jitted函数之外定义和调整数组大小,有没有更好(更简洁)的选择?在


Tags: 方法函数numpy定义模式动态数组jit
2条回答

numpy.resizepure python function

import numpy as np

def resize(a, new_shape):
    """I did some minor changes so it all works with just `import numpy as np`."""
    if isinstance(new_shape, (int, np.core.numerictypes.integer)):
        new_shape = (new_shape,)
    a = np.ravel(a)
    Na = len(a)
    if not Na:
        return np.zeros(new_shape, a.dtype)
    total_size = np.multiply.reduce(new_shape)
    n_copies = int(total_size / Na)
    extra = total_size % Na

    if total_size == 0:
        return a[:0]

    if extra != 0:
        n_copies = n_copies+1
        extra = Na-extra

    a = np.concatenate((a,)*n_copies)
    if extra > 0:
        a = a[:-extra]

    return np.reshape(a, new_shape)

如果你自己实现这个数组,你就可以直接向前。不幸的是,对于ND数组来说要复杂得多,因为nopython numba函数中不支持某些操作:isinstancereshape和元组乘法。以下是1D等效值:

^{pr2}$

如果您不希望“重复输入”行为,而只将其用于增大大小,则更容易:

@nb.njit
def resize(a, new_size):
    new = np.zeros(new_size, a.dtype)
    new[:a.size] = a
    return new

这些函数用numba.njit修饰,因此可以在nopython模式下的任何numba函数中调用。在


不过,需要注意的是:一般情况下,您不想调整大小,或者如果您想调整大小,请确保您选择的方法具有amoritzed ^{} cost (Wikipedia link)。如果您可以估计最大长度,那么最好立即预先分配一个大小正确(或稍微过度分配)的数组。在

通常,我采用的策略是只分配足够多的数组存储来容纳计算,然后跟踪最终使用的索引,然后在返回之前将数组切片到实际大小。这假设您事先知道数组可能增长到的最大大小。我的想法是,在我自己的大多数应用程序中,内存很便宜,但是调整大小和在python和jitted函数之间切换的开销很大。在

相关问题 更多 >