Numpy基本用法

文章目录

    • Numpy
      • 引言:数据的基本概念
      • N维数组对象(***ndarray***
      • ndarray数组创建
      • ndarray数组维度变换
      • ndarray数组元素类型变换以及数组转变为列表
      • ndarray数组操作
        • 切片:获取数组元素子集
        • ndarray运算
        • where函数
    • numpy的random库
    • numpy统计函数
      • numpy的linalg(linear algebra)库(线性代数库)
    • 数据的CSV文件存取
      • 一维,二维数据的存取
      • 任意维度数据存取
      • 便捷文件存取

Numpy

numpy是一个开源的python科学计算基础库:
------ 一个强大的N维数组对象ndarray
------ 广播功能函数
------ 整合c/c++/Fortran代码的工具
------ 线性代数,傅里叶变换,随机数生成等功能

引言:数据的基本概念

维度:一组数据的组织形式
一维数据:由对等关系的有序或无序数据构成,采用线性方式组织(相当于python中的列表,数组,集合等)
列表和数组区别:
------列表中的元素类型可以不同,但数组元素类型必须一致
二维数据:由多个一维数据组成,是一维数据的组合形式(如嵌套列表)
多维数据:由一维或二维数据在新维度上扩展形成(多层嵌套列表)
高维数据:仅利用最基本的二元关系展示数据之间的复杂结构(字典,数据表示格式(json,xml))
Numpy基本用法_第1张图片

N维数组对象(ndarray

优点
---- 数组对象可以使一维以及多维数据像单个数据一样看待
---- 多种数据类型,可以适当选择,合理使用空间,还可以提升计算速度(底层通过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位浮点数的复数)

ndarray数组创建

函数中的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[ : , :]

ndarray数组维度变换

a.T 数组转置
.reshape(shape) 不改变原数组,返回一个shape形状数组
.resize(shape) 与reshape功能一样,但改变原数组
.swapaxes(ax1,ax2) 将两个数组维度进行交换
.flatten() 对数组进行降维,返回折叠后的一维数组,不改变原数组
  • reshape与resize中的shape最好使用元组
#通过将第二个参数设为-1,可以自动计算出第二维度的大小
a = np.random.randn(15).reshape(3,-1)

ndarray数组元素类型变换以及数组转变为列表

new_a = a.astype(dtype)
不改变原数组
list = a.tolist()/ list(array)
不改变原数组

ndarray数组操作

  • 索引:根据条件获取特定位置数组
    一维数组:跟列表相同

      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]]])        

ndarray运算

  • 与标量间的运算:数组中每个元素与其运算

  • 一元函数运算

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) 比较两个数组是否相等

where函数

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的位置数组,可以找到数组中指定值的位置

numpy的random库

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的服从泊松分布的数组

numpy统计函数

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

numpy的linalg(linear algebra)库(线性代数库)

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文件存取

CSV文件用来批量存储一维,二维数据,每行以逗号分隔元素

一维,二维数据的存取

将数组存入
np.savetxt(frame, array, fmt=’%.18e’, delimiter=None) 以数组的维度形式写入

  • frame :文件,字符串或生产器,可以是 .gz 或 .bz2 的压缩文件
  • array :存入文件的数组
  • fmt:写入文件的格式,如:%d,%.2f,%.18e
  • delimiter:分隔字符串,默认是任何空格

将存入的数组读取出来
np.loadtxt(frame, dtype=np.float, delimiter=None,unpack=False) 以存入时数组的维度读取
函数返回一个ndarray数组

  • frame :文件,字符串或生产器,可以是 .gz 或 .bz2 的压缩文件
  • dtype :数据类型,可选
  • delimiter:分隔字符串,默认是任何空格
  • unpack :如果True,读入属性将分别写入不同变量

任意维度数据存取

数据的存入
a.tofile(frame,seq=‘ ’, format=‘%s’)

  • frame:文件,字符串
  • seq:数据分隔字符串,如果是空串,写入文件为二进制
  • format:写入数据格式

数据的读取
a.fromfile(frame,dtype=float, count=-1, seq=‘ ’)

  • frame:文件,字符串
  • dtype:读取的数据类型
  • count:读入元素个数,-1表示读取整个文件
  • seq:数据分隔字符串,如果是空串,表示写入时将文件写为二进制

因为数据存入时是逐行存入,故读取时需要知道原来数据的维度,才能还完整原数据

便捷文件存取

np.save(fname, array)
np.save(fname, array) 存入时其实将数据的基本信息存入(如维度等)

  • fname:文件名,以==.npy为扩展名,压缩扩展名为.npz==
  • array:数组变量

np.load(fname) 返回数组,

  • fname:文件名,以==.npy为扩展名,压缩扩展名为.npz==

你可能感兴趣的:(python学习)