Python是一种解释型、面向对象、动态数据类型的高级程序设计语言。它拥有高效的高级数据结构,并且能够用简单而又高效的方式进行面向程序编程。
Python语言写的程序不需要编译成二进制代码,可以直接从源代码运行程序。在计算机内部,Python解释器把源代码转换成称为字节码的中间形式,然后再把它翻译成计算机使用的机器语言并运行。这使得使用Python更加简单,也使得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实现机器学习需要安装一些相关的开源软件库,通过它们,可以直接引用某些函数来进行相关操作,而不用每一步都得自己编程或者构造函数去实现。例如科学计算包NumPy
、数据分析工具Pandas
、数值计算包Scipy
、绘图工具库Matplotlib
、机器学习包Scikit-learn
等,涵盖了数据导入、整理、数据处理、可视化、数值计算以及算法运行等方面,只需要直接引入这些程序库就可以实现一些基本过程。
Anaconda
是Python的一个集成管理工具或系统,它把Python做相关数据计算与分析所需要的包都集成在了一起。
NumPy是Python科学计算的基础包,它专为进行严格的数字处理而产生,尤其是在向量和矩阵运算中使用。由于Python没有提供数组的数据结构形式,虽然列表(list)可以完成数组,但不是真正的数据,当数据量增大时,它的速度很慢且容易出错。因此,NumPy扩展包提供了数组支持,同时很多高级扩展包依赖它。
NumPy的核心是数组(Arrays),具体来说是多维数组。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))
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]]
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所有的功能,还减少了编程和阅读的麻烦。