目录
1 numpy数组使用
1.1 numpy生成数组
1.2 numpy数组属性
1.3 数组的索引和切片
1.4 numpy数组运算
1.5 随机数
1.6 数组副本和视图
1.7 数组重塑
1.8 数组连接与拆分
1.8.1 数组连接
1.8.2 数组拆分
2 scipy包的使用
2.1 scipy包中的模块
2.2 常数模块的使用
2.3 特殊函数模块的使用
2.4 信号处理模块
2.5 空间结构模块
2.6 优化器
2.6 稀疏矩阵
2.7 图结构
3 pandas包的使用
3.1 pandas数组
3.2 数据表
3.3 查看数据
3.4 pandas读取文件
3.5 数据聚合与分组运算
4 matplotlib包的使用
4.1 二维可视化图像
4.2 一张图中的不同曲线
4.3 三维曲线图
4.4 其他类型曲线
4.5 三维可视化图像
4.5.1 曲面图绘制
4.5.2 曲线图和散点图绘制
4.6 可视化图片(女神)
Python具有强大的数据处理能力,尤以数组处理为主。numpy包是科学计算库,提供N维数组运算及各种数据分析方法;scipy包需要numpy包支持,提供积分、方程组求解等运算;matplotlib包提供数据绘图命令,所绘图像质量较高;pandas包提供机器学习数据格式。
numpy、scipy、matplotlib这3个包通常一起使用,这种组合可用于替代MATLAB软件的功能,构成一个强大的科学计算环境,有助于我们通过Python学习数据科学或机器学习。
首先安装这3种包:
pip install numpy
pip install scipy
pip install matplotlib
numpy官网:http://www.numpy.org/
创建数组的方式有很多种,如可以通过将已有的元组、列表或range对象使用numpy.array()函数转换为数组的方式来生成数组。
numpy.array()函数的语法格式如下:
numpy.array(object,dtype = None,copy = True,order = None,subok = False,ndmin = 0)
#参数说明如下:
#object:表示数组或嵌套的数列;
#dtype:可选参数,表示数组元素的数据类型;
#copy:可选参数,表示对象是否需要复制;
#order:表示创建数组的样式,C为行方向,F为列方向,A为任意方向(默认);
#subok:表示默认返回一个与基类类型一致的数组;
#ndmin:表示指定生成数组的最小维度。
例1.1.1,使用numpy.array()函数将元组、列表或range对象转换成数组:
import numpy as np #导入numpy模块,并用np代替
a = (1,2,3,4,5)
b = [1,2,3,4,5]
c = [[1,2,3],[4,5,6]]
print(np.array(a)) #将元组转换成数组
print(np.array(b)) #将列表转换成数组
print(np.array(c)) #将列表转换成数组
print(np.array(range(5))) #将range对象转换成数组
运行结果如下:
[1 2 3 4 5]
[1 2 3 4 5]
[[1 2 3]
[4 5 6]]
[0 1 2 3 4]
我们还可以使用numpy.asarray()函数来创建数组。
numpy.asarray()函数的语法格式如下:
numpy.asarray(a,dtype = None,order = None)
#参数说明如下:
#a:表示数组或嵌套的数列;
#dtype:可选参数,表示数组元素的数据类型;
#order:表示创建数组的样式,C为行方向,F为列方向,A为任意方向(默认)。
例1.1.2,使用numpy.asarray()函数将元组、列表或range对象转换成数组:
import numpy as np #导入numpy模块,并用np代替
a = (1,2,3,4,5)
b = [1,2,3,4,5]
c = [[1,2,3],[4,5,6]]
print(np.asarray(a)) #将元组转换成数组
print(np.asarray(b)) #将列表转换成数组
print(np.asarray(c)) #将列表转换成数组
print(np.asarray(range(5))) #将range对象转换成数组
运行结果如下:
[1 2 3 4 5]
[1 2 3 4 5]
[[1 2 3]
[4 5 6]]
[0 1 2 3 4]
通过观察例1.1.1和例1.1.2我们发现,numpy.array()函数和numpy.asarray()函数好像没有什么区别,下面我们通过一个例子来理解两者之间的区别。
例1.1.3,numpy.array()函数和numpy.asarray()函数的不同:
import numpy as np #导入numpy模块,并用np代替
A = np.ones((3,3))
print(A)
B = np.array(A)
print(B)
C = np.asarray(A)
print(C)
A[0] = 0
print('修改后的A:\n',A)
print('修改后的B:\n',B)
print('修改后的C:\n',C)
运行结果如下:
[[1. 1. 1.]
[1. 1. 1.]
[1. 1. 1.]]
[[1. 1. 1.]
[1. 1. 1.]
[1. 1. 1.]]
[[1. 1. 1.]
[1. 1. 1.]
[1. 1. 1.]]
修改后的A:
[[0. 0. 0.]
[1. 1. 1.]
[1. 1. 1.]]
修改后的B:
[[1. 1. 1.]
[1. 1. 1.]
[1. 1. 1.]]
修改后的C:
[[0. 0. 0.]
[1. 1. 1.]
[1. 1. 1.]]
可以发现,当修改了A数组中的第一行元素后,再分别输出A、B、C数组,其中B和C数组的结果并不是完全相同的。这是因为numpy.array()函数和numpy.asarray()函数都可以将结构数据转化为ndarray,但是当数据源是ndarray时,numpy.array()函数仍然会复制出一个副本,占用新的内存,而numpy.asarray()函数不会。
还可以通过其他方式生成数组,如numpy.zeros()函数、numpy.ones()函数、numpy.identity()函数、numpy.empty()函数、numpy.linspace()函数等。
numpy.zeros()函数用于生成一个元素全为0的数组。
numpy.zeros()函数语法格式如下:
numpy.zeros(shape,dtype = float,order = 'C')
numpy.ones()函数用于生成一个元素全为1的数组。
numpy.ones()函数语法格式如下:
numpy.ones(shape,dtype = None,order = 'C')
numpy.empty()函数用于创建一个指定形状(shape)、数据类型(dtype)且未初始化的数组。
numpy.empty()函数语法格式如下:
numpy.empty(shape,dtype = float,order = 'C')
以上3种方式中,参数shape指定数组形状,即几行几列的数组;dtype指定数据类型;order指定在计算机内存中存储元素的顺序,C为行优先,F为列优先,默认为C。
numpy.identity()函数用于生成一个单位矩阵。
numpy.identity()函数语法格式如下:
numpy.identity(n,dtype = None)
其中,n为生成单位矩阵的维数。
numpy.linspace()函数用于创建一个一维数组,元素由等差数列构成。
numpy.linspace()函数语法格式如下:
numpy.linspace(start,stop,num=50,endpoint=True,retstep=False,dtype = None)
#参数说明如下:
#start:表示数列的第一个值;
#stop:表示数列的最后一个值;
#num:表示生成等步长数列的个数,默认为50;
#endpoint:表示值为True时,数列包含stop,否则不包含,默认为True;
#retstep:表示值为True时,生成数组中显示间距,否则不显示;
#dtype:表示ndarray的数据类型。
例1.1.4,对以上函数的简单应用:
import numpy #导入numpy模块
a = numpy.zeros((3,3)) #生成3行3列元素全为0的矩阵
b = numpy.ones((3,1)) #生成元素全为1的数组
c = numpy.identity(4) #生成单位矩阵
d = numpy.empty((3,3)) #生成3行3列的空矩阵,元素值随机生成
e = numpy.linspace(0,6,7) #生成一个数组,各个元素在0、6之间等分
print('numpy.zeros((3,3)):\n',a)
print('numpy.ones((3,1)):\n',b)
print('numpy.identity(4):\n',c)
print('numpy.empty((3,3)):\n',d)
print('numpy.linspace(0,6,7):\n',e)
运行结果如下:
numpy.zeros((3,3)):
[[0. 0. 0.]
[0. 0. 0.]
[0. 0. 0.]]
numpy.ones((3,1)):
[[1.]
[1.]
[1.]]
numpy.identity(4):
[[1. 0. 0. 0.]
[0. 1. 0. 0.]
[0. 0. 1. 0.]
[0. 0. 0. 1.]]
numpy.empty((3,3)):
[[0.00000000e+000 0.00000000e+000 0.00000000e+000]
[0.00000000e+000 0.00000000e+000 2.52961611e-321]
[8.34445137e-308 2.14321575e-312 9.28366228e-312]]
numpy.linspace(0,6,7):
[0. 1. 2. 3. 4. 5. 6.]
属性 | 说明 |
ndarray.ndim | 矩阵的秩,表维度的数量 |
ndarray.shape | 数组的维度,对于矩阵,n行m列 |
ndarray.size | 数组元素的总个数,相当于.shape中n*m的值 |
ndarray.dtype | ndarray对象的元素类型 |
ndarray.itemsize | ndarray对象中每个元素的大小,以字节为单位 |
ndarray.flags | ndarray对象的内存信息 |
ndarray.real | ndarray对象的实部 |
ndarray.imag | ndarray对象的虚部 |
ndarray.data | 包含实际数组元素的缓冲区,由于一般通过数组的索引获取元素,所以通常不需要使用这个属性 |
例1.2.1,numpy数组属性的使用:
import numpy as np #导入numpy模块,并用np代替
A = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
print('矩阵的秩:',A.ndim) #求矩阵的秩
print('矩阵的行数和列数:',A.shape) #求矩阵的行数和列数
print('矩阵A:',A)
A.shape = (4,3) #ndarray.shape还可以用来调整数组的大小
print('调整后的矩阵A:',A)
print('元素的类型:',A.dtype) #求元素的类型
运行结果如下:
矩阵的秩: 2
矩阵的行数和列数: (3, 4)
矩阵A: [[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
调整后的矩阵A: [[ 1 2 3]
[ 4 5 6]
[ 7 8 9]
[10 11 12]]
元素的类型: int32
通过对数组的索引和切片操作来实现对数组内容的访问和修改。对于一维数组来说,可以通过从0~n的下标进行索引,通