Python numpy模块

66 阅读5分钟

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)创建一个可返回某区间内均匀间隔的数列

startstop代表区间范围,而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*n1m2*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.sinnp.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.lognp.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]])

最大最小

可以通过minmax得出数组中最大或最小的元素

>>> a = np.array([[ 2,  4,  6],
       [ 4,  8, 12],
       [ 6, 12, 18]])
>>> np.min(a)
2
>>> np.max(a)
18

也可以通过argminargmax得出最大最小元素的索引

>>> 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.varnp.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])