numpy是一个开源的python科学计算基础库:
------ 一个强大的N维数组对象ndarray
------ 广播功能函数
------ 整合c/c++/Fortran代码的工具
------ 线性代数,傅里叶变换,随机数生成等功能
维度:一组数据的组织形式
一维数据:由对等关系的有序或无序数据构成,采用线性方式组织(相当于python中的列表,数组,集合等)
列表和数组区别:
------列表中的元素类型可以不同,但数组元素类型必须一致
二维数据:由多个一维数据组成,是一维数据的组合形式(如嵌套列表)
多维数据:由一维或二维数据在新维度上扩展形成(多层嵌套列表)
高维数据:仅利用最基本的二元关系展示数据之间的复杂结构(字典,数据表示格式(json,xml))
优点:
---- 数组对象可以使一维以及多维数据像单个数据一样看待
---- 多种数据类型,可以适当选择,合理使用空间,还可以提升计算速度(底层通过C语言实现)
---- 数组对象采用相同的数据类型,可以节省运算以及存储的空间
ndarray对象组成:
---- 实际的数据值
---- 描述数据基本特征的元数据(数据维度,数据类型,大小,元素类型,元素大小)
ndarray对象属性 | 说明 |
---|---|
.ndim | 秩,即轴的数量或维度的数量 |
.shape | 数组的维度 |
.size | 数组中元素的个数 |
.dtype | 数组中元素的类型 |
.itemsize | 每个数组元素的大小,单位字节 |
ndarray元素类型
bool(布尔类型),intc(与C语言int类型一致),intp(与C语言ssize_t一致)
int8,int16,int32,int64(分别是8位,16位,32位,64位长度整数)
uint8,uint16,uint32,uint64(分别是8位,16位,32位,64位长度无符号整数)
float16,float32,float64(分别是16位,32位,64位半精度浮点数)
complex64,complex128(分别是实部和虚部分别为32位或64位浮点数的复数)
函数中的dtype参数可以用np.int,np.float等,numpy将会自动匹配对应的float32,float64等
从python中的列表,元组创建ndarray数组
x = np.array(list/tuple,dtype=np.float32)
dtype省略时,会自动关联一个dtype类型
使用Numpy中的(arange,ones等)函数创建
函数 | 说明 |
---|---|
np.arange(n) | 类似range函数,返回的元素从0到n-1的ndarray数组 |
np.ones(shape) | 根据shape生成一个全1数组,shape为元组或者列表 |
np.zeros(shape) | 根据shape生成一个全0数组,shape为元组或者列表 |
np.full(shape, value) | 根据shape生成一个值全为value的数组,shape为元组或者列表 |
np.eye(n) | 生成一个n*n的单位矩阵数组 |
根据已知数组生成其相同维度的数组
np.ones_like(a) | 生成一个与a维度一样的全1数组 |
np.zeros_like(a) | 生成一个与a维度一样的全0数组 |
np.full_like(a, value) | 生成一个与a维度一样的以value为值的数组 |
其它函数
np.linspace(start,end,num,endpoint=True) | 从start到end等间距地生成num个数据,形成数组,endpoint表示是否包含end,即以end值作为最后一个值 |
np.concatenate((a,b,c…),axis=0) | 将两个或多个数组合并成一个,但是必须具有相同维度,axis 指定合并轴(合并轴中每个数据必须一样长度) |
从字节流(raw bytes)中创建ndarray数组
从文件中读取特定个数,创建ndarray数组
复制数组
ndarray数组的赋值不能使用 ’=‘,若a1=a2,其会将两个数组指向同一块地址空间
只能通过copy函数或切片如a1=a2.copy()或者a1=a2[ : , :]
a.T | 数组转置 |
.reshape(shape) | 不改变原数组,返回一个shape形状数组 |
.resize(shape) | 与reshape功能一样,但改变原数组 |
.swapaxes(ax1,ax2) | 将两个数组维度进行交换 |
.flatten() | 对数组进行降维,返回折叠后的一维数组,不改变原数组 |
#通过将第二个参数设为-1,可以自动计算出第二维度的大小
a = np.random.randn(15).reshape(3,-1)
new_a = a.astype(dtype)
不改变原数组
list = a.tolist()/ list(array)
不改变原数组
索引:根据条件获取特定位置数组
一维数组:跟列表相同
a[[0,1,2]]:同时取多个值a[0],a[1],a[2]
多维数组:a[1,2,5] 每个维度给出一个值
a[[0,1],[1,2]]:同时取出a[0][1]和a[1][2]
一维数组:跟列表相同
多维数组:a[ : , 1, 3]
a[ : , 1:4, : ]
import numpy as np
a = np.random.randint(1, 10, 24).reshape(2,3,4)
#array([[[7, 5, 1, 6],
# [9, 7, 3, 7],
# [8, 7, 8, 2]],
#
# [[7, 6, 2, 8],
# [6, 8, 1, 3],
# [7, 2, 1, 2]]])
a[:, 1, 1]
#array([7, 8])
a[:, 1:3, :]
#array([[[9, 7, 3, 7],
# [8, 7, 8, 2]],
#
# [[6, 8, 1, 3],
# [7, 2, 1, 2]]])
#步长跳跃
a[:, :, ::2]
#array([[[7, 1],
# [9, 3],
# [8, 8]],
#
# [[7, 2],
# [6, 1],
# [7, 1]]])
与标量间的运算:数组中每个元素与其运算
一元函数运算
np.abs(a) np.fabs(a) | 计算数组每个元素绝对值 |
np.sqrt(a) | 计算数组每个元素平方根 |
np.square(a) | 计算数组每个元素平方 |
np.log(a) np.log10(a) np.log2(a) | 计算数组每个元素自然对数,以10为底和以2为底对数 |
np.ceil(a) np.floor(a) | 计算数组每个元素向上取整值,向下取整值 |
np.rint(a) | 计算数组每个元素四舍五入值 |
np.modf(a) | 将数组各元素小数和整数部分以两个独立数组返回 |
np.cos(a) np.cosh(a) np.sin(a) np.sinh(a) np.tan(a) np.tanh(a) | 计算数组每个元素三角函数值 |
np.exp(a) | 计算数组每个元素指数值 |
np.sign(a) | 计算数组每个元素符号函数值即每个元素正负号,1(+),0,-1(-) |
np.isnan(a) | 判断数组元素是否是nan,返回bool数组 |
np.isfinite(), isinf() | 返回哪些元素是有穷的,哪些元素是无穷的(非nan,非inf),或哪些元素是无穷的bool数组 |
/+ - * / ** | 两个数组对应元素进行运算 |
np.dot(a1,a2) | 数组点乘 |
np.floor_divide(a1,a2) | 向下圆整除法(丢弃余数) |
np.maximum(x,y) np.fmax() | 两数组元素级最大值/最小值计算,结果返回浮点数 |
np.mod(x,y) | 元素级模运算 |
np.pow(a1,a2) | a1的a2次方 |
np.copysign(x,y) | 将数组y各元素值的符号赋给数组x |
> < >= <= == != | 两数组各元素比较,产生bool型数组 |
(ndarray_1 == ndarray_2).all() / .any() | all若含有一个False则为false,全为True才为True,any含有一个True则为True,可以判断两个数组是否相等 |
np.array_equal(a1,a2) | 比较两个数组是否相等 |
np.where(condition, [a1, a2])
condition:bool数组 a1,a2:可以是数组也可以是标量
a1,a2为标量时,bool数组中对应值为True取a1,False取a2
a1,a2为数组时,bool数组中对应值为True取a1对应位置的值,False取a2对应位置的值,a1,a2,bool数组长度一致
np.where(condition) :返回true的位置数组,可以找到数组中指定值的位置
np.random.rand(d0, d1, d2, d3, …, dn) | 根据d0~dn生成shape为(d0,d1,…,dn)的随机数数组,[0,1)之间的浮点数,均匀分布 |
np.random.randn(d0, d1, d2, d3, …, dn) | 根据d0~dn生成shape为(d0,d1,…,dn)的随机数数组,服从标准正态分布 |
np.random.randint(low[, high,size]) | 根据size大小即数组长度创建随机整数,或整数组,元素值范围[low, high) |
np.random.seed(s) | 随机数种子,s设定相同,生成的数组相同 |
np.random.shuffle(a) | 根据数组a的第一轴进行随机排列,二维数据即是纵列,改变原数组 |
np.random.permutation(a) | 根据数组a的第一轴产生一个乱序数组,不改变原数组 |
np.random.choice(a[, size, replace, p]) | 以概率p从a中抽取元素,形成size形状新数组,replace表示是否可以选择重复元素,默认为False |
np.random.uniform(low, high, size) | 生成范围[low, high],shape为size的服从均匀分布的数组 |
np.random.binomial(n,p,shape) | 生成(n,p)的,shape为size的服从二项分步的数组 |
np.random.beta(a,b,shape) | 生成beta分步数组 |
np.random.chisquare(df, shape) | 生成卡方分步的数组 |
np.random.gamma(shape,scale,size) | shape:尺度参数,scale:形状参数,size:生成数组shape,gamma分步 |
np.random.normal(loc, scale, size) | 生成loc均值,scale标准差,shape为size的服从正态(高斯)分布的数组 |
np.random.poisson(lam, size) | 生成lam随机事件发生概率,shape为size的服从泊松分布的数组 |
np.std() np.var() np.average()
np.sort(a,axis) | 不会改变原数组a |
a.sort(axis) | 改变原数组a |
np.unique(a) | 统计a中出现的值,返回有序数组 |
np.intersectld(a1,a2) | 统计a1,a2中共有元素,返回有序数组 |
np.unionld(a1,a2) | a1,a2的并集 |
np.inld(a1,a2) | 依次判断a1的每个元素是否在y中存在,返回bool数组 |
np.setdiffld(a1,a2) | 集合a1-a2的差,即是a1中有,a2中无的元素值 |
np.setxorld(a1,a2) | 集合a1,a2的对称差,即是a1,a2不共有元素(只有其中一方有) |
np.sum(a, axis=None) | 根据给定轴计算数组a相关元素的和,axis为整数或元组 |
np.sum(a==1,axis=None) | 根据给定轴计算其中True的个数,可以统计值的个数 |
np.mean(a, axis=None) | 根据给定轴计算数组a相关元素的平均值,axis为整数或元组 |
np.average(a, axis=None, weights=None) | 根据给定轴计算数组a相关元素的加权平均,weights为列表或元组 |
np.std(a, axis=None) | 根据给定轴计算数组a相关元素的标准差 |
np.var(a, axis=None) | 根据给定轴计算数组a相关元素的方差 |
np.max(a) min(a) | 计算数组中元素最大最小值 |
np.argmax(a) np.argmin(a) | 计算数组中最大最小值元素降一维后下标 |
np.unravel_index(index, shape) | 根据shape将一维下标index转换成多维下标 |
np.ptd(a) | 计算数组中最大值与最小值的差 |
np.median(a) | 计算数组a中的中位数 |
np.gradient(f) | 计算数组f中元素的梯度,当f为多维数组时,返回每个维度梯度,第一个由于前面没有元素,故只将后面一个减去第二个除1,最后一个则最后一个减去前一个除1 |
梯度:连续值之间的变化率,即斜率(如连续值a,b,c,则b的梯度为:(c-a)/2
import numpy.linalg as nla
nla.diag(x) | 以一维数组的形式返回方阵对角线元素(或非对角线元素),或将一维数组转换为方阵(非对角线元素为0) |
nla.dot(x,y) | 矩阵乘法 |
np.trace(x) nla.trace(x) | 计算对角线元素的和 |
nla.det(x) | 计算矩阵行列式 |
.eig(x) | 计算方阵的本征值和本征向量 |
.inv(x) | 计算方阵的逆 |
.pinv(x) | 计算矩阵的moore-penrose伪逆 |
.qr(x) | 计算QR分解 |
.svd(x) | 计算奇异值分解(SVD) |
.solve(A,b) | 解线性方程组Ax=b,其中A为一方阵 |
lstsq(A,b) | 计算Ax=b的最小二乘解 |
CSV文件用来批量存储一维,二维数据,每行以逗号分隔元素
将数组存入
np.savetxt(frame, array, fmt=’%.18e’, delimiter=None) 以数组的维度形式写入
将存入的数组读取出来
np.loadtxt(frame, dtype=np.float, delimiter=None,unpack=False) 以存入时数组的维度读取
函数返回一个ndarray数组
数据的存入
a.tofile(frame,seq=‘ ’, format=‘%s’)
数据的读取
a.fromfile(frame,dtype=float, count=-1, seq=‘ ’)
因为数据存入时是逐行存入,故读取时需要知道原来数据的维度,才能还完整原数据
np.save(fname, array)
np.save(fname, array) 存入时其实将数据的基本信息存入(如维度等)
np.load(fname) 返回数组,