Python有着大量功能强大的第三方库。这些第三方库可以大大地扩充Python的功能,我们在实际使用中往往也离不开这些第三方库。

NumPy是Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested list structure)结构要高效的多。NumPy(Numeric Python)提供了许多高级的数值编程工具。Numpy的一个重要特性是它的数组计算,是我们做数据分析必不可少的一个包。

导入python库使用关键字import,后面可以自定义库的简称,但是一般都将Numpy命名为np,pandas命名为pd。

使用前一定要先导入Numpy包,导入的方法有以下几种: import numpy import numpy as np #推荐写法 from numpy import * #不是很建议这种写法,因为不用加前缀的话有可能会与其他函数名称起冲突,因而报错

import numpy as np

1.Numpy的数组对象及其索引

数组上的数学操作

假设我们想将列表中的每个元素增加1,但列表不支持这样的操作:

a = [1,2,3,4]#a+1 #报错
[x+1 for x in a]
[2, 3, 4, 5]
b = [2,3,4,5]

与另一个数组相加,得到对应元素相加的结果:

a+b #并不是我们想要的结果
[1, 2, 3, 4, 2, 3, 4, 5]
[x+y for(x,y) in zip(a,b)]  #都需要利用到列表生成式
[3, 5, 7, 9]

这样的操作比较麻烦,而且在数据量特别大的时候会非常耗时间。

如果我们使用Numpy,就会变得特别简单

a = np.array([1,2,3,4])
a
array([1, 2, 3, 4])
a+1
array([2, 3, 4, 5])
a*2
array([2, 4, 6, 8])
b = np.array([2,3,4,5])
a + b
array([3, 5, 7, 9])

产生数组

从列表产生数组:

l = [0,1,2,3]
a = np.array(l)
a
array([0, 1, 2, 3])

从列表传入:

a = np.array([1,2,3,4])
a
array([1, 2, 3, 4])

生成全0数组:

np.zeros(5) #括号内传个数,默认浮点数
array([0., 0., 0., 0., 0.])

生成全1的数组:

np.ones(5) #括号内传个数,默认浮点数
array([1., 1., 1., 1., 1.])
np.ones(5,dtype="bool") #可以自己指定类型,np.zeros函数同理
array([ True,  True,  True,  True,  True])

可以使用 fill 方法将数组设为指定值

a = np.array([1,2,3,4])
a
array([1, 2, 3, 4])
a.fill(5) #让数组中的每一个元素都等于5a
array([5, 5, 5, 5])

与列表不同,数组中要求所有元素的 dtype 是一样的,如果传入参数的类型与数组类型不一样,需要按照已有的类型进行转换。

a.fill(2.5) #自动进行取整a
array([2, 2, 2, 2])
a = a.astype("float") #[强制类型转换a.fill(2.5)](<https://dolimence.notion.site/06-Python-Pandas-2-6e024e726b534d2dadb4abea3051b805>)
a
array([2.5, 2.5, 2.5, 2.5])

还可以使用一些特定的方法生成特殊的数组

生成整数序列:

a = np.arange(1,10) #左闭右开区间,和range的使用方式同理a
array([1.3, 2.3, 3.3, 4.3, 5.3, 6.3, 7.3, 8.3, 9.3])

生成等差数列:

a = np.linspace(1,10,21) #右边是包括在里面的,从a-b一共c个数的等差数列,其实np.arange好像也可以做...a
array([ 1.  ,  1.45,  1.9 ,  2.35,  2.8 ,  3.25,  3.7 ,  4.15,  4.6 ,
        5.05,  5.5 ,  5.95,  6.4 ,  6.85,  7.3 ,  7.75,  8.2 ,  8.65,
        9.1 ,  9.55, 10.  ])

生成随机数

np.random.rand(10)
array([0.48272736, 0.00581325, 0.16110313, 0.52234425, 0.63905254,
       0.42691432, 0.37196789, 0.57188523, 0.46437865, 0.43126794])
np.random.randn(10) #标准正态分布
array([-1.4237624 ,  1.63058904, -1.9223658 ,  0.17736421,  0.54337908,
       -1.46049834,  0.2146448 , -0.32785131, -1.08990638, -0.75152502])
np.random.randint(1,20,10) #生成随机整数,从1-20中随机10个
array([12,  6,  4,  3, 13, 19,  5,  4, 14, 16])

数组属性

查看类型:

a
array([ 1.  ,  1.45,  1.9 ,  2.35,  2.8 ,  3.25,  3.7 ,  4.15,  4.6 ,
        5.05,  5.5 ,  5.95,  6.4 ,  6.85,  7.3 ,  7.75,  8.2 ,  8.65,
        9.1 ,  9.55, 10.  ])
type(a)
numpy.ndarray

查看数组中的数据类型:

a.dtype
dtype('float64')

查看形状,会返回一个元组,每个元素代表这一维的元素数目:

a.shape
(4,)

或者使用:

np.shape(a)
(4,)

要看数组里面元素的个数:

a.size
4

查看数组的维度:

a.ndim
1

索引和切片

和列表相似,数组也支持索引和切片操作。

索引第一个元素:

a = np.array([0,1,2,3])
a[0]
0

修改第一个元素的值

a[0] = 10
a
array([10,  1,  2,  3])

切片,支持负索引:

a = np.array([11,12,13,14,15])
a[1:3] #左闭右开,从0开始算
array([12, 13])
a[1:-2] #等价于a[1:3]
array([12, 13])