首页 > 其他分享 >numba-vectorize

numba-vectorize

时间:2024-05-12 12:52:03浏览次数:22  
标签:10 12 vectorize int32 nb numba print

参考文档: https://apachecn.github.io/numba-doc-zh/#/docs/17

vectorize装饰器:

允许python函数的标量入参使用 numpy 的 ufuncs。

import numba as nb


@nb.vectorize([nb.int32(nb.int32, nb.int32)], nopython=True)
def f(x, y):
    return x + y


a = [1, 2, 3]
b = [4, 5, 6]
print("a + b: ", a + b)  # a + b:  [1, 2, 3, 4, 5, 6]
print("f(a, b): ", f(a, b))  # f(a, b):  [5 7 9]
print("type(f(a, b)): ", type(f(a, b)))  # type(f(a, b)):  <class 'numpy.ndarray'>

c = [[1, 2, 3], [4, 5, 6]]
d = [[7, 8, 9], [10, 11, 12]]
print("f(c,d): ", f(c, d))  # [[8 10 12] [14 16 18]]

vectorize支持多个函数签名,多如果用多个函数签名的时候注意顺序,比如单精度浮点数在双精度浮点数之前。

@vectorize([int32(int32, int32),
            int64(int64, int64),
            float32(float32, float32),
            float64(float64, float64)])

使用vectorize装饰之后,函数会自动获得numpy ufuncs的其他功能,比如缩小,累计或广播。ufunc的标准功能

print(
    "f.reduce(c) axis=0: %s, axis=1: %s" % (f.reduce(c), f.reduce(c, axis=1))
)  # f.reduce(c) axis=0: [5 7 9], axis=1: [ 6 15]

guvectorize 装饰器

vectorize 是一次写一个元素的 ufunc, guvectorize 是允许编写输入任意数量数组元素的 ufunc,并获取和返回不同维度的数组。典型的例子是中值或卷积滤波器。
guvectorize 不返回结果,是将其作为函数参数,必须有函数填充。

@nb.guvectorize([(nb.int32[:], nb.int32, nb.int32[:])], "(n), ()->(n)", nopython=True)
def g(x, y, r):
    for i in range(x.shape[0]):
        r[i] = x[i] + y


a = [1, 2, 3, 4]
b = 10
print("g(a, b): ", g(a, b))  # g(a, b):  [11 12 13 14]

底层的 python 代码是将一个给定的标量 y 添加到一维数组的所有元素中。
"(n),()->(n)" 表示输入一个n个元素的一维数组和一个标量(用符号()表示)并返回n个元素的一维数组。
1D 数组类型也可以接收标量参数,在上边例子中,第二个参数也可以声明为int[:] (), 在这种情况下,该值必须由 y[0] 读取。

我们可以检查一下能否支持不同维度的数组

# 2d + int
c = [[1, 2, 3], [4, 5, 6]]
print("g(c, 10): ", g(c, 10))  # g(c, 10):  [[11 12 13] [14 15 16]]

# 2d + 1d
d = [10, 20]
print("g(c, d): ", g(c, d))  # g(c, d):  [[11 12 13] [24 25 26]]

动态通用功能

如果给装饰器 vectorize 没有传递任何签名,python 函数将会构建动态通用函数或者DUDunc。

@nb.vectorize()
def d(x, y):
    return x + y


print("d(1, 2)", d(1, 2))  # d(1, 2) 3
print(d.types)  # ['ll->q']

print("d(1, 2.0)", d(1, 2.0))  # d(1, 2) 3.0
print(d.types)  # ['ll->q', 'ld->d']

print("d([1, 2, 3], 10): ", d([1, 2, 3], 10))  # d([1, 2, 3], 10):  [11 12 13]
print(d.types)  # ['ll->q', 'ld->d']

在这种情况下,调用的顺序很重要,比如先传入浮点参数,那么任何带有整形的参数都会被转换成双精度浮点值。如: 先调用 d(1.0, 2.0) 得到3.0,再调用 d(1, 2) 也会得到3.0。

完整代码
import numba as nb


@nb.vectorize(
    [nb.int32(nb.int32, nb.int32), nb.float64(nb.float64, nb.float64)], nopython=True
)
def f(x, y):
    return x + y


a = [1.0, 2.0, 3.0]
b = [4, 5, 6]
# b = [4.0, 5.0, 6.0]
print("a + b: ", a + b)  # a + b:  [1, 2, 3, 4, 5, 6]
print("f(a, b): ", f(a, b))  # f(a, b):  [5 7 9]
print("type(f(a, b)): ", type(f(a, b)))  # type(f(a, b)):  <class 'numpy.ndarray'>

c = [[1, 2, 3], [4, 5, 6]]
d = [[7, 8, 9], [10, 11, 12]]
print("f(c,d): ", f(c, d))  # [[8 10 12] [14 16 18]]

print(
    "f.reduce(c) axis=0: %s, axis=1: %s" % (f.reduce(c), f.reduce(c, axis=1))
)  # f.reduce(c) axis=0: [5 7 9], axis=1: [ 6 15]

print("-" * 20)


@nb.guvectorize([(nb.int32[:], nb.int32, nb.int32[:])], "(n), ()->(n)", nopython=True)
def g(x, y, r):
    for i in range(x.shape[0]):
        r[i] = x[i] + y


