第二章,python--numpy常用函数详解

注意:下面函数的含义中尺寸大小指的是数组的属性shape的值

Numpy简介

NumPy 是一个 Python 包。 它代表 “Numeric Python”。 它是一个由多维数组对象和用于处理数组的例程集合组成的库。

Numeric,即 NumPy 的前身,是由 Jim Hugunin 开发的。 也开发了另一个包 Numarray ,它拥有一些额外的功能。 2005年,Travis Oliphant 通过将 Numarray 的功能集成到 Numeric 包中来创建 NumPy 包。 这个开源项目有很多贡献者。

学Python的同学应该都知道Numpy库,也知道这个库在机器学习领域是必不可少的库,这里我为大家整理了Numpy库的一些常用的函数,方便大家在使用的时候查找。

Numpy库函数讲解

Numpy数据类型

类型 含义
np.int8 和 np.uint8 整数(-128到127)和 无符号整数(0到255)
np.int16 和 np.uint16 整数(-32768至32767)和 无符号整数(0到65535)
np.int32 和 np.uint32 整数(-2147483648至2147483647)和 无符号整数(0到4294967295)
np.int64 和 np.uint64 整数(-9223372036854775808至9223372036854775807)和 无符号整数(0到18446744073709551615)
np.float16 半精度浮点数(十进制下小数点后精确到后四位)
np.float32 单精度浮点数(十进制下小数点后精确到后8位)
np.float64 双精度浮点数
np.complex64 复数,由两个32位浮点数(实数和虚数组成)表示
np.complex128 复数,由两个64位浮点数(实数和虚数组成)表示
np.bool_ 布尔值,由True和False组成

Numpy的创建

函数 含义
np.array(object, dtype=None,copy=True) odject = []或(),创建一维组。object = [[],[],…] 或((),()…),创建二维数组。dtype可自选数据类型,不写系统会自动判断填写数据类型。copy默认为True
np.asarray(object,dtype=None) 当np.array(copy = False)两函数一样

讲解一下np.array中参数copy的用法,文字描述十分麻烦,还是代码演示吧

import numpy as np
a = [-1,2,2]
a = np.array(a)
c = np.array(a,copy = False)
a[0] = 100
print('当copy=False')
print('c数组')
print(c)
print('a数组')
print(a)
#代码运行结果:
当copy=False
c数组
[100   2   2]
a数组
[100   2   2]
当copy=True
c数组
[-1  2  2]
a数组
[100   2   2]

通过代码结果可以看出copy为True和False的区别,也就明白了np.array与np.asarray的区别

函数 含义
创建等差数列 np.arange([start,]stop, [step],[dtype]) 创建一个从start到stop-1,步长为step的数组,其中start默认为0,step默认为1,stop是必须填写的参数
创建等差数列 np.linspace(start,stop,[num],[endpoint],[dtype ]) 创建一个从start到stop的等差数列,num为此等差数列的个数,默认50,endpoint默认为True代表数列的最后一项包含stop,反之不包含
特殊值数组np.zeros(shape, [dtype],) shape为一个数值,创建一个一维的值为0的数组,shape为元组或列表,创建一个与shape尺寸大小的值为0的数组。
特殊值数组np.ones(shape,[dtype]) shape为一个数值,创建一个一维的值为1的数组,shape为元组或列表,创建一个与shape尺寸大小的值为1的数组
特殊值数组np.eye(n,[m],[k],[dtype]) n为数组的行数。m是输出的列数,默认为n。k默认为0表示的是主对角线为1,其余为0,负数越小表示为1的对角线往主对角线的下方走,正数越大表示为1的对角线往主对角线的上方走。

numpy创建随机数组

函数 含义
np.random.seed(k) 如果使用相同的k 值,则每次生成的随机数都相同,如果不设置这个值,则系统根据时间来自己选择这个值,此时每次生成的随机数因时间差异而不同。
np.random.random([size]) 在[0,1)区间随机生成数组,szie不填写时只生成一个数据的数组,size可接收列表或元组,随机生成和size尺寸大小相同的数组
np.random.rand(x,x1,x2…) 在[0,1)区间随机生成符合(x,x1,x2…)尺寸大小形状的数组
np.random.randn(x,x1,x2…) 生成符合标准正态分布的(x,x1,x2…)尺寸大小形状的数组
np.random.randint(low, [high], [size], [dtype]) 在[low,high)区间内生成符合size尺寸大小相同的数组,当参数high不填写时生成区间为[0,low)的数组。当shape不填写时只生成一个数据的数组
np.random.choice(a,[size],[replace=True],[p]) a为数字,则从[0,a)中随机抽取数字,a为列表,元组和数组(必须是一维的)中随机抽取数字。size不填写时,只随机产生一个数据,siz为数字,随机产生size个数据组成一维数组,size为列表或元组,则生成与size相同大小尺寸的数组。replace默认为True,表示可以取相同数字,False表示不可以取相同数字。p与a相对应,表示取数组a中每个元素的概率,默认为选取每个元素的概率相同。
numpy.random.normal(loc=0.0, scale=1.0, size=None) loc:浮点型数据,分布的均值(中心)。scale: 浮点型数据,分布的标准差(宽度)。size:整数或者整数组成的元组,如果给定size,生成与size尺寸大小相同的数组。如果size为None(默认值),那么就会返回一个值。

