numpy基本操作

什么是NumPy

NumPy是Python用于科学计算的基础库,重在数值计算,也是大部分Python科学计算库的基础库,多用于在大型、多维数组上执行数值计算。

NumPy常见的数据类型

类型类型代码说明
int8、uint8i1、u1有符号和无符号的8位(1个字节)整型
int16、uint16i2、u2有符号和无符号的16位(2个字节)整型
int32、uint32i4、u4有符号和无符号的32位(4个字节)整型
int64、uint64i8、u8有符号和无符号的64位(8个字节)整型
float16f2半精度浮点数
float32f4或f标准的单精度浮点数。与c的float兼容
float64f8或d标准的双精度浮点数。与c的double和Python的float对象兼容
float128f16或g扩展精度浮点数
complex64、complex128c8、c16分别用俩个32位、64或128位浮点数表示的
complex256c32复数
bool?存储True和False值得布尔类型

NumPy常见的操作

数组相关操作
  • 创建数组
import numpy as np  
a = np.array([1,2,3,4])  
b = np.array(range(1,5))  
c = np.arange(1,5)

a,b,c结果一样,注意arange和range的区别
np.arange的用法:arrange(start, stop, dtype=None )

  • 数据的类型操作
a=np.array([1,0,1,0,1],dtype=np.bool) #指定创建的数组的数据类型
a.astyep(np.int8) #修改数组的数据类型
np.round(c,3) #修改浮点型的小数位数
  • 数组的形状
In [1]:import numpy as np
In [10]:a=np.array([[1,2,3,4],[5,6,7,8]])
In [11]:a
Out[11]:array([[1, 2, 3, 4],
      		   [5, 6, 7, 8]])
In [12]:a.shape #查看形状
Out[12]:(2, 4)
In [13]:a.reshape(4,2) #转换成四行俩列
Out[13]:array([[1, 2],
		       [3, 4],
		       [5, 6],
		       [7, 8]])
In [14]:a.shape
Out[14]:(2, 4)
In [15]:a.reshape(1,8) #转换一行八列
Out[15]:array([[1, 2, 3, 4, 5, 6, 7, 8]])
In [16]:a.flatten()
Out[16]:array([1, 2, 3, 4, 5, 6, 7, 8])
In [17]:a #注意a并没有发生改变
Out[17]:array([[1, 2, 3, 4],
       			[5, 6, 7, 8]])
  • 数组计算
In [1]:import numpy as np
In [2]:a = np.array([[1,2,3,4],[5,6,7,8]])
In [3]:a
Out[3]:array([[1, 2, 3, 4],
       		  [5, 6, 7, 8]])
In [4]:b = np.array([[9,10,11,12],[13,14,15,16]])
In [5]:b
Out[5]:array([[ 9, 10, 11, 12],
      		  [13, 14, 15, 16]])
In [6]:a+b #与相同位置的相加
Out[6]:array([[10, 12, 14, 16],
              [18, 20, 22, 24]])
In [7]:a*b #与相同位置的相乘
Out[7]:array([[  9,  20,  33,  48],
      	      [ 65,  84, 105, 128]])
  • 广播原则

如果两个数组的后缘维度(即:从末尾开始算起的维度)的轴长相符或其中一方的长度为1,则认为它们是广播兼容的,广播会在缺失和(或)长度为1的轴上进行

简单的理解就是数组拥有相同的相同的形状,当前维度的值相等,当前维度的值有一个是1

In [1]:import numpy as np
In [3]:a = np.array([1,2,3,4]) #shape为(4,)
In [4]:b = np.array([2]) #shape为(1,)
In [5]:a+b
Out[5]:array([3, 4, 5, 6]) 
In [6]:c = np.array([[1],[2],[3]]) #shape为(3,1)
In [7]:a+c
Out[7]:array([[2, 3, 4, 5],
       [3, 4, 5, 6],
       [4, 5, 6, 7]])
In [8]:d = np.array([[1,2,3,4],[4,5,6,8]]) #shape为(2,4)
In [9]:a+d
Out[9]:array([[ 2,  4,  6,  8],
       		 [ 5,  7,  9, 12]])
  • 转置

转置就是在对角线方向交换数据,目的是为了更方便的处理数据

In [15]:f = np.array([[0,1,2,3,4],[5,6,7,8,9],[10,11,12,13,14]])
In [16]:f
Out[16]:array([[ 0,  1,  2,  3,  4],
      		   [ 5,  6,  7,  8,  9],
      		   [10, 11, 12, 13, 14]])
In [17]:f.transpose()
Out[17]:array([[ 0,  5, 10],
       		   [ 1,  6, 11],
      		   [ 2,  7, 12],
      		   [ 3,  8, 13],
      		   [ 4,  9, 14]])
In [20]:f.swapaxes(1,0)
Out[20]:array([[ 0,  5, 10],
		       [ 1,  6, 11],
		       [ 2,  7, 12],
		       [ 3,  8, 13],
		       [ 4,  9, 14]])
In [22]:f.T
Out[22]:array([[ 0,  5, 10],
		       [ 1,  6, 11],
		       [ 2,  7, 12],
		       [ 3,  8, 13],
		       [ 4,  9, 14]])
数据的读取
  • CSV文件:Comma-Separated Values,中文叫,逗号分隔值或者字符分割值,其文件以纯文本的形式存储表格数据。换行和逗号分隔行列的格式化文本,每一行表示一条数据。
  • numpy读取文件参数设置
    • fame:文件的名称
    • dtype:数据类型,默认是float
    • delemiter:分隔符字符串,默认情况是是任何空格,改为逗号
    • skiprows:跳过前x行
    • usecols:读取指定的列,可以是元组
    • unpack:如果是True, 对返回的数组对象转置
