Python基础知识
一、何为Python
Python是一种解释型、面向对象、动态数据类型的高级程序设计语言。它拥有高效的高级数据结构,并且能够用简单而又高效的方式进行面向程序编程。
二、Python的优缺点
1. Python的优点
- 简单易学
- 速度快:Python的底层是用C语言写的,很多标准库和第三方库也都是用C语言写的,运行速度非常快。
- 免费开源
- 高层语言:用Python语言编写程序时无需考虑诸如如何管理程序使用的内存一类的底层细节。
- 可移植性
- 解释性
Python语言写的程序不需要编译成二进制代码,可以直接从源代码运行程序。在计算机内部,Python解释器把源代码转换成称为字节码的中间形式,然后再把它翻译成计算机使用的机器语言并运行。这使得使用Python更加简单,也使得Python程序更加易于移植。
- 面向对象:Python既支持面向过程的编程,也支持面向对象的编程。在“面向过程”的语言中,程序是由过程或仅仅是可重用代码的函数构建起来的。在“面向对象”的语言中,程序是由数据和功能组合而成的对象构建起来的。
- 可扩展性
- 可嵌入性
- 丰富的库
- 规范的代码:Python采用强制缩进的方式使得代码具有较好的可读性。
2. Python的缺点
- 单行语句和命令行输出问题:Python必须将程序写入一个.py文件,且不能将程序连写成一行。
- 独特的语法:采用缩进来区分语句关系
- 运行速度慢:与C和C++相比
三、Python编程示例
# Fibonacci series:斐波那契数列
# 两个元素的总和确定了下一个数
a, b = 0, 1 # 复合赋值,变量a和b同时得到新值0和1
while b < 1000:
print(b,end=',') # 关键字end可以用于将结果输出到同一行,或者在输出的末尾添加不同的字符
a, b = b, a + b
'''
a, b = b, a + b的计算方式为先计算右边表达式,然后同时赋值给左边,等价于
n = b
m = a + b
a = n
b = m
右边的表达式会在赋值变动之前执行,右边表达式的执行顺序是从左往右的。
'''
运行结果为:
1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,
四、Python的一些常用库
应用Python实现机器学习需要安装一些相关的开源软件库,通过它们,可以直接引用某些函数来进行相关操作,而不用每一步都得自己编程或者构造函数去实现。例如科学计算包NumPy
、数据分析工具Pandas
、数值计算包Scipy
、绘图工具库Matplotlib
、机器学习包Scikit-learn
等,涵盖了数据导入、整理、数据处理、可视化、数值计算以及算法运行等方面,只需要直接引入这些程序库就可以实现一些基本过程。
Anaconda
是Python的一个集成管理工具或系统,它把Python做相关数据计算与分析所需要的包都集成在了一起。
NumPy函数库
NumPy是Python科学计算的基础包,它专为进行严格的数字处理而产生,尤其是在向量和矩阵运算中使用。由于Python没有提供数组的数据结构形式,虽然列表(list)可以完成数组,但不是真正的数据,当数据量增大时,它的速度很慢且容易出错。因此,NumPy扩展包提供了数组支持,同时很多高级扩展包依赖它。
NumPy的核心是数组(Arrays),具体来说是多维数组。NumPy就是对这些数组进行创建、删除、运算等操作的一个程序包。
NumPy的一些基本操作
- 导入Numpy库
import numpy as np # 方式1:导入NumPy库,且为了方便将其简化为np
from numpy import * # 方式2:将NumPy函数库中的所有模块引入当前的命令空间
'''
两种方式的区别在于:
方式1 在调用NumPy库中的函数时必须采用np. 的格式;
而方式2 可直接用函数名调用
'''
例如:转置操作
from numpy import *
x = [[1, 2], [3, 4]]
print(transpose(x))
# 等价于
import numpy as np
x = [[1, 2], [3, 4]]
print(np.transpose(x))
- np.array:创建数组
import numpy as np
x = [[1, 2],
[3, 4]]
y = np.array([[1, 2], [3, 4]])
print('x = ', x)
print('y = ', y)
输出结果为:
x = [[1, 2], [3, 4]]
y = [[1 2]
[3 4]]
- shape、dtype、size查看array数组的属性
import numpy as np
x = [[1, 2],
[3, 4]]
y = np.array([[1, 2], [3, 4]])
print('x = ', x)
# print('x的数组维度数为:', x.shape)
# 报错:AttributeError: 'list' object has no attribute 'shape'
print('y = ', y)
print('y的数组维度数为:', y.shape)
print('y的数组数据类型为:', y.dtype)
print('y的数组元素个数为:', y.size)
# 输出结果为:
x = [[1, 2], [3, 4]]
y = [[1 2]
[3 4]]
y的数组维度数为: (2, 2)
y的数组数据类型为: int32
y的数组元素个数为: 4
由此可见,上述命令中x为Python列表,而y为NumPy数组,两者存在本质不同
Python列表与NumPy数组的区别:
NumPy使用ndarrays对象来处理多维数组,该对象是一个快速而灵活的大数据容器。使用Python列表可以存储一维数组,通过列表的嵌套可以实现多维数组,那么为什么还需要使用NumPy呢?
NumPy是专门针对数组的操作和运算进行了设计,所以数组的存储效率和输入输出性能远优于Python中的嵌套列表,数组越大,NumPy的优势越明显。通常NumPy数组中的所有元素的类型都是相同的,而Python列表中的元素类型是任意的,所以在通用性能方面NumPy数组不及Python列表,但在科学计算中,可以省掉很多循环语句,代码使用方面比Python列表简单的多。
import numpy as np
x = [[1.0,2],[1.2,5]]
y = np.array([[1.0, 2], [1.2, 5]])
print('x = ', x)
print('y = ', y)
print('y的数组数据类型为:', y.dtype)
# 输出结果为:
x = [[1.0, 2], [1.2, 5]]
y = [[1. 2. ]
[1.2 5. ]]
y的数组数据类型为: float64
显然,列表x中的元素类型可以不同,但NumPy数组y中的元素类型是相同的。
- 创建数组的特定方式
除了使用np.array( )手动创建数组外,还可以采用np.arrange( )、np.linspace( )、np.zeros( )、np.eye( )等一些特定函数创建规则形数组。
import numpy as np
print('使用np.arange()创建等差数组:', np.arange(10)) # 默认步长为1
print('使用np.linspace()创建指定范围内均匀分布的数组:', np.linspace(0,1,5)) # 其中0、1是数据范围,5则是分割的步长
print('使用np.zeros()创建元素全为0的数组:', np.zeros((2,3)))
print('使用np.eye()创建单位矩阵:', np.eye(3))
print('生成随机数组:',np.random.random(10))
输出结果为:
使用np.arange()创建等差数组: [0 1 2 3 4 5 6 7 8 9]
使用np.linspace()创建指定范围内均匀分布的数组: [0. 0.25 0.5 0.75 1. ]
使用np.zeros()创建元素全为0的数组: [[0. 0. 0.]
[0. 0. 0.]]
使用np.eye()创建单位矩阵: [[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
生成随机数组: [0.6618578 0.69706053 0.7718028 0.77127436 0.68639981 0.04684023
0.61201109 0.92561761 0.28325654 0.6377374 ]
- 数组索引
import numpy as np
arr = np.arange(10) # 创建0-9之间的等差数组
print('arr[5] = ', arr[5]) # 用整数作为下标获取数组中的某个元素
print("arr[3:5] = ", arr[3:5]) # 不包括5,用范围作为下标获取数组的一个切片
nd_arr = np.array([[1, 2, 3, 4], [4, 5, 6, 7], [7, 8, 9, 10]]) # 创建多维数组
print('nd_arr[0,0:3] = ', nd_arr[0, 0:3])
输出结果为:
arr[5] = 5
arr[3:5] = [3 4]
nd_arr[0,0:3] = [1 2 3]
- 数组的统计分析
用sort( )函数对数组进行排序,sum( )、mean( )、std( )等求数组总和、均值、标准差等。
import numpy as np
arr = np.array([1, 3, 8, 2, 7])
print('arr = ', arr)
print("对arr数组进行排序:", np.sort(arr))
print("对arr数组求和:", np.sum(arr))
print("求arr数组的均值:", np.mean(arr))
print("求arr数组的标准差:", np.std(arr))
输出结果为:
arr = [1 3 8 2 7]
对arr数组进行排序: [1 2 3 7 8]
对arr数组求和: 21
求arr数组的均值: 4.2
求arr数组的标准差: 2.785677655436824
- 数组的矩阵操作
用mat( )、dot( )函数对矩阵进行操作
import numpy as np
arr = np.arange(3)
matrix = np.mat("1,2,3;4,5,6;7,8,9") # 使用mat函数创建矩阵
# matrix = np.mat([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # 使用mat函数创建矩阵
print('arr = ', arr)
print("matrix = ", matrix)
print("矩阵相乘:", np.dot(arr, matrix)) # 使用dot进行矩阵相乘操作
输出结果为:
arr = [0 1 2]
matrix = [[1 2 3]
[4 5 6]
[7 8 9]]
矩阵相乘: [[18 21 24]]
NumPy数组与矩阵的区别:
在NumPy中np.mat( )创建的矩阵Matrix必须是二维的,但是NumPy arrays可以是多维的。Matrix是Array的一个小的分支,包含于Array。所以matrix拥有array的所有特性。
如果一个程序里面既有Matrix又有Array,会比较混乱。但是如果只用Array,不仅可以实现Matrix所有的功能,还减少了编程和阅读的麻烦。