NumPy 的全称为 Numeric Python,它是 Python 的第三方扩展包,主要用来计算、处理一维或多维数组。
一、前言
步入8月了,7月时因为项目所需,自学了深度学习相关的内容,现在已经把项目所需要的神经网络框架搭建起来了,输入输出也都归一化了,模拟误差也加上了,图像的参数提取和数据拟合也都做完了。开个新坑——
本系列(《基于Python的数据分析大全》)是拜读了DataCamp撰写的 《Learn Python for Data Science Interactively》 (我个人把它译为《交互式学习 Python 数据科学》)有感而发,结合个人的理解编写的数据分析经验总结,旨在作为一本字典和速查手册,解决在数据分析时可能遇到的问题的实现思路和解决方法。
本文介绍的是 Numpy基础知识,全文皆用Python实现。所用代码上机调试都能运行,如果发现有问题请私信我并附上报错信息。
二、Numpy
Numpy 是 Python 数据科学计算和数据分析相关工作的核心库,提供了高性能的多维数组对象及处理数组的工具。
我们可以使用以下语句导入 Numpy 库:
import numpy as np
Numpy数组
二、创建数组
>>> a = np.array([1,2,3]) >>> b = np.array([(1.5,2,3), (4,5,6)], dtype = float) >>> c = np.array([[(1.5,2,3), (4,5,6)], [(3,2,1), (4,5,6)]], dtype = float)
初始化占位符
以下介绍初始化占位符,主要包括:创建值为0数组、创建值为1数组、创建均匀间隔的数组(步进值)、创建均匀间隔的数组(样本数)、创建常数数组、创建2x2单位矩阵、创建随机值的数组和创建空数组的相关代码实现。
>>> np.zeros((3,4)) # 创建值为0数组 >>> np.ones((2,3,4),dtype=np.int16) # 创建值为1数组 >>> d = np.arange(10,25,5) # 创建均匀间隔的数组(步进值) >>> np.linspace(0,2,9) # 创建均匀间隔的数组(样本数) >>> e = np.full((2,2),7) # 创建常数数组 >>> f = np.eye(2) # 创建2x2单位矩阵 >>> np.random.random((2,2)) # 创建随机值的数组 >>> np.empty((3,2)) # 创建空数组
三、输入、输出
3.1 保存与载入文本文件
>>> np.loadtxt("myfile.txt") >>> np.genfromtxt("my_file.csv", delimiter=',') >>> np.savetxt("myarray.txt", a, delimiter=" ")
3.2 保存与载入磁盘上的文件
>>> np.save('my_array', a) >>> np.savez('array.npz', a, b) >>> np.load('my_array.npy')
四、数据类型
以下介绍数据类型,包括:带符号的64位整数、标准双精度浮点数、显示为128位浮点数的复数、布尔值:True值和False值、Python对象、固定长度字符串、固定长度Unicode。
>>> np.int64 # 带符号的64位整数 >>> np.float32 # 标准双精度浮点数 >>> np.complex #显示为128位浮点数的复数 >>> np.bool # 布尔值:True值和False值 >>> np.object # Python对象 >>> np.string_ # 固定长度字符串 >>> np.unicode_ # 固定长度Unicode
五、数组信息
以下介绍数组信息的查看方法代码实现,包括:数组形状、几行几列、数组长度、几维数组、数组有多少元素、数据类型、数据类型的名字、数据类型转换。
>>> a.shape # 数组形状,几行几列 >>> len(a) # 数组长度 >>> b.ndim # 几维数组 >>> e.size # 数组有多少元素 >>> b.dtype # 数据类型 >>> b.dtype.name # 数据类型的名字 >>> b.astype(int) # 数据类型转换
六、调用帮助
>>> np.info(np.ndarray.dtype)
七、数组计算
7.1 算数运算
以下介绍算数运算相关操作,主要包括:减法、减法另解、加法、加法、除法、除法、乘法、乘法另解、幂、平方根、正弦、余弦、自然对数、点积。
# 减法 >>> g = a - b array([[-0.5, 0. , 0. ],[-3. , -3. , -3. ]]) # 减法 >>> np.subtract(a,b) # 加法 >>> b + a array([[ 2.5, 4. , 6. ],[ 5. , 7. , 9. ]]) >>> np.add(b,a) # 加法 # 除法 >>> a / b array([[ 0.66666667, 1. , 1. ],[ 0.25 , 0.4 , 0.5 ]]) >>> np.divide(a,b) # 除法 # 乘法 >>> a * b array([[ 1.5, 4. , 9. ],[ 4. , 10. , 18. ]]) >>> np.multiply(a,b) # 乘法 # 幂 >>> np.exp(b) # 平方根 >>> np.sqrt(b) # 正弦 >>> np.sin(a) # 余弦 >>> np.cos(b) # 自然对数 >>> np.log(a) # 点积 e.dot(f) array([[ 7., 7.],[ 7., 7.]])
7.2 比较
以下介绍比较的相关代码实现,主要包括:对比值、对比值另解、对比数组。
# 对比值 >>> a == b array([[False, True, True],[False, False, False]], dtype=bool) # 对比值 >>> a < 2 array([True, False, False], dtype=bool) # 对比数组 >>> np.array_equal(a, b)
7.3 聚集函数
以下介绍聚集函数的相关代码实现,主要包括:数组汇总、数组最小值、数组最大值(按行操作)、数组元素的累加值、平均数、中位数、相关系数、标准差。
>>> a.sum() # 数组汇总 >>> a.min() # 数组最小值 >>> b.max(axis=0) # 数组最大值,按行 >>> b.cumsum(axis=1) # 数组元素的累加值 >>> a.mean() # 平均数 >>> b.median() # 中位数 >>> a.corrcoef() # 相关系数 >>> np.std(b) # 标准差
八、数组复制
以下介绍数组复制的相关代码实现,主要包括:使用同一数据创建数组视图、创建数组的副本、创建数组的深度拷贝。
>>> h = a.view() # 使用同一数据创建数组视图 >>> np.copy(a) # 创建数组的副本 >>> h = a.copy() # 创建数组的深度拷贝
九、数组排序
以下介绍数组排序的相关操作,主要包括:数组排序、以轴为依据对数组排序。
>>> a.sort() # 数组排序 >>> c.sort(axis=0) # 以轴为依据对数组排序
十、子集、切片、索引相关实现
10.1 子集
选择索引2对应的值:
>>> a[2] 3
选择行1列2对应的值(等同于b[1][2]):
>>> b[1,2] >6.0
10.2 切片
选择索引为0与1对应的值:
>>> a[0:2] array([1, 2])
选择第1列中第0行、第1行的值:
>>> b[0:2,1] array([ 2., 5.])
选择第0行的所有值(等同于b[0:1,:1]:
>>> b[:1] array([[1.5, 2., 3.]])
等同于 [1,:,:]:
>>> c[1,...] array([[[ 3., 2., 1.],[ 4., 5., 6.]]])
反转数组a:
>>> a[ : :-1] array([3, 2, 1])
10.3 条件索引
选择数组a中所有小于2的值:
>>> a[a<2] array([1])
10.4 花式索引
选择(1,0),(0,1),(1,2) 和(0,0)所对应的值:
>>> b[[1, 0, 1, 0],[0, 1, 2, 0]] array([ 4. , 2. , 6. , 1.5])
选择矩阵的行列子集:
>>> b[[1, 0, 1, 0]][:,[0,1,2,0]] array([[4.,5.,6.,4.],[1.5,2.,3.,1.5],[4.,5.,6.,4.] ,[1.5,2.,3.1.5]])
十一、数组操作
11.1 转置数组
>>> i = np.transpose(b) # 转置数组 >>> i.T # 转置数组
11.2 改变数组形状
以下介绍改变数组形状的相关代码操作,主要包括:数组排序、以轴为依据对数组排序。
>>> b.ravel() # 拉平数组 >>> g.reshape(3,-2) # 改变数组形状,但不改变数据
11.3 添加或删除值
以下介绍添加或删除值的相关代码操作,主要包括:返回形状为(2,6)的新数组、追加数据、插入数据、删除数据。
>>> h.resize((2,6)) # 返回形状为(2,6)的新数组 >>> np.append(h,g) # 追加数据 >>> np.insert(a, 1, 5) # 插入数据 >>> np.delete(a,[1]) # 删除数据
11.4 合并数组
以下介绍合并数组的相关代码实现,主要包括:拼接数组、纵向以行的维度堆叠数组、纵向以行的维度堆叠数组、横向以列的维度堆叠数组、以列的维度创建堆叠数组。
# 拼接数组 >>> np.concatenate((a,d),axis=0) array([ 1, 2, 3, 10, 15, 20]) # 纵向以行的维度堆叠数组 >>> np.vstack((a,b)) array([[ 1. , 2. , 3. ],[ 1.5, 2. , 3. ],[ 4. , 5. , 6. ]]) # 纵向以行的维度堆叠数组 >>> np.r_[e,f] # 横向以列的维度堆叠数组 >>> np.hstack((e,f)) array([[ 7., 7., 1., 0.],[ 7., 7., 0., 1.]]) # 以列的维度创建堆叠数组 >>> np.column_stack((a,d)) array([[ 1, 10],[ 2, 15],[ 3, 20]]) # 以列的维度创建堆叠数组 >>> np.c_[a,d]
11.5 分割数组
以下介绍分割数组的相关代码实现举例,主要包括:纵向分割数组为3等份和横向分割数组为2等份。
# 纵向分割数组为3等份 >>> np.hsplit(a,3) [array([1]),array([2]),array([3])] # 横向分割数组为2等份 >>> np.vsplit(c,2) [array([[[ 1.5, 2. , 1. ],[ 4. , 5. , 6. ]]]), array([[[ 3., 2., 3.],[ 4., 5., 6.]]])]