什么是NumPy
NumPy是Python用于科学计算的基础库,重在数值计算,也是大部分Python科学计算库的基础库,多用于在大型、多维数组上执行数值计算。
NumPy常见的数据类型
类型 | 类型代码 | 说明 |
---|---|---|
int8、uint8 | i1、u1 | 有符号和无符号的8位(1个字节)整型 |
int16、uint16 | i2、u2 | 有符号和无符号的16位(2个字节)整型 |
int32、uint32 | i4、u4 | 有符号和无符号的32位(4个字节)整型 |
int64、uint64 | i8、u8 | 有符号和无符号的64位(8个字节)整型 |
float16 | f2 | 半精度浮点数 |
float32 | f4或f | 标准的单精度浮点数。与c的float兼容 |
float64 | f8或d | 标准的双精度浮点数。与c的double和Python的float对象兼容 |
float128 | f16或g | 扩展精度浮点数 |
complex64、complex128 | c8、c16 | 分别用俩个32位、64或128位浮点数表示的 |
complex256 | c32 | 复数 |
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,则返回一个当前轴上的结果