a = [1, 2, 3, 4]
b = 10
print("g(a, b): ", g(a, b))  # g(a, b):  [11 12 13 14]

# 2d + int
c = [[1, 2, 3], [4, 5, 6]]
print("g(c, 10): ", g(c, 10))  # g(c, 10):  [[11 12 13] [14 15 16]]

# 2d + 1d
d = [10, 20]
print("g(c, d): ", g(c, d))  # g(c, d):  [[11 12 13] [24 25 26]]

print("-" * 20)


@nb.vectorize()
def d(x, y):
    return x + y


print("d(1, 2)", d(1, 2))  # d(1, 2) 3
print(d.types)  # ['ll->q']

print("d(1, 2.0)", d(1, 2.0))  # d(1, 2) 3.0
print(d.types)  # ['ll->q', 'ld->d']

print("d([1, 2, 3], 10): ", d([1, 2, 3], 10))  # d([1, 2, 3], 10):  [11 12 13]
print(d.types)  # ['ll->q', 'ld->d']

标签:10,12,vectorize,int32,nb,numba,print
From: https://www.cnblogs.com/yimeimanong/p/18187584

相关文章

  • Ubuntu 24.04 LTS (Noble Numbat) 正式版发布
    Ubuntu24.04LTS(NobleNumbat)正式版发布Canonical的第10个长期支持版本在性能工程、企业安全和开发人员体验方面树立了新标准请访问原文链接:Ubuntu24.04LTS(NobleNumbat)正式版发布,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org无耻抄袭者YuTao请......
  • Ubuntu 24.04 LTS (Noble Numbat) 下载
    Ubuntu24.04LTS(NobleNumbat)下载Ubuntu24.04LTS开启Beta测试,正式版即将发布请访问原文链接:Ubuntu24.04LTS(NobleNumbat),查看最新版。原创作品,转载请保留出处。作者主页:sysin.org无耻抄袭者YuTao,请立遁!!!Ubuntu24.04LTS首个Beta已发布。本次Beta测......
  • dremio vectorized Parquet Reader v2 支持
    dremio从24.3开始支持parquetv2writer同时性能提升还是很明显的对于读官方在TPC-DS测试中,最低有22%左右的,最高97%,平均77%左右写入同样也是TPC-DS中,存储降低24%左右,写入提升1.5%左右,如果开启了c3读性能提升6.4%开启ui配置(全局)可以通过supportkeysql配置(全......
  • numba cannot be imported and numba functions are disabled. Probably the executio
    问题描述运行代码会出现警告信息numbacannotbeimportedandnumbafunctionsaredisabled.Probablytheexecutionisslow.Pleaseinstallnumbatogainamassivespeedup.(orifyoupreferslowexecution,settheflagnumba=Falsetoavoidthiswarning!)即使......
  • Ubuntu 24.04 LTS “Noble Numbat” 预计于 2024 年 4 月 25 日发布
    导读Canonical今天宣布了下一个Ubuntu版本的代号,Ubuntu24.04LTS,代号“NobleNumbat”,计划于明年的4月25日发布。这个即将发布的版本预计将搭载GNOME46桌面环境。Ubuntu24.04LTS“NobleNumbat”将是Canonical的第40个Ubuntu发行版和第10个LTS(长......
  • 如何解决AttributeError: 'DictVectorizer' object has no attribute 'get_feature_na
    这个错误通常是因为 DictVectorizer 对象没有 get_feature_names 属性。这可能是因为你使用的 sklearn 版本过低,或者是因为你没有正确地导入 DictVectorizer 类。要解决这个问题,你可以尝试升级 sklearn 版本,或者使用以下代码导入 DictVectorizer 类:fromsklearn.f......
  • 神经网络入门篇:详解向量化实现的解释(Justification for vectorized implementation)
    向量化实现的解释先对几个样本计算一下前向传播,看看有什么规律:公式1.16:\(z^{[1](1)}=W^{[1]}x^{(1)}+b^{[1]}\)\(z^{[1](2)}=W^{[1]}x^{(2)}+b^{[1]}\)\(z^{[1](3)}=W^{[1]}x^{(3)}+b^{[1]}\)这里,为了描述的简便,先忽略掉\(b^{[1]}\)后面将会看到利用Python的......
  • cuda vectorized实现矩阵转置
    使用了共享内存和向量化传输,目前为止效果最好的一个实现__global__voidtransposeSmemVec(float*input,float*output,constintX,constintY){__shared__floatsmem[32*4*32];unsignedintix=4*(blockDim.x*blockIdx.x+threadIdx.x);......
  • Numba 库中的一个装饰器函数numba.jit
    numba.jit 是Numba库中的一个装饰器函数,用于实现即时编译(Just-In-TimeCompilation)的功能。它可以将Python函数转换为高性能的机器码,从而提供更快的执行速度。使用 numba.jit 装饰器可以将普通的Python函数转换为被Numba优化的函数。当使用 numba.jit 装饰器修饰一......
  • 【linux】gcc编译选项:-fomit-frame-pointer,-fno-tree-vectorize,-fno-strict-aliasing
    Date:2018.9.81、参考https://www.cnblogs.com/islandscape/p/3444122.htmlhttps://blog.csdn.net/chdhust/article/details/8462414https://gcc.gnu.org/onlinedocs/gcc-6.2.0/gcc.pdfhttps://blog.csdn.net/u012927281/article/details/50999138https://blog.csdn.net/sof......