-
-
- 绝对值
-
正如numpy能够理解python内置的运算操作,numpy同样也可以理解python内置的绝对值函数**:直接对数组使用abs()操作即可**
对应的numpy通用函数是np.absolute,该函数也可以用np.abs-别名来访问
同样地,这个通用函数也可以用于处理复数。当处理复数时,绝对值返回的是该元素的模(magnitude).
-
三角函数
numpy提供了很多好用的通用函数,其中对于数据科学家来说最有用的就是三角函数无疑。
可以通过定义一个角度数组,然后用三角函数对于角度数组进行计算。这些值是在机器精度内进行计算的,所以有些应该是0的值并没有精确到0。同样的,逆三角函数也可以进行使用。例如arcsin、arccos等.
-
指数运算
numpy中还有一个较为常用的通用函数是指数运算:
例如2^x e^x等,指数运算的逆运算,即对数运算也是可以用的。最基本的np.log()给出的是以自然常数也就是e为底数的对数,如果你希望计算以其他数字为底数的对数,可以按照如下处理:
ln(x) log2(x) log10(x)
还有一些比较特殊的版本,对于较小的输入值也可以保持不错的精度。
print("exp(x)-1=",np.expm1(x)) print("log(1+x)=",np.log1p(x))
当x的输入值很小时,使用以上函数所给出的值会比np.log和np.exp的计算更为精确。
-
专用的通用函数
numpy还有其他许多更为专业的数学计算函数,例如双曲三角函数、比特位计算、比较运算符、弧度转化为角度的运算、取整和求余运算等等。可以参考numpy的官方文档。
还有一个更加专用,也更加晦涩的通用函数优异来源是子模块scipy.special.如果你希望对你的数据进行一些更晦涩的数学计算,scipy.special可能包含了你需要的计算函数。这些函数多到甚至可以列出一个长长的列表。例如
from scipy import special #Gamma函数(广义阶乘,generalized factorials)和相关函数 x=[1,5,10] print("gamma(x) =",special.gamma(x)) print("ln|gamma(x) =",special.gammaln(x)) print("beta(x,2) =",special.beta(x,2)) #误差函数(高斯积分) #它的实现和它的逆实现 x=np.arrar([0,0.3,0.7,1.0]) print("erf(x) =",special.erf(x)) print("erfc(x) =",special.erfc(x)) print("erfinv(x) =",special.erfinv(x))
numpy和scipy.special中提供了大量的通用函数,这些包的文档在网上就可以查到,搜索"gamma function python"即可。
-
高级的通用函数特性
-
指定输出
在进行大量运算时,有时候指定一个用于存放运算结果的数组是非常有用的。不同于创造临时数组,你可以用这个特性将计算结果直接写入到你期望的存储位置。所有的通用函数都可以通过out参数来指定计算结果的存放位置:例如
x=np.arrage(5) y=np.empty(5) np.multiply(x,10,out=y) print(y)
这个特性也可以用作数组视图,例如可以将计算结果写入指定数组的没隔一个元素的位置:
import numpy as np x=np.arange(5) y=np.zeros(10) np.power(2,x,out=y[::2]) print(y)
如果这里写的是y[: : 2]=2x,那么结果将会是创建一个临时数组,该数组存放的是2 * * x的结果,并且接下来会将这些值复制到y数组中。对于较小的计算量例子来说,上述两种方式差别并不大,但是如果对于计算量较大的数组来说,有效地使用out参数可以很好的节约内存。**
-
聚合
二元通用函数还有一些非常有用的特性,例如聚合,聚合可以直接在对象上计算。
附: reduce函数的官方解释为:Apply a function of two arguments cumulatively to the items of a sequence,from left to right, so as to reduce the sequence to a single value.
-
-
-
-
从左到右对一个序列的项累计地应用有两个参数的函数,以此合并序列到一个 单一值。也就是聚合的意思 序列: 序列 其实就是python中 tuple list dictionary string 以及其他可迭代物
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UCecKRhB-1606657451933)(C:\Users\QXY\AppData\Roaming\Typora\typora-user-images\image-20201129203353984.png)]
reduce的工作过程是 :在迭代sequence(tuple ,list ,dictionary, string等可迭代物)的过程中,首先把 前两个元素传给 函数参数,函数加工后,然后把得到的结果和第三个元素作为两个参数传给函数参数, 函数加工后得到的结果又和第四个元素作为两个参数传给函数参数,依次类推。 如果传入了 initial 值, 那么首先传的就不是 sequence 的第一个和第二个元素,而是 initial值和 第一个元素。经过这样的累计计算之后合并序列到一个单一返回值。
reduce可以暂时理解为聚合一个数组,下面举两个例子吧
例1:
import numpy as np
x=np.arange(1,6)
np.add.reduce(x)
# the output will be 15. 也就是返回数组中所有元素两两相加后得到的和.
例2:
import numpy as np
np.multiply.reduce(x)
# the output 返回数组中所有元素两两相乘后得到的和.
如果需要存储每次计算的中间结果时,可以使用accumulate.
np.add.accumulate(x)
# output: array([1,3,6,10,15]) --因为5个元素,所以只能有4个后面的结果
np.multiply.accumulate(x)
# output: array([1,2,6,24,120])
当然,在一些特殊情况中,numpy也提供了专用的函数(np.sum、np.prod、np.cumsum、np.cumprod),它们同样也可以实现以上reduce的功能.
-
外积
任何通用函数都可以用outer方法来获得两个不同输入数组所有元素对的函数运算结果。
比较好玩的例子是,你可以用一行代码实现一个乘法表。
x=np.arange(1,6)
np.multiply.outer(x,x)
后面还会介绍通用函数很有意思的ufunc.at和ufunc.reduceat方法.
还有一个较为重要的特性是广播(broadcasting),可以对不同大小和形状的数组进行操作.
更多信息可以在numpy和scipy的官方文档网站找到.
前面介绍过,可直接在Ipython中通过导入相应的包,然后利用Ipython的Tab键补全和帮助(?)功能获取信息。
- 聚合:最小值、最大值和其他值
当你面对大量的数据时,第一个步骤通常都是计算相关数据的概括统计值。最常用的概括统计值可能是均值和标准差,还有一些形式(例如求和、乘积、中位数、最小值和最大值、分位数、等等)的聚合也是非常有用的。
而numpy恰恰就有很多这样的非常快速的内置函数可以用于数组。
-
数组值求和
python可以使用内置的sum函数计算一个数组中所有元素的和。–使用np.shape()函数可以获取矩阵的尺寸以及大小
import numpy as np L=np.random.random(100) sum(L)
这numpy.sum函数是在编译码中执行操作,所以numpy的操作计算得更快一些:
big_array=np.random.rand(1000000) %timeit sum(big_array) %timeit np.sum(big_array)
但是需要注意,sum函数和np.sum函数并不等同,有时会导致混淆。尤其是它们各自的可选参数都有不同的涵义,np.sum函数是知道数组的维度的,后面会再细细讲解这方面的知识。
-
最小值和最大值
同样的,numpy对应的函数也有min、max,python内置也有min、max
对于min、max、sum和其他numpy聚合,一种更简洁的语法形式是数组对象直接调用这些方法,
例如
print(big_array.min()) print(big_array.max()) print(big_array.sum())
attention! ,当你操作numpy数组时,确保你执行的是numpy版本的聚合。
-
多维度聚合
一种常见的聚合操作是沿着一行或者一列聚合。例如,假设你有一些数据存在二维数组中,聚合函数还有一个参数,用于指定沿着哪个轴的方向进行聚合,例如可以通过axis=0来找到每一列的最小值
M=np.random.random((3,4)) print(M) M.min(axis=0) M.max(axis=1)
axis关键字指定的是数组将会被折叠,而不是将要返回的维度。
因为指定axis=0意味着第一个轴将要被折叠,对于二维数组,这意味着没一列的值都将被聚合。
其他聚合函数
numpy提供了很多其他聚合函数,但是这里不会详细地介绍它们。另外,大多数的聚合都有对NaN值的安全处理策略(NaN-safe),即计算时忽略所有的缺失值,这些缺失值即特殊的IEEE浮点型NaN值,有些NaN-safe的函数直到Numpy1.8版本才加进去,所以更早版本的numpy并不支持此功能。
-
-
函数名称 | NaN安全版本 | 描述 |
---|---|---|
np.sum | np.nansum | 计算元素的值 |
np.prod | np.nanprod | 计算元素的积 |
np.mean | np.nanmean | 计算元素的平均值 |
np.std | np.nanstd | 计算元素的标准差 |
np.var | np.nanvar | 计算元素的方差 |
np.min | np.nanmin | 找出最小值 |
np.max | np.nanmax | 找出最大值 |
np.argmin | np.nanargmin | 找出最小值的索引 |
np.argmax | np.nanargmax | 找出最大值的索引 |
np.median | np.nanmedian | 计算元素的中位数 |
np.percentile | np.nanpercentile | 计算基于元素排序的统计值 |
np.any | N/A | 验证是否存在元素为真 |
np.all | N/A | 验证所有元素是否为真 |
后面的博客会展示这些聚合函数的使用方法.