20.1 NumPy介绍
NumPy是Python的一种开源的数值计算扩展库。它包含很多功能:
创建n维数组(矩阵)
对数组进行函数运算
数值积分
线性代数运算
傅里叶变换
-
随机数产生
······
NumPy是在1995年诞生的Python库Numeric的基础上建立起来的。但真正促使NumPy的发行的是Python的SciPy库。
-
SciPy是2001年发行的一个类似于Matlab,Maple,Mathematica等数学计算软件的Python库,它实现里面的大多数功能。
NumPy提供了两种基本的对象:
ndarray:全称(n-dimensional array object)是储存单一数据类型的多维数组。
ufunc:全称(universal function object)它是一种能够对数组进行处理的函数。
NumPy的官方文档:
https://docs.scipy.org/doc/numpy/reference/-
ndarray 对象
- ndarray的创建
- ndarray的属性
- ndarray的切片
- 多维数组
- 结构数组
20.1.1 Ndarray的创建
- NumPy中的核心对象是ndarray。
- ndarray可以看成数组,类似于R语言的向量或者矩阵。
- NumPy里面所有的函数都是围绕ndarray展开的。
- ndarray对维数没有限制。
- [ ]从内到外分别为第0轴,第1轴,第2轴。
- c第0轴长度为3,第1轴长度为4。
-
NumPy提供了专门用于生成ndarray的函数,提高创建ndarray的速度。
- 还可以自定义函数产生ndarray。
- fromfunction第一个参数接收计算函数,第二个参数接收数组的形状。
20.1.2 Ndarray的属性
- ndarray的元素具有相同的元素类型。常用的有int(整型),float(浮点型),complex(复数型)。
- ndarray的shape属性用来获得它的形状,也可以自己指定。
20.1.3 Ndarray切片
- ndarray的切片和list是一样的。
- 可以通过切片的对ndarray中的元素进行更改。
- ndarray通过切片产生一个新的数组b,b和a共享同一块数据存储空间。
- 如果想改变这种情况,我们可以用列表对数组元素切片。
20.1.4 多维数组
- NumPy的多维数组和一维数组类似。多维数组有多个轴。
- 我们前面已经提到从内到外分别是第0轴,第1轴…
-
如果我们想创立原数组的副本,我们可以用整数元组,列表,整数数组,布尔数组进行切片
20.1.5 结构数组
- C语言中可以通过struct关键字定义结构类型。
- NumPy中也有类似的结构数组。
20.2 Ufunc函数
20.2.1 Ufunc简介
- ufunc是universal function的简称,它是一种能对数组每个元素进行运算的函数。
- 值得注意的是,对于同等长度的ndarray,np.sin()比math.sin()快
- 但是对于单个数值,math.sin()的速度则更快。
20.2.2 四则运算
-
NumPy提供了许多ufunc函数,它们和相应的运算符运算结果相同。
20.2.3 比较运算和布尔运算
- 使用==,>对两个数组进行比较,会返回一个布尔数组,每一个元素都是对应元素的比较结果。
-
布尔运算在NumPy中也有对应的ufunc函数。
20.2.4 自定义ufunc函数
- NumPy提供的标准ufunc函数可以组合出复合的表达式,但是有些情况下,自己编写的则更为方便。
- 我们可以把自己编写的函数用frompyfunc()转化成ufunc函数。
- 使用frompyfunc()进行转化
- func:计算函数
- nin:func()输入参数的个数
- nout:func()输出参数的个数
- 因为最后输出的元素类型是object,所以我们还需要把它转换成整型。
20.2.5 广播(broadcasting)
- 使用ufunc对两个数组进行运算时,ufunc函数会对两个数组的对应元素进行运算。如果数组的形状不相同,就会进行下广播处理。
-
简而言之,就是向两个数组每一维度上的最大值靠齐
20.3 随机数
-
NumPy产生随机数的模块在random里面,其中有大量的分布。
20.4 求和、平均值、方差
-
NumPy在均值等方面常用的函数如下:
- keepdims可以保持原来数组的维数。
20.5 大小与排序
-
NumPy在排序等方面常用的函数如下:
- min,max都有axis,out,keepdims等参数
- sort()对数组进行排序会改变数组的内容,返回一个新的数组。
- percentile计算处于p%上的值。
20.5 统计函数
- NumPy中常用的统计函数有:unique(), bicount(), histogram()。
- unique有两个参数,return_index=True同时返回原始数组中的下 - 标,return_inverse=True表示原始数据在新数组的下标。
- bincount()对非负整数数组中的各个元素出现的次数进行统计,返回数组中的第i个元素是整数i出现的次数。
- histogram()对以为数组进行直方图统计,其参数为:
- histogram(a, bins=10, range=None, weights=None)函数返回两个一维数组,hist是每个区间的统计结果, bin_edges返回区间的边界值。
20.6 操作多维数组
- 多维数组可以进行连接,分段等多种操作。
- vstack()函数
- hstack()函数
- column_stack()函数。
- split()函数进行分段。
20.7 多项式函数
- 多项式也可以进行积分和求导。
- Roots可以求多项式的根。
- polyfit()可以对数据进行多项式拟合。x, y为数据点,deg为多项式最高阶数。
- poly()返回多项式系数构成的数组。
20.8 实验
In:
import numpy as np
数组创建
In:
a1 = np.array([1,2,3])
In:
a1.shape
out:
(3,)
In:
a2 = np.array([[1,2,3],[4,5,6]])
a2.shape
out:
(2, 3)
In:
a3 = np.arange(0,10,1)
a3
out:
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
In:
np.linspace(0,10,5)
out:
array([ 0. , 2.5, 5. , 7.5, 10. ])
In:
np.zeros(10)
out:
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
In:
a3.dtype
out:
dtype('int32')
In:
a2.reshape(3,2)
out:
array([[1, 2],
[3, 4],
[5, 6]])
UFUNC
In:
np.greater_equal(np.array([1,2,3]),np.array([0,0,6]))
out:
array([ True, True, False])
In:
a3.dtype
out:
dtype('int32')
In:
a4 = a3.astype(np.float)
a4.dtype
out:
dtype('float64')
随机数
In:
np.random.randint(5,size=10) #5是范围
out:
array([3, 3, 2, 4, 4, 1, 2, 1, 1, 1])
In:
np.random.normal(0,1,100) #正太分布,均值为0,方差为1,100个数
out:
array([-0.80861078, -2.07749691, 0.29377679, -1.96900312, -1.25783093,
-0.99607882, -0.87248032, -2.26714699, 1.30187567, 0.10194601,
-0.42405655, -1.59441604, -2.31300876, 0.69700842, -0.65660689,
0.01491257, 0.24889131, 0.3133219 , 1.09196143, -2.45041751,
-0.71471691, -0.26187846, -1.93342864, -0.21497748, -0.20100491,
-0.73638216, 1.08467604, 0.53403982, -0.03887703, 1.12471892,
0.78003454, 0.44594115, -0.17300147, -0.09442446, -0.93177358,
1.71758462, 0.88627094, 0.70998374, -1.06083069, 0.28917184,
0.62578472, -1.35847831, -0.82151136, -2.50524439, 0.13409251,
1.95447607, -0.66078128, -0.54954445, 0.18099372, 0.63007529,
-0.32250372, 0.19161832, -0.03845566, 1.42156815, -0.60922562,
0.35661966, -0.94926617, -0.07052227, 1.28500753, 0.83647684,
-0.08366194, -0.07888412, -0.75984669, 0.68073513, 0.24847929,
0.06411332, -0.42888773, -0.4308731 , 0.28863559, -0.39317157,
0.6535631 , -1.03377091, 0.82276069, 0.62719534, 0.60430812,
-0.66642475, -0.82981853, -0.23608257, -0.79722868, -0.04271116,
-1.4547114 , -0.36257698, -1.51886097, 0.82684717, -0.52092058,
-0.26407561, -1.26248144, 1.03907498, 1.10227367, -1.44444213,
2.77433472, 1.16802956, -0.40984097, -0.77560109, -0.09912853,
-0.54654941, 0.24287845, -0.84331085, -0.65950241, -0.08166242])
In:
np.random.uniform(-1,2,10) #均匀分布,-1是最低值,2是最高值
out:
array([ 1.62022332, -0.10385265, 1.7091309 , -0.74307353, 0.82105525,
1.9984005 , 1.2537413 , 0.19649023, 0.27706096, -0.13709349])
In:
a3
np.random.shuffle(a3)
print(a3)
out:
[9 5 0 3 4 1 2 7 6 8]
In:
np.random.choice(10,4) #10表示范围,4表示个数
out:
array([6, 2, 3, 0])
In:
a3.mean()
np.average(a3)
out:
4.5
In:
# a3.sum()
np.sum(a3)
out:
45
In:
np.product(a3)
out:
0
In:
np.ptp(a3) #9-0
out:
9
In:
print(a3,a4)
out:
[9 5 0 3 4 1 2 7 6 8] [0. 1. 2. 3. 4. 5. 6. 7. 8. 9.]
In:
np.minimum(a3,a4)
out:
array([0., 1., 0., 3., 4., 1., 2., 7., 6., 8.])
In:
np.percentile(a3,25) #25代表中位,排序后
out:
2.25
In:
np.percentile(a4,25)
out:
2.25
In:
np.median(a3) #中位数 (4+5)/2,排序后
out:
4.5
In:
a1 = np.array([1,2,'a','hello',[1,2,3],{'one':100,'two':200}])
a1.shape
out:
(6,)
In:
list('abcdef')
out:
['a', 'b', 'c', 'd', 'e', 'f']
In:
a2 = np.array([list(range(6)),list('abcdef'),
[True,False,True,False,True,True]])
In:
a2.shape
out:
(3, 6)
In:
np.arange(5,15)
out:
array([ 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
In:
np.zeros((4,4))
out:
array([[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]])
In:
np.ones((2,3))
out:
array([[1., 1., 1.],
[1., 1., 1.]])
In:
np.eye(3) #生成对角阵
out:
array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])
In:
print(a3)
a3[[3,3,-3,8]]
out:
[0 1 2 3 4 5 6 7 8 9]
array([3, 3, 7, 8])
In:
np.arange(25).reshape(5,5)
out:
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19],
[20, 21, 22, 23, 24]])
In:
a21 = np.arange(20)
In:
a21.reshape(4,5)
out:
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19]])
In:
np.resize(a21,(5,6))
out:
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 19, 0, 1, 2, 3],
[ 4, 5, 6, 7, 8, 9]])
In:
np.arange(16).reshape(4,4).astype(np.str)
out:
array([['0', '1', '2', '3'],
['4', '5', '6', '7'],
['8', '9', '10', '11'],
['12', '13', '14', '15']], dtype='
In:
ar6 = np.arange(10).reshape(2,-1)
ar6[ar6>5]
out:
array([6, 7, 8, 9])