人工智能(Artificial Intelligence,AI)时代,简单易学,同时拥有着丰富模块库的Python成为时代的宠儿,活跃在人工智能的各个领域。我们可以借助Python库执行基本的机器学习任务。常用的Python科学库如下:
- 矩阵函数操作库(Numpy)
- 科学计算包(Scipy)
- Python绘图库(Matplotlib)
- 数据分析包(Pandas)
- 机器学习函数库(Scikit-learn)
- 统计建模工具包(StatsModels)
- 深度学习框架(TensorFlow)
Numpy
Numpy即Numeric Python,是用来存储和处理大型多维矩阵的开源数值计算开源工具,由于机器学习算法在处理数据过程中大多涉及线性代数,需要用到矩阵的各种操作,故而,Numpy在机器学习领域有着较多的使用场景。
Python语言提供数据类型列表(list)和array模块都可以当作数组使用。然而在处理数据过程中,我们一般不建议使用这两种方式,因为list的元素可以是任意对象,因此list中保存的是对象的指针,这样为了保存一个简单的[a,b],需要有2个指针和2个字符对象。对于大规模的数值运算来说,这种结构显然会对内存和CPU的性能造成极大的浪费。而array模块提供的array对象和列表不同,虽然可以直接保存数据,但由于它不支持多维,也没有各种运算函数,因此也不适合做数值运算。
Numpy的出现弥补了这些不足,Numpy提供两种基本对象:
ndarray(N-dimensional array object):存储单一数据类型的多维数组;
ufunc(universal function object):对数组进行处理的函数;
- 模块导入
import numpy as np
-
数组的创建方式
1.将Python列表转换为数组np.array((1,2,3,4,5))
2.将Python的range对象转换成数组
np.array(range(5))
3.创建一维数组
np.array([1,2,3,4,5])
4.创建二维数组
np.array([[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15]]) # 3行5列
5.生成等差数组
np.linspace(1,5,5)
linspace(start,end,size):生成以start为首项,end为末项,项数为size的等差数组
6.生成等比数组
np.logspace(0,100,10)
logspace(start,end,size):生成首项为0,末项为100,项数为size的等比数组
7.创建全0二维数组
np.zeros((3,3))
8.创建全0一维数组
np.zeros((3,1))
7.创建全1二维数组
np.ones((3,3))
8.创建全1一维数组
np.ones((3,1))
8.创建全0二维数组
np.zeros((3,3))
9.创建单位矩阵
np.identity(3)
10.创建空数组
np.empty((3,3))
只申请空间而不初始化,元素值是不确定的
11.使用arrange函数创建函数,类似于Python的range函数
f = np.arrange(0,1,0.1)
-
获取数组的属性值
a.通过shape获取数组的大小arr = np.array([[1,2],[3,4]]) arr.shape
可以通过修改数组的shape属性,在保持数组元素个数不变的情况下,改变数组每个轴的长度,需要注意的是,只是改变了轴的大小,数组元素在内存中的位置并没有改变。
当某个轴的值为-1时,将根据数组元素自动计算此轴的长度,如数组a是一个(3,4)的数组,若令a.shape=(2,-1),输出a.shape后发现轴的值改为(2,6)。
b.使用数组的reshape方法,可以创建一个改变了尺寸的新数组,但是原数组的shape保持不变。
a = np.array([1,2,3,4]) b = a.reshape((2,2))
显示结果如下:
array([[1,2],[3,4]])
使用reshape方法生成的新数组与原数组共享内存区域,因此修改其中任何一个数组元素的会同时修改另一个数组的内容。
c.数组的类型
通过数组的dtype属性获得数组的元素类型a = np.array([1,2,3,4]) a.dtype
显示结果如下
dtype('int32')
可以通过dtype参数在创建数组时指定元素类型
e = np.array([1,2,3,4],dtype = np.float)
d.
-
数组运算
- 数组与数值的算术运算
数组与数值的算术运算实质是数组中的元素与数值进行运算。 - 数组与数组的算术运算
数组与数组的算术运算实质也是数组元素之间进行运算
a = np.array([1,2,3]) b = np.array([[1,2,3],[4,5,6],[7,8,9]]) c = a*b
显示结果如下
array([[1,4,9],[4,10,18],[7,16,27]])
- Numpy使用arr.T实现二维数组转置,arr.dot()实现向量内积的计算,支持切片操作
- 数组与数值的算术运算
- Numpy常用函数
ufunc | manual |
---|---|
round(_) | 对元素进行四舍五入操作 |
floor(x) | 对数组x所有元素向下取整 |
ceil(x) | 对数组x所有元素向上取整 |
sum(x,axis=arg) | 不给出axis参数时,表示对数组所有元素求和;axis=0时,对数组纵向求和;axis=1时进行横向求和。 |
mean(x,axis=arg) | 返回数组元素算术平均值,axis参数的用法类似sum() |
max/min(x,axis=arg) | 返回元素的最大/最小值,axis参数的用法同上 |
std(x,axis=arg) | 返回元素的标准差,axis参数的用法同上 |
var(x,axis=arg) | 返回元素的方差,axis参数的用法同上 |
sort(x,axis=arg) | 返回排序后的数组,axis参数的用法同上 |
where(condition,x,y) | 当只给出条件,未给出参数x,y时,则输出满足条件元素的坐标,坐标以tuple形式给出;当条件参数都给出时,满足条件,输出x,反之输出y。 |
piecewise(x,condlist,funclist) | 分段函数,参数x是一个保存自变量值的数组.condlist是一个长度为M的布尔数组列表,其中的每个布尔数组的长度都和数组x相同。funclist是一个长度为M或M+1的函数列表。 |
分段函数示例:
x = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
# 数组x的元素中,小于4的乘3,大于6的乘2,其余都为0
np.piecewise(x, [x<4,x>6], [lambda x:x*3,lambda x:2*x])
随机数生成函数 | 特征 |
---|---|
rand() | 生成0~1之间的随机数 |
randn() | 生成服从标准正态分布的随机数 |
uniform(x,y,num) | 随机生成num个实数,它在 [x, y) 范围内 |
randint(low, high,( shape)) | 依shape创建随机整数或整数数组,范围是[ low, high) seed(s) :随机数种子 |
shuffle(a) | 根据数组a的第一轴进行随机排列,改变数组a |
permutation(a) | 根据数组a的第一轴进行随机排列, 但是不改变原数组,将生成新数组 |
choice(a[, size, replace, p]) | 从一维数组a中以概率p抽取元素, 形成size形状新数组,replace表示是否可以重用元素,默认为False。 |
更多函数请参考Numpy函数库。
-
数据存取
- 加载文本文件:numpy.loadtxt()/numpy.savetxt()
- 智能加载文本/csv文件:numpy.genfromtxt()/numpy.recfromcsv()
- 快速有效,但是针对numpy的二进制格式:numpy.save()/numpy.load()
CSV (Comma-Separated Value,逗号分隔值) 只能存储一维和二维数组
-
广播(Broadcasting)
我们讨论了许多数组之间的运算,但是显然,都是基于数组纬度一致的前提。当我们需要对两个纬度不同的数组进行运算时,就需要了解numpy中的广播机制。其实质就是将不同维度的数组转换维相同纬度在进行运算,在实际应用中许多基于网格或者基于网络的问题都需要使用广播。
Broadcasting
关于广播机制的详细讨论可以参考文章:
广播(Broadcasting)
Numpy二元运算的Broadcasting机制
网友评论