返回介绍

4.2 Universal Functions 通用函数

发布于 2023-07-20 22:39:54 字数 3122 浏览 0 评论 0 收藏 0

4.2 Universal Functions: Fast Element-Wise Array Functions(通用函数:快速点对点数组函数)

universal function, 或 ufunc, 是用来在 ndarray 中实现 element-wise 操作的。

可以认为这个 ufunc 可以把一些简单的函数做快速的向量化封装,输入是一个以上的标量,输出也是一个以上的标量。

很多 ufuncs 都是点对点的变换,像 sqrt 或 exp:

import numpy as np
arr = np.arange(10)
arr
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
np.sqrt(arr)
array([ 0.        ,  1.        ,  1.41421356,  1.73205081,  2.        ,
        2.23606798,  2.44948974,  2.64575131,  2.82842712,  3.        ])
np.exp(arr)
array([  1.00000000e+00,   2.71828183e+00,   7.38905610e+00,
         2.00855369e+01,   5.45981500e+01,   1.48413159e+02,
         4.03428793e+02,   1.09663316e+03,   2.98095799e+03,
         8.10308393e+03])

这些函数叫做一元通用函数(unary ufuncs)。其他一些函数,比如 add 或 maximum,需要两个数组(binary ufuncs),并返回一个数组作为结果:

x = np.random.randn(8)
y = np.random.randn(8)
x
array([ 0.18373557, -1.82728347, -0.11149882, -1.34286776, -1.09016986,
        1.63308   ,  1.05205535, -0.32746706])
y
array([-0.42410809,  1.89603273, -1.13649816, -0.98559379, -0.16827718,
        0.52828569,  1.57543351,  1.50045399])
np.maximum(x, y)
array([ 0.18373557,  1.89603273, -0.11149882, -0.98559379, -0.16827718,
        1.63308   ,  1.57543351,  1.50045399])

这里 mamimum 点对点的比较 x 和 y 中的元素。

尽管不常见,但 ufunc 也能返回多个数组。例如 modf,这是一个向量版的 divmod(python 内建函数),modf 会返回小数部分和整数部分:

本函数是实现 a 除以 b,然后返回商与余数的元组。如果两个参数 a,b 都是整数,那么会采用整数除法,结果相当于(a//b, a % b)。如果 a 或 b 是浮点数,相当于(math.floor(a/b), a%b)。

arr = np.random.randn(7) * 5
arr
array([ 1.51538382, -0.75054846,  0.02863286,  8.74026861, -3.44529124,
       -9.18401768, -0.68469611])
remainder, whole_part = np.modf(arr)
remainder
array([ 0.51538382, -0.75054846,  0.02863286,  0.74026861, -0.44529124,
       -0.18401768, -0.68469611])
whole_part
array([ 1., -0.,  0.,  8., -3., -9., -0.])

ufunc 能接受一个可选参数作为输出,这样可以直接更改原有的数组:

arr
array([ 1.51538382, -0.75054846,  0.02863286,  8.74026861, -3.44529124,
       -9.18401768, -0.68469611])
np.sqrt(arr) # 没有改变原有的 arr

 

array([ 1.23100927,         nan,  0.16921248,  2.95639453,         nan,
               nan,         nan])
np.sqrt(arr, arr) # 改变了原有的 arr

 

array([ 1.23100927,         nan,  0.16921248,  2.95639453,         nan,
               nan,         nan])
arr
array([ 1.23100927,         nan,  0.16921248,  2.95639453,         nan,
               nan,         nan])

一些一元通用函数:

一些二元通用函数:

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文