注意:下面函数的含义中尺寸大小指的是数组的属性shape的值
NumPy 是一个 Python 包。 它代表 “Numeric Python”。 它是一个由多维数组对象和用于处理数组的例程集合组成的库。
Numeric,即 NumPy 的前身,是由 Jim Hugunin 开发的。 也开发了另一个包 Numarray ,它拥有一些额外的功能。 2005年,Travis Oliphant 通过将 Numarray 的功能集成到 Numeric 包中来创建 NumPy 包。 这个开源项目有很多贡献者。
学Python的同学应该都知道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组成 |
函数 | 含义 |
---|---|
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的对角线往主对角线的上方走。 |
函数 | 含义 |
---|---|
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(默认值),那么就会返回一个值。 |
函数 | 含义 |
---|---|
ndim | 返回int。表示数组的维度 |
shape | 返回tuple。表示数组的尺寸,对于n行m列的矩阵,形状为(n,m) |
size | 返回int。表示数组的元素总数,等于数组形状的乘积 |
dtype | 返回type。描述数组中元素的类型 |
itemsize | 返回int。表示数组的每个元素的大小(以字节为单位) |
nbytes | 返回int。表示数组占用的空间 |
函数 | 含义 |
---|---|
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也只能接收两个整数。切记这两个函数不能输入两个整数的列表或元组 |
函数 | 含义 |
---|---|
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中元素的中位数(中值) |
函数 | 含义 |
---|---|
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的尺寸大小要相同 |
函数 | 含义 |
---|---|
x1==x2或np.equal(x1,x2) | 返回布尔数组 |
x1!=x2或no.not_equal(x1,x2) | 返回布尔数组 |
x1返回布尔数组 |
|
x1<=x2或np.less_equal(x1,x2) | 返回布尔数组 |
x1>x2或np.greater(x1,x2) | 返回布尔数组 |
x1>=x2或 np.greater_equal(x1,x2) | 返回布尔数组 |
三角函数输入和输出的是弧度制
函数 | 含义 |
---|---|
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 | 反三角函数 |
函数 | 含义 |
---|---|
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的数据类型 |
函数 | 含义 |
---|---|
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:无穷范数, |
函数 | 含义 |
---|---|
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多个数组组成的列表或元组。 |
函数 | 含义 |
---|---|
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),列表值进行切分。 |
函数 | 含义 |
---|---|
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(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 "", line 1, in
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 "", line 1, in
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函数太多了,这里就写了一些比较常用的函数,总结这些函数真是太费时间了,函数的用法我是自己上机实验过,按照自己的理解整理的,内容可能不全,讲解的不够详细。如果你有什么疑惑或不懂的地方,建议亲自实践。以后遇见了更多的函数我会继续补充的。希望大家多多支持。