numba中的int数组

DNF

我正在计算int8s向量中最频繁的数字当我设置ints的计数器数组时,Numba抱怨

@jit(nopython=True)
def freq_int8(y):
    """Find most frequent number in array"""
    count = np.zeros(256, dtype=int)
    for val in y:
        count[val] += 1
    return ((np.argmax(count)+128) % 256) - 128

调用它,我得到以下错误:

TypingError: Invalid usage of Function(<built-in function zeros>) with parameters (int64, Function(<class 'int'>))

如果我删除dtype=int它可以正常工作,我会得到不错的加速。但是,我对为什么声明一个ints数组不起作用感到困惑有没有已知的解决方法,在这里有没有值得提高的效率?

背景:我正在尝试从一些numpy繁重的代码中节省几微秒的时间。我尤其受到numpy.medianNumba的伤害,一直在研究Numba,但是我一直在努力提高median找到频率最高的数字是可以接受的替代选择median,在这里,我已经获得了一些性能。上面的numba代码也比numpy.bincount

更新:输入接受的答案后,这是medianforint8向量的实现它比numpy.median大约快一个数量级

@jit(nopython=True)
def median_int8(y):
    N2 = len(y)//2
    count = np.zeros(256, dtype=np.int32)
    for val in y:
        count[val] += 1
    cs = 0
    for i in range(-128, 128):
        cs += count[i]
        if cs > N2:
            return float(i)
        elif cs == N2:
            j = i+1
            while count[j] == 0:
                j += 1
            return (i + j)/2

出人意料的是,短向量的性能差异甚至更大,这显然是由于numpy向量的开销所致

>>> a = np.random.randint(-128, 128, 10)

>>> %timeit np.median(a)
    The slowest run took 7.03 times longer than the fastest. This could mean that an intermediate result is being cached.
    10000 loops, best of 3: 20.8 µs per loop

>>> %timeit median_int8(a)
    The slowest run took 11.67 times longer than the fastest. This could mean that an intermediate result is being cached.
    1000000 loops, best of 3: 593 ns per loop

这个开销是如此之大,我想知道是否有什么问题。

伊玛诺·伦戈(Imanol Luengo)

请注意,找到最频繁的数字通常称为mode,它与中位数相似,也就是平均值……在这种情况下,np.mean速度会快得多。除非您的数据中有某些约束或特殊性,否则无法保证该模式近似于中位数

如果您仍然想计算整数列表模式np.bincount,则正如您所提到的,就足够了(如果numba更快,那么就不会太多了):

count = np.bincount(y, minlength=256)
result = ((np.argmax(count)+128) % 256) - 128

请注意,我已经将minlength参数添加np.bincount,以便它返回与代码中相同的256个长度列表。但实际上在实践中完全没有必要,因为您只想要argmaxnp.bincount(不带minlength)将返回一个列表,该列表的长度是中的最大数量y

至于numba错误,替换dtype=intdtype=np.int32应该可以解决该问题。int是python函数,您要nopython在numba标头中指定如果删除nopython,则dtype=intdtype='i'也将起作用(具有相同的效果)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

numba中的int数组

来自分类Dev

在numba函数中创建新的列表/数组

来自分类Dev

无法在numba中创建多维数组

来自分类Dev

如何用Numba中的多维数组中的数字替换nans?

来自分类Dev

在int数组中检查int

来自分类Dev

在Python / Numba中访问数组会产生奇怪的结果

来自分类Dev

使用Numba提取numpy数组中的特定行

来自分类Dev

我如何使用numba更改数组中的索引

来自分类Dev

numba中两个数组的未声明加法

来自分类Dev

NUMBA 中 CPU 和 GPU 函数的数组分配

来自分类Dev

int数组中的输出无效

来自分类Dev

C中INT的多维数组

来自分类Dev

从int数组中删除值

来自分类Dev

在Numba中,定位CUDA时如何将数组复制到常量内存中?

来自分类Dev

优化对numba的numpy数组的访问

来自分类Dev

Numba CUDA缩减为数组

来自分类Dev

结合使用numba-pro和python的CUDA内核中的数组

来自分类Dev

Java:将Int存储在Integer数组中

来自分类Dev

检查int数组中的重复项

来自分类Dev

如何从int数组中删除零?

来自分类Dev

比较Java中的6个int数组

来自分类Dev

C ++中int数组的memcpy的正确大小

来自分类Dev

int数组到java中的json对象

来自分类Dev

Kotlin中的二维Int数组

来自分类Dev

如何清除android中的int []数组?

来自分类Dev

如何摆脱int数组中的重复值?

来自分类Dev

指向C中的int指针数组的指针

来自分类Dev

在JavaScript中访问Java int数组

来自分类Dev

比较Java中的6个int数组