Numpy数组的属性函数

函数 含义
ndim 返回int。表示数组的维度
shape 返回tuple。表示数组的尺寸,对于n行m列的矩阵,形状为(n,m)
size 返回int。表示数组的元素总数,等于数组形状的乘积
dtype 返回type。描述数组中元素的类型
itemsize 返回int。表示数组的每个元素的大小(以字节为单位)
nbytes 返回int。表示数组占用的空间

Numpy更改数组形状

函数 含义
np.reshape(a, newshape,) 或a.reshape(shape) 两函数效果相同,np.reshape的参数newshape只能接收列表和元组,但a.reshape不但可以接收列表和元组,参数的每个元素作为单独的参数传入.变换后的数组的元素个数与原来的元素个数相同,否则报错
np.resize(a,new_shape)或a.reszie() new_shape只能接收列表和元组,a.resize可单个接收,也可接收列表和元组。变换后的数组的元素个数可以与原数组的元素个数不同,np.shape可以进行重复填充,a.resize进行0填充。
np.ravel(a)或a.ravel() 将数组a变为一维数组
a.flatten() 将数组a变为一维数组
np.squeeze(a) 移除元素个数为一的维度
np.transpose(a,axes)或a.transpose() a 为输入的数组。axes为元组 或 列表, 如果指定,它必须是包含[0,1,…,N-1]的排列的元组或列表,其中N是a的轴数,返回数组的第i个轴将与输入的编号为axes [i]的轴相对应。 axes默认为range(a.ndim)[::-1],这将反转轴的顺序。a.transpose功能与np.transpose一样,a.transpose可以接收多个数,元组或列表(这个难以理解,建议使用a.shape来查看使用该函数前后的变化)
np.swapaxes(a, axis1, axis2)或a.swapaxes() 交换axis1和axis2的所代表的两个轴,axis1和axis2都为整数。a.swapaxes也只能接收两个整数。切记这两个函数不能输入两个整数的列表或元组

Numpy统计函数

函数 含义
np.sum(a, axis=None)或a.sum(axis = None) 根据给定轴axis计算数组a相关元素之和,axis整数或元组
np.mean(a, axis=None)或a.mean(axis = None) 根据给定轴axis计算数组a相关元素的期望,axis整数或元组
np.average(a,axis=None,weights=None) 根据给定轴axis计算数组a相关元素的加权平均值
np.std(a, axis=None)或a.std(axis = None) 根据给定轴axis计算数组a相关元素的标准差
np.var(a, axis=None)或a.var(axis = None) 根据给定轴axis计算数组a相关元素的方差
np.min(a,axis=None)或a.min(axis=None) 计算数组a中元素的最大值
np.max(a,axis=None)或a.max(axis=None) 计算数组a中元素的最大值
np.argmin(a,axis=None)或 a.argmin(axis = None) 计算数组a中元素最小值降为一维后的下标
np.argmax(a,axis=None)或 a.argmax(axis = None) 计算数组a中元素最大值降为一维后的下标
np.ptp(a,axis=None)或a.ptp(axis = None) 计算数组a中元素最大值与最小值的差
np.median(a,axis=None)或 a.median(axis = None) 计算数组a中元素的中位数(中值)

Numpy算数操作

