numpy
Numpy支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库,比如线代等等,经常可以搭配Matplotlib一起使用,进行一些数据可视化,绘图等类的工作
初始化
numpy中所有的运算都是围绕着数组进行,所以在运算开始之前,我们通常会将数据表示为数组,这也叫做向量化
import numpy as np
np.array([1, 2, 3])
数组可以是一纬甚至N维,一般常用为2维的数组,可以代表高数中的矩阵,或者像excel表格这样的结构
都是0
也可以直接使用zeros方法初始化一个初始数据均为0的数组
np.zeros((3, 2))
# 3: 行
# 2: 列
array([[0., 0.],
[0., 0.],
[0., 0.]])
都是1
或者使用ones创建一个初始数据均为1的数组
>>> np.ones((3,2))
array([[1., 1.],
[1., 1.],
[1., 1.]])
递增递减
还可以使用np.arange(start, stop, step)创建一个递增或递减的数列,类似range
>>> np.arange(1,20,2)
array([ 1, 3, 5, 7, 9, 11, 13, 15, 17, 19])
等间区间
还可以使用np.linspace(start, stop, num)创建一个可返回某区间内均匀间隔的数列
start和stop代表区间范围,而num代表着输出的样本数量
>>> np.linspace(1,20,5)
array([ 1. , 5.75, 10.5 , 15.25, 20. ])
从1开始,等区间的数,间隔为4.75
随机数组
可以使用np.random.rand创建一个随机的数组,类型为浮点数,传入维度参数,常用来初始化权重或偏执
>>> np.random.rand(3,4)
array([[0.28436957, 0.40079132, 0.62179971, 0.70283601],
[0.3446775 , 0.656412 , 0.65009509, 0.58853059],
[0.72244953, 0.40393385, 0.98490151, 0.30946388]])
类型转换
numpy中数组默认的数据类型为64位浮点数,但是也可以在创建过程中使用dtype指明数组类型
>>> np.zeros((3,5), dtype=np.int32)
array([[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]], dtype=int32)
如果是对一个创建好的数组进行类型变更,可以使用astype
>>> a = np.zeros((3, 3))
>>>
>>> a.astype(str)
array([['0.0', '0.0', '0.0'],
['0.0', '0.0', '0.0'],
['0.0', '0.0', '0.0']], dtype='<U32')
属性获取
如果希望获取得到一个N维矩阵的维度,可以使用np.shape来进行获取
>>> a = np.zeros((10,10))
>>> np.shape(a)
(10, 10)
# 10 行 10 列
基本运算
如果两个数组的尺寸相同,可以进行四则运算
>>> a = np.random.rand(2,3)
>>> b = np.random.rand(2,3)
>>> a
array([[0.95883418, 0.49390306, 0.72874951],
[0.0654659 , 0.22890727, 0.48074885]])
>>> b
array([[0.26112072, 0.07920756, 0.38791219],
[0.14158288, 0.80694772, 0.0137202 ]])
四则运算
>>> a - b
array([[ 0.69771346, 0.4146955 , 0.34083733],
[-0.07611697, -0.57804044, 0.46702865]])
>>> a + b
array([[1.2199549 , 0.57311062, 1.1166617 ],
[0.20704878, 1.03585499, 0.49446904]])
>>> a * b
array([[0.25037147, 0.03912086, 0.28269082],
[0.00926885, 0.1847162 , 0.00659597]])
>>> a / b
array([[ 3.67199576, 6.23555427, 1.87864559],
[ 0.46238574, 0.28367051, 35.03950095]])
不难看出,这是相同位置的两个值进行运算,返回结果,放入原始位置
点积运算
可以使用np.dot方法完成点乘运算,对应位置相乘并累积求和
>>> a
array([1, 2, 3])
>>> b
array([4, 5, 6])
>>> np.dot(a,b)
32
1 * 4 + 2 * 5 + 3 * 16
矩阵乘法
如果两个数组的维度分别是m1*n1、m2*n2,如果满足n1 = m2,则两个数组可以进行矩阵乘法
>>> a
array([[1, 2, 3],
[4, 5, 6]])
>>> b
array([[2, 2, 2],
[3, 3, 3],
[4, 4, 4]])
2 * 3 & 4 * 2
使用@可以完成点乘运算
>>> a * b
>>> array([[20, 20, 20],
[47, 47, 47]])
这个结果由a数组的第一行与b数组的第一列进行相乘并求和,依次类推得出结果
那么规律显而易见
(m1 * n1) @ (m2 * n2)
= m1 * n2
平方根
np.sqrt可以对所有数组中的数进行求平方根的运算
>>> a = np.array([1, 2, 3])
>>> np.sqrt(a)
array([1. , 1.41421356, 1.73205081])
三角函数
可以使用np.sin或np.cos对数组元素进行逐个三角函数运算
array([1, 2, 3])
>>> np.sin(a)
array([0.84147098, 0.90929743, 0.14112001])
>>> np.cos(a)
array([ 0.54030231, -0.41614684, -0.9899925 ])
对数指数
可以使用np.log和np.power方法对数组元素逐个进行对数和指数运算
array([1, 2, 3])
>>> np.log(a)
array([0. , 0.69314718, 1.09861229])
>>> np.power(a, 3)
array([ 1, 8, 27])
广播
当使用单独的一个数对某个np数组进行操作,那么numpy会将这个数对数组逐个元素进行计算
>>> a = np.random.rand(3,5)
>>> a
array([[0.98359222, 0.49105793, 0.28014367, 0.23739613, 0.37317491],
[0.57245118, 0.63637562, 0.56547557, 0.1870733 , 0.80030628],
[0.1931786 , 0.26468877, 0.1817968 , 0.39893921, 0.60851884]])
>>> a * 100
array([[98.35922177, 49.10579283, 28.01436709, 23.73961256, 37.31749143],
[57.24511816, 63.63756161, 56.54755696, 18.7073298 , 80.03062828],
[19.31786036, 26.46887714, 18.17968047, 39.89392079, 60.85188391]])
当时不同的尺寸数组进行运算,numpy也会尝试使用广播,将两个数组扩展为相同尺寸,在进行计算
>>> a = np.array([1,2,3])
>>> b = np.array([[1],[2],[3]])
>>> a * b
array([[ 2, 4, 6],
[ 4, 8, 12],
[ 6, 12, 18]])
最大最小
可以通过min或max得出数组中最大或最小的元素
>>> a = np.array([[ 2, 4, 6],
[ 4, 8, 12],
[ 6, 12, 18]])
>>> np.min(a)
2
>>> np.max(a)
18
也可以通过argmin或argmax得出最大最小元素的索引
>>> a = np.array([[ 2, 4, 6],
[ 4, 8, 12],
[ 6, 12, 18]])
>>> np.argmin(a)
0
>>> np.argmax(a)
8
求和
使用np.sum计算所有数组元素的和
>>> a = np.array([1, 2, 3])
>>> np.sum(a)
6
平均值
使用np.mean方法对数组进行平均值的计算
>>> a = np.array([1, 2, 6])
>>> np.mean(a)
3.0
中位数
中位数(Median)又称中值,统计学中的专有名词,是按顺序排列的一组数据中居于中间位置的数
使用np.median实现对数组元素中位数的计算
>>> a = np.array([1, 2, 6])
>>> np.median(a)
2.0
方差
可以使用np.var与np.std返回数组计算后的方差及标准方差(又常称均方差)
>>> a = np.array([1, 2, 6])
>>> np.var(a)
4.666666666666667
>>> a = np.array([1, 2, 6])
>>> np.std(a)
2.160246899469287
行列计算
numpy中的计算方法,支持在行或列的方向上单独进行,可以使用axis参数来控制
# 0: 列上计算,结果为列数
# 1: 行上计算,结果为行数
>>> a = np.array([[1,2,3],[4,5,6]])
>>> np.sum(a, axis=0)
array([5, 7, 9])
>>> np.sum(a, axis=1)
array([ 6, 15])
元素访问
可以使用下标获取某个维度数组中的某个元素
array([[1, 2, 3],
[4, 5, 6]])
>>> a[1,1]
5
如果希望获取某行某列的数据,比如第一行前两个字符,可以使用两组类似切片的语法完成,逗号隔开
第一个逗号前代表对行取值,0则是第一行,也可以使用0:2代表分别取前两行
第二个逗号代表对列进行取值,0:2代表取0、1两列
>>> a[0, 0:2]
array([1, 2])
比如获取第一行第二行,并且每行的从索引为1开始之后所有的元素,并且反转
>>> a[0:2, 1:]
array([[2, 3],
[5, 6]])
>>> a[0:2, 1::-1]
array([[2, 1],
[5, 4]])
元素筛选
也可以使用一些表达式在中括号中,完成数组数据的过滤筛选
array([[1, 2, 3],
[4, 5, 6]])
>>> a[a > 2]
array([3, 4, 5, 6])
>>> a[a + 1 > 2]
array([2, 3, 4, 5, 6])
也支持逻辑运算,&与|分别代表and\or
>>> a[ (a == 1) | (a == 5)]
array([1, 5])