import numpy as np
为提高运算效率,ndarray数组值的类型默认相同,创建时自动指定默认数据类型(内存占用最大的值类型)
默认浮点类型(float)
numpy方法 | 解释 |
---|---|
np.dtype | 指定当前numpy对象的整体数据, 见下一个表格 |
np.itemsize | 对象中每个元素的大小, 单位字节 |
np.size | 对象元素的个数, 相当于np.shape中的n*m值 |
np.shape | 轴, 查看数组形状, 对于矩阵, n行m列 |
np.ndim | 秩 |
np.isnan(list) | 筛选出nan值 |
np.iscomplex(list) | 筛选出非复数 |
~ | 取补运算符 |
np.array(数组, dtype=np.bool) | 自定义数组类型 |
np.astype(np.bool) | 转换存放数据类型 |
np.mat() | 将python 列表转化成矩阵,比如将二维数组,转化为矩阵,方便运算 |
np.mat().getA() | 将matrix对象转成ndarray对象,维度不变;getA1()直接转化为一维ndarray对象 |
np.matrix() | 同上 |
np.asmatrix() | 将ndarray对象转成matrix对象 |
np.tile() | 重复某个数组。比如tile(A,n),功能是将数组A重复n次,构成一个新的数组传送门 |
np.T | 矩阵转置, 行变列, 列变行, 对角线翻转矩阵,相当于np.transpose() |
np.tolist() | 转换成python列表, 用于和python原生结合写程序 |
np.multiply(x, y) | 矩阵x 矩阵y相乘 |
np.unique() | 数组去重, 并且从小到大生成一个新的一维数组或二维数组 |
np.arange | 同python range(),生成的对象为ndarray类型的 |
np.arange(24).reshape((2, 3, 4)) | 创建一个2维3行4列的数组, 必须能被给定的长度除开, 可以索引和切片 |
np.arange(24).resize((2, 3, 4)) | 在一个创建好的np对象上修改原来的维度,创建一个新的对象 |
np.linspace(x, y, z) | 等间距生成, x起始数值, y终止数值, z为产生的数据点数;也就是在区间x,y中产生z个点 |
np.ones(shape, dtype=None, order='C') | 生成数值为1且shape形状的的数组, shape可以是元组,表示创建几行几列数据;也可以是单个数字,表示创建大小为n的一维数组 |
np.zeros(shape, dtype=None, order='C') | 生成数值为0且shape形状的的数组, shape可以是元组,表示创建几行几列数据;也可以是单个数字,表示创建大小为n的一维数组 |
np.full([x, y], z) | 自定义模板数组, 生成x行y列都是z的数组 |
np.eye(N, M=None, k=0, dtype=float, order='C') | 生成大小为N的对角方阵,对角线的值都是1,其余都是0;M可以调整输出列数 |
np.flatten() | np对象降维成一维,不改变原值 |
np.random.rand(x, y, z) | 生成一个一维x随机数或生成x*y的随机数组 |
np.random.randn(x, y) | 正态分布随机数 |
np.random.randint(low, high, (shape)) | 整数随机数 |
np.random.normal(loc, scale, (size)) | 从指定正态分布中抽取样本, loc为概率分布的均匀值, 标准差scale |
np.random.seed(s) | 给一个随机数字固定 |
np.randomunifrom(low, high, (size)) | 均匀分布的数组, 有小数 |
np.random.shuffle(a) | 将数组a的第0轴(最外维度)进行随机排列(洗牌), 改变数组a, 行边列不变 |
np.random.permutation(a) | 同上, 不改变数组a |
np.random.choice(a, size=None, replace=False, p=数组a/np.sum(b)) | 从一维数组a中以概率p抽取元素,形成size形状新数组,replace表示是否可以重用元素,默认为False,p为抽取概率,本位置越高,抽取概率越高 |
np.sum(axis=None) | 求和, axis=0为列, 1为行 |
np.argsort() | 按照矩阵中的元素大小进行排序,输出的是元素对应的下标 |
np.sort(a, kind='quicksort',axis=None) | 从小打大排序,默认quicksort;axis=None是将多维放在一维中排序;axis=-1多维数组按行排序;axis=0按列排序; |
-np.sort(-a, axis=None) | 从大到小排序 |
np.sort_values(‘字段’, ascending=False) | 排序,升序排列 |
np.mean(axis=None) | 求平均数,axis=0同列取平均值,axis=1同行取平均值 |
np.average(axis=None,weights=None) | 加权平均,weights加权值,不设为等权重,例子[10, 5, 1],每列分别X10,X5,X1在/(10+5+1) |
np.var(axis=None) | 方差:各数与平均数之差的平方的平均数 |
np.std(axis=None) | 标准差:方差平方根 |
np.min(axis=None) | 最小值 |
np.argmin(axis=None) | 求数组中最小值的坐标 |
np.median(axis=None) | 中位数 |
np.ptp(axis=None) | 元素最大值与最小值的差 |
np.cumsum() | 累加,cumsum和cumprod之类的方法不聚合,产生一个中间结果组成的数组,默认一维数组,1为按原样 |
np.cumprod() | 累乘 |
np.count_nonzero(arr > 0) | 计数非0值个数,布尔值会被强制转换为1和0,可以使用sum()对布尔型数组中的True值计数 |
np.bools.any() | 测试数组中是否存在一个或多个True |
np.bools.all() | 数组中所有值是否都是True, 测试有没有空值 |
np.insert(arr, obj, values, axis=None) | 插入数值,np.insert(a, [1], [[1],[2],[3]], axis=1)在第一列插入一个列表;axis=None插入到一维数组中;axis=1插入到列;axis=0插入到行 |
np.dot(a, b, out=None) | 求乘积运算,如果a,b同为数字,则计算两个数的乘积;如果为两个向量,则计算两个向量的内积;如果为多维数组,则计算的是多维数组的向量积的和;同数组,同np.array对象,一般使用X_.T.dot(X_) |
np.linalg.inv(a) | 求矩阵的逆,ainv = inv(np.matrix(a)),因为矩阵不能直接相除,所以有时需要转化为矩阵的逆来做乘法运算,矩阵的逆就是用来解决矩阵除法问题的 |
np.select(condlist, choicelist, default=0) | condlist定义筛选规则,choicelist做筛选时需要做的操作 |
np.column_stack((a,b)) | 将a作为b的一列合并到b,a为一维列表,b为1到多维列表,必须满足a的列表大小等于b的行数, |
np.concatenate((a, b), axis=0) | 合并数组,axis=0按行合并,axis=1按列合并;np.concatenate((a, b.T), axis=1);采用b.T的前提是必须a和b的维度相同,如果b为一维,a为二维的话,需要使用np.stack(b)将b转化为二维的列数据才可以进行合并 |
np.asarray(a, dtype) | 将a数据转化为固定的类型;array和asarray都可以将结构数据转化为ndarray,但是主要区别就是当数据源是ndarray时,array仍然会copy出一个副本,占用新的内存,但asarray不会 |
np.where(condition, x=None, y=None) | 满足条件(condition),输出x,不满足输出y |
np.ravel(order='C') | 将多维数组降维成一维数组,返回原始多维数组的引用,注意如果改变降维后一维数组的值,则原始数组的值也会改变;order为降维时采用的策略,可选值{'C', 'F', 'A', 'K'},默认行序优先 |
np.flatten(order='C') | 将多维数组降维成一维数组,返回原始多维数组的拷贝,改变降维后的一维数组的值,则原始数组的值不会改变;order为降维时采用的策略,可选值{'C', 'F', 'A', 'K'},默认行序优先 |
np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None) | 返回从起始值到终止值总数量为num的列表,endpoint为True表示包含终止值 |
np.meshgrid(*xi, **kwargs) | meshgrid的作用是根据传入的两个一维数组参数生成两个数组元素的列表。如果第一个参数是xarray,维度是xdimesion,第二个参数是yarray,维度是ydimesion。那么生成的第一个二维数组是以xarray为行,ydimesion行的向量;而第二个二维数组是以yarray的转置为列,xdimesion列的向量。 |
np.array(p_object, dtype=None, copy=True, order='K', subok=False, ndmin=0) | 转化列表数据类型为ndarray |
np.c_[xx.ravel(), yy.ravel()] | 将两个数组中相同列的数据拼接起来,当做行;类似于pandas中的merge |
np.r_[xx.ravel(), yy.ravel()] | 将两个数组中所有行数据转化为一行数据;类似于pandas中的contact |
data.reshape(-1, m) | 表示事先不知道数据总数有多少个,numpy会自动计算数据的总数n,变化成为n列m行的数据 |
np.vstack([a,b]) | 将a,b两个numpy对象按行堆叠到一块,列不变 |
np.hstack(arr1, arr2) | 将两个数组进行堆叠,可以是一维或者多维(tuple/list),相当于分别合并 |
np.around(SVD, 4) | 将矩阵SVD中所有元素四舍五入保留四位小数 |
np.linalg.norm(x, ord=None, axis=None, keepdims=False) | 求矩阵x的范数,默认相当于求向量或者矩阵的平方和的平方根,具体请参加下面函数详细讲解 |
np.linalg.svd(a, full_matrices=True, compute_uv=True) | 奇异矩阵分解,在推荐系统中有举足轻重的地位 |
np.diag(v, k=0) | 如果v为多维数组的话,则返回对角元组的一个一维数组;如果v为一维数组的话,则返回一个对角元素填充一维数组的值,其余元素补充为0的一个矩阵;k值可以为正负值,默认为0 |
np.dtype类型 | |
---|---|
np.bool | 布尔值 |
np.int | 整型 |
np.float | 浮点型 |
np.complex | 复数 |
np.object | 对象 |
np.string_ | ASCII字符 |
np.unicode_ | Unicode所有字符, 字节数平台决定 |
np读取csv文件
- numpy提供了便捷的内部文件存取,将数据存为np专用的npy(二进制格式)或npz(压缩打包格式)格式
- npy格式以二进制存储数据的,在二进制文件第一行以文本形式保存了数据的元信息(维度,数据类型),可以用二进制工具查看查看内容
- npz文件以压缩打包文件存储,可以用压缩软件解压
# 读取csv文件
np.loadtxt(frame,dtype=np.float,delimiter=None,skiprows=0,usecols=None,unpack=False)
# 去掉b'0.00'中的b
np.loadtxt('a.csv', dtype=bytes, delimiter=',').astype(str)
c = np.load('x.npy') # .npy文件读入数组
d = np.load("y.npz") # .npz压缩包读入
# 存储csv文件,本身是ASCII字符,不能存储非ASCII字符串,csv文件只能存储一维、二维数据,不能存储多维数据
np.savetxt(frame,array,fmt='%.18e',delimiter=None)
np.save('a.npy',a) # 存为.npy文件
np.savez("a.npz", ar0 = a, ar1 = b) # 多个数组存入一个.npz压缩包
参数 | 解释 |
---|---|
frame | 文件、字符串或产生器,可以是.gz或者bz2压缩文件 |
dtype | 数据类型,可选,CSV的字符串以什么数据类型读入数组中,默认np.float |
delimiter | 分隔字符串,默认是任何空格,改为逗号 |
skiprows | 跳过前x行,一般跳过第一行表头 |
usecols | 读取指定的列,索引,元组类型 |
unpack | 如果True,读入属性将分别写入不同的数组变量,False读入数据只写入一个数组变量,默认False |
难点函数解析
1、numpy.linalg.svd
函数:np.linalg.svd(a,full_matrices=1,compute_uv=1)。
参数:
-
a是一个形如(M,N)矩阵
-
full_matrices的取值是为0或者1,默认值为1,这时u的大小为(M,M),v的大小为(N,N) 。否则u的大小为(M,K),v的大小为(K,N) ,K=min(M,N)。
-
compute_uv的取值是为0或者1,默认值为1,表示计算u,s,v。为0的时候只计算s。
返回值:
- 总共有三个返回值u,s,v
-
u大小为(M,M),s大小为(M,N),v大小为(N,N)。
-
A = u*s*v
-
其中s是对矩阵a的奇异值分解。s除了对角元素不为0,其他元素都为0,并且对角元素从大到小排列。s中有n个奇异值,一般排在后面的比较接近0,所以仅保留比较大的r个奇异值。
关于奇异值的解释:
- 对于方阵而言A=QQ-1 其中的就是特征向量。但是对于不是方阵的矩阵而言就没有特征向量。
- 非方阵的矩阵可以用奇异值分解来描述这个矩阵。A=UVT。其中U叫做左奇异值,叫做奇异值,V叫做右奇异值。因为只有对角线的数不为0,并且数值是从大到小排列,所以一般只取r个,r的值越接近A的列数,那么三个矩阵的乘法得到的矩阵越接近A。
- 因为三个矩阵的面积之和远远小于原矩阵A,所以当我们向压缩空间表达A的时候,可以使用这三个矩阵。
- 当A不是矩阵的时候,把A转置变为 AT。并且。其中的v就是右奇异值。,这里的就是上面的奇异值。,这里的u就是上面的左奇异值。
2、np.linalg.norm(x, ord=None, axis=None, keepdims=False)
①x: 表示矩阵(也可以是一维)
②ord:范数类型
向量的范数:
矩阵的范数:
ord=1:列和的最大值
ord=2:|λE-ATA|=0,求特征值,然后求最大特征值得算术平方根
ord=∞:行和的最大值
ord=None:默认情况下,是求整体的矩阵元素平方和,再开根号
③axis:处理类型
axis=1表示按行向量处理,求多个行向量的范数
axis=0表示按列向量处理,求多个列向量的范数
axis=None表示矩阵范数。
④keepding:是否保持矩阵的二维特性
True表示保持矩阵的二维特性,False相反