函数 含义
x1+x2或np.add(x1,x2) x1与x2相加,x1与x2可以为数值也可以都为数组,数组的时候其shape的尺寸大小要相同
x1-x2或np.subtract(x1,x2) x1减x2,x1与x2可以为数值也可以都为数组,数组的时候其shape的尺寸大小要相同
-x或np.negative(x) 取x的负数,x可以为数值也可以为数组
x1*x2或 np.multiply(x1,x2) x1x与2相乘,x1与x2可以为数值也可以都为数组,数组的时候其shape的尺寸大小要相同
x1/x2或np.divide(x1,x2) x1除以x2,x1与x2可以为数值也可以都为数组,数组的时候其shape的尺寸大小要相同,x2为零的时候,值为inf(无限大)
x1//x2或 np.floor_divide(x1,x2) x1整除x2,x1与x2可以为数值也可以都为数组,数组的时候其shape的尺寸大小要相同
x1**x2或 np.power(x1,x2) x1的x2次方,x1与x2可以为数值也可以都为数组,数组的时候其shape的尺寸大小要相同
x1%x1或 np.mod(x1,x2) x1除以x2的余数,x1与x2可以为数值也可以都为数组,数组的时候其shape的尺寸大小要相同

Numpy比较操作

函数 含义
x1==x2或np.equal(x1,x2) 返回布尔数组
x1!=x2或no.not_equal(x1,x2) 返回布尔数组
x1<x2或np.less(x1,x2) 返回布尔数组
x1<=x2或np.less_equal(x1,x2) 返回布尔数组
x1>x2或np.greater(x1,x2) 返回布尔数组
x1>=x2或 np.greater_equal(x1,x2) 返回布尔数组

Numpy的指数,对数,三角函数

三角函数输入和输出的是弧度制

函数 含义
np.deg2rad 将角度制化为弧度制
np.rad2deg 将弧度制化为角度制

在使用三角函数的时候我们可以先将角度制化为弧度制,再带入三角函数。

函数 含义
np.exp 计算指数(e^x)
np.log,np.log10,np.log2,np.log1p 求以e为底,以10为低,以2为低,以(1+x)为底的对数
np.sign 将数组中的值标签化,大于0的变成1,等于0的变成0,小于0的变成-1
np.cos,np.sin,np.tan 三角函数
np.arccos,np.arcsin,np.arctan 反三角函数

Numpy取整,四舍五入

函数 含义
np.ceil 朝着无穷大的方向取整,比如5.1会变成6,-6.3会变成-6
np.floor 朝着负无穷大方向取证,比如5.1会变成5,-6.3会变成-7
np.rint(a) 四舍五入取整
np.round(a,decimals=0) 返回四舍五入后的值,decimals为小数点后的位数
np.modf 将整数和小数分隔开来形成两个数组
array.astype(‘数据类型’) 转换数组array的数据类型

Numpy矩阵运算

函数 含义
np.dot(a,b) a与b进行数组的行列式相乘
np.linalg.inv(a) 求矩阵a的逆
np.linalg.det(a) 求a的行列式
np.linalg.eig(a) 求a的特征值和特征向量
np.linalg.sval(a) 求a的奇异值分解
np.linalg.norm(a, ord=2, axis=None,) ord=1:求一范数,ord=2:求二范数,ord=np.inf:无穷范数,

Numpy数组合并

函数 含义
np.append(arr, values, axis=None) arr:需要被合并values的数组。values:合并到数组arr中的数组。axis:可选参数,如果axis没有给出,合并后返回值为一维数组。axis被填写,按照axis指定的维度合并(axis填写时arr和values需有相同的shape的尺寸大小)
np.concatenate(arrays, axis=None) array多个数组组成的列表或元组。axis填写后将按照axis指定的维度合并(array中的数组可以是不同的shape的尺寸大小)
np.stack(arrays, axis=0) array多个数组组成的列表或元组。axis填写后将按照axis指定的维度合并(array中的数组需为相同的shape的尺寸大小)
np.hstack(tup) 横向合并,tup多个数组组成的列表或元组。建议使用二维数组,多维数组当shape的尺寸大小不同时有时可以合并,有时不可以。
np.vstack(tup) 竖向合并,tup多个数组组成的列表或元组。

Numpy数组分割

函数 含义
np.split(ary, indices_or_sections, axis=0) ary:要切分的数组。indices_or_sections:如果是一个整数,表示将arry切割为改整数份,如果是一个列表或元组(第一个值不要为0),列表值进行切分。axis:沿着哪个维度进行切向,默认为0,横向切分,1表示竖向切分。
np.hsplit(ary, indices_or_sections) 竖向切分。ary:要切分的数组。indices_or_sections:如果是一个整数,表示将arry切割为改整数份,如果是一个列表或元组(第一个值不要为0),列表值进行切分。
np.vsplit(ary, indices_or_sections) 横向切分。ary:要切分的数组。indices_or_sections:如果是一个整数,表示将arry切割为改整数份,如果是一个列表或元组(第一个值不要为0),列表值进行切分。

Numpy其他函数

函数 含义
np.take(a,indices,axis = None)/a.take() a:要提取的数组。indices;要提取的值的索引的列表。axis=0:抽取相应索引行的数据。axis=1:抽取相应索引列的数据。axis=None:将数组转化为一维数据再进行索引相对应的数据
np.argmax(array, axis=None) /array.argmax(axis=None) array:代表输入数组;axis=0:对array取每一列的最大值的索引,axis=1:对array取每一行的最大值的索引。axis=None:j将array转为一维数据再进行取最大值的索引(axis为1和0所对应的列和行没有写错,它是和别人不同)

np.tensordot讲解

np.tensordot函数是对于高维矩阵进行的内积运算,这个内积的过程不好理解,建议从维度上进行理解就好了

np.tensordot(a,b,axes)

a,b是要进行内积运算的矩阵
axes是矩阵要运算的维度

1.当axes = n时,n为整数时,代表的是a的后n个维度与b的前n个维度进行内积后,a去掉后n个维度,b去掉前n个维度两者再结和的维度,看例子:

首先定义两个矩阵

>>> a = np.random.rand(4,5,3,2)
>>> b = np.random.rand(2,3,5,4)

这里设定axes = 0时代表没有维度去掉,故新矩阵维度为(4, 5, 3, 2, 2, 3, 5, 4)
axes = 1的时候运算后的矩阵的大小为去掉了a的后一个维度与b 的前一个维度故新矩阵维度为(4, 5, 3, 3, 5, 4)

>>> print(np.tensordot(a,b,axes = 0).shape)
(4, 5, 3, 2, 2, 3, 5, 4)
>>> print(np.tensordot(a,b,axes = 1).shape)
(4, 5, 3, 3, 5, 4)

这里是axes = 2的时候,但是a的后2个维度与b的前2各维度不相同,就会报错

>>> print(np.tensordot(a,b,axes = 2).shape)
Traceback (most recent call last):
  File "<pyshell#47>", line 1, in <module>
    print(np.tensordot(a,b,axes = 2).shape)
  File "<__array_function__ internals>", line 200, in tensordot
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python38\lib\site-packages\numpy\core\numeric.py", line 1117, in tensordot
    raise ValueError("shape-mismatch for sum")
ValueError: shape-mismatch for sum

修改b的维度使得b的前2个维度与a的后2个维度相同,新矩阵的大小为(4, 5, 5, 4)

>>> b = np.random.rand(3,2,5,4)
>>> print(np.tensordot(a,b,axes = 2).shape)
(4, 5, 5, 4)

2.当axes = [m,n],代表a的m维度与b的n维度进行的内积,新的矩阵大小为去掉a的m维b的n维然后再组合
首先我们看一下a,b的各维度的大小

>>> print(a.shape,b.shape)
(4, 5, 3, 2) (3, 2, 5, 4)

接着尝试内积a的2维b的0维,去掉后可以看见新矩阵的大小为(4, 5, 2, 2, 5, 4)

>>> print(np.tensordot(a,b,axes = [2,0]).shape)
(4, 5, 2, 2, 5, 4)

但是如果想要内积的维度大小不同,会报错

>>> print(np.tensordot(a,b,axes = [1,1]).shape)
Traceback (most recent call last):
  File "<pyshell#61>", line 1, in <module>
    print(np.tensordot(a,b,axes = [1,1]).shape)
  File "<__array_function__ internals>", line 200, in tensordot
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python38\lib\site-packages\numpy\core\numeric.py", line 1117, in tensordot
    raise ValueError("shape-mismatch for sum")
ValueError: shape-mismatch for sum

3.如果axes接收的是一个嵌套列表的列表:[[m], [n]],等于说可以选多个维度内积 (注意这里的两个列表相对应的维度的大小要相同),然后去掉a,b相应的维度,再组合
首先查看a,b的各维度大小,接着我们这里想要在大小为5和2的维度上内积,这里一定要注意两个列表中维度大小要相同

>>> print(a.shape,b.shape)
(4, 5, 3, 2) (3, 2, 5, 4)
>>> print(np.tensordot(a,b,axes = [[1,3],[2,1]]).shape)
(4, 3, 3, 4)

结尾

Numpy函数太多了,这里就写了一些比较常用的函数,总结这些函数真是太费时间了,函数的用法我是自己上机实验过,按照自己的理解整理的,内容可能不全,讲解的不够详细。如果你有什么疑惑或不懂的地方,建议亲自实践。以后遇见了更多的函数我会继续补充的。希望大家多多支持。

猜你喜欢

转载自blog.csdn.net/m0_59151709/article/details/129355556