data = np.loadtxt(fname=fname, dtype=dtype, skiprows=1, usecols=(1, 2), unpack=True) 
索引和切片

操作跟python列表操作差不多

In [23]:f
Out[23]:array([[ 0,  1,  2,  3,  4],
		       [ 5,  6,  7,  8,  9],
		       [10, 11, 12, 13, 14]])
In [25]:f[1] #取一行
Out[25]:array([5, 6, 7, 8, 9])
In [26]:f[:,2] #取一列
Out[26]:array([ 2,  7, 12])
In [71]:f[0:2] #取多行 取0到1行,不包含2行
Out[71]:array([[0, 1, 2, 3, 4],
		       [5, 6, 7, 8, 9]])
In [72]:f[:,1:4] #取多列 取1到43列,不包含4列
Out[72]:array([[ 1,  2,  3],
		       [ 6,  7,  8],
		       [11, 12, 13]])
数值的修改
In [74]:t = np.arange(30).reshape((5,6))
In [75]:t<15 #利用布尔索引判断
Out[75]:array([[ True,  True,  True,  True,  True,  True],
		       [ True,  True,  True,  True,  True,  True],
		       [ True,  True,  True, False, False, False],
		       [False, False, False, False, False, False],
		       [False, False, False, False, False, False]])
In [76]:t[t<15]=0 #修改值
In [77]:t
Out[77]:array([[ 0,  0,  0,  0,  0,  0],
		       [ 0,  0,  0,  0,  0,  0],
		       [ 0,  0,  0, 15, 16, 17],
		       [18, 19, 20, 21, 22, 23],
		       [24, 25, 26, 27, 28, 29]])
In [78]:m = np.arange(30).reshape((5,6))
In [79]:m
Out[79]:array([[ 0,  1,  2,  3,  4,  5],
		       [ 6,  7,  8,  9, 10, 11],
		       [12, 13, 14, 15, 16, 17],
		       [18, 19, 20, 21, 22, 23],
		       [24, 25, 26, 27, 28, 29]])
In [80]:np.where(t<15,0,30) #三元运算符
Out[80]:array([[ 0,  0,  0,  0,  0,  0],
		       [ 0,  0,  0,  0,  0,  0],
		       [ 0,  0,  0, 30, 30, 30],
		       [30, 30, 30, 30, 30, 30],
		       [30, 30, 30, 30, 30, 30]])
In [81]:n = np.arange(30).reshape((5,6))
In [82]:n.clip(10,20) #裁剪,小于x的为x,大于y的为y
Out[82]:array([[10, 10, 10, 10, 10, 10],
		       [10, 10, 10, 10, 10, 11],
		       [12, 13, 14, 15, 16, 17],
		       [18, 19, 20, 20, 20, 20],
		       [20, 20, 20, 20, 20, 20]])
数组拼接
In [3]:t1 = np.array([[0,1,2,3],[4,5,6,7]])
In [4]:t2 = np.array([[8,9,10,11],[12,13,14,15]])
In [5]:np.vstack((t1,t2)) #竖直拼接
Out[5]:array([[ 0,  1,  2,  3],
		      [ 4,  5,  6,  7],
		      [ 8,  9, 10, 11],
		      [12, 13, 14, 15]])
In [6]:np.hstack((t1,t2)) #水平拼接
Out[6]:array([[ 0,  1,  2,  3,  8,  9, 10, 11],
       		  [ 4,  5,  6,  7, 12, 13, 14, 15]])
数组行列交换
In [7]:t = np.arange(0,24).reshape(4,6)
In [8]:t
Out[8]:array([[ 0,  1,  2,  3,  4,  5],
		      [ 6,  7,  8,  9, 10, 11],
		      [12, 13, 14, 15, 16, 17],
		      [18, 19, 20, 21, 22, 23]])
In [9]:t[[1,2],:] = t[[2,1],:]  #行交换
In [10]:t
Out[10]:array([[ 0,  1,  2,  3,  4,  5],
		       [12, 13, 14, 15, 16, 17],
		       [ 6,  7,  8,  9, 10, 11],
		       [18, 19, 20, 21, 22, 23]])
In [11]:t[:,[1,2]] = t[:,[2,1]]  #列交换
In [12]:t
Out[12]:array([[ 0,  2,  1,  3,  4,  5],
		       [12, 14, 13, 15, 16, 17],
		       [ 6,  8,  7,  9, 10, 11],
		       [18, 20, 19, 21, 22, 23]])
nan和inf

读取文件为float的时候,出现数据丢失的话会为nan
如果数据计算出现问题的话会出现inf,inf表示正无穷大,-inf表示负无穷大

In [83]:a = np.inf #指定一个inf
In [84]:type(a)
Out[84]:float
In [85]:a = np.nan #指定一个nan
In [86]:type(a)
Out[86]:float
In [88]:np.nan == np.nan
Out[88]:False
In [89]:np.nan != np.nan
Out[89]:True
In [93]:t = np.array([0,1,2,a,a])
In [94]:t
Out[94]:array([ 0.,  1.,  2., nan, nan])
In [95]:np.count_nonzero(t!=t) #利用nan的性质
Out[95]:2
In [96]:t[np.isnan(t)]=0 #判断nan,数据缺失的话看情况使用平均值之类的统计函数
In [97]:t
Out[97]:array([0., 1., 2., 0., 0.])
常用的统计函数
  • 求和:t.sum(axis=None)
  • 均值:t.mean(a,axis=None)
  • 中值: np.median(t,axis=None)
  • 最大值: t.max(axis=None)
  • 最小值: t.min(axis=None)
  • 极差: np.ptp(t,axis=None)
  • 标准差: t.std(axis=None)

默认返回多维数组的全部的统计结果,如果指定axis,则返回一个当前轴上的结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值