1. NumPy简介
NumPy是Numerical Python的简称,是常用的Python包之一。其主要特点如下:
- NumPy以N维数组对象(ndarray)形式组织数据集,而且要求数据集中各变量的类型相同。Numpy的一维数组对应向量,二维数组对应矩阵。
- NumPy拥有丰富的数学运算和统计函数,方便进行统计分析和矩阵运算。
2. NumPy数组的创建和访问
- Python列表通过方括号[]和逗号将各数据元素组织在一起,是Python组织数据的最常见方式。NumPy以N维数组对象形式组织数据集,通过np.array()可将Python列表转换为NumPy的N维数组。
- .dtype是NumPy数组的属性之一,存储了数组元素的数据类型。int32是Python的数据类型之一,表示包含符号位的32位整型数。还有int64,float32,float64等64位整型数、标准32位单精度浮点数,标准64位双精度浮点数等等。
- NumPy的数据计算非常方便,只需通过加减乘除等算术运算符,就可完成对数组元素的统一计算,或多个数组中相同位置上元素的计算。
- 通过指定位置编号(也称索引,从0开始编号)访问相应行位置上的元素。索引需放置在数组名后的方括号内。
- 通过索引访问相应行列位置上的元素。对于2维数组,需给出两个索引,以逗号分割并放置在方括号内。 第1个索引指定行,第2个索引指定列。可通过冒号:指定索引范围。
#导入NumPy模块,并指定别名为np。
import numpy as np
# 创建一个NumPy的1维数组。
x=[1,2,3,4,5,6,7,8,9]
# np.array可将列表转换为NumPy的N维数组。
data=np.array(x)
# 显示数组内容
print('Numpy的1维数组:\n{0}'.format(data))
# 打印数组元素的数据类型。
print('数据类型:%s'%data.dtype)
print('1维数组中各元素扩大10倍:\n{0}'.format(data*10))
print('访问第2个元素:{0}'.format(data[1]))
#创建一个NumPy的2维数组,数组形状为2行5列。
data=np.array([[1,3,5,7,9],[2,4,6,8,10]])
print('Numpy的2维数组:\n{0}'.format(data))
print('访问2维数组中第1行第2列元素:{0}'.format(data[0,1]))
print('访问2维数组中第1行第2至4列元素:{0}'.format(data[0,1:4]))
print('访问2维数组中第1行上的所有元素:{0}'.format(data[0,:]))
Numpy的1维数组:
[1 2 3 4 5 6 7 8 9]
数据类型:int32
1维数组中各元素扩大10倍:
[10 20 30 40 50 60 70 80 90]
访问第2个元素:2
Numpy的2维数组:
[[ 1 3 5 7 9]
[ 2 4 6 8 10]]
访问2维数组中第1行第2列元素:3
访问2维数组中第1行第2至4列元素:[3 5 7]
访问2维数组中第1行上的所有元素:[1 3 5 7 9]
- Python列表中的数据类型可以不同,但NumPy数组中的元素类型必须相同,以下演示了二维列表转化为NumPy数组时类型自动转换的过程。
data=[[1,2,3,4,5,6,7,8,9],['A','B','C','D','E','F','G','H','I']]
print('data是Python的列表(list):\n{0}'.format(data))
MyArray1=np.array(data)
print('MyArray1是Numpy的N维数组:\n%s\nMyarray1的形状:%s'%(MyArray1,MyArray1.shape))
data是Python的列表(list):
[[1, 2, 3, 4, 5, 6, 7, 8, 9], ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I']]
MyArray1是Numpy的N维数组:
[['1' '2' '3' '4' '5' '6' '7' '8' '9']
['A' 'B' 'C' 'D' 'E' 'F' 'G' 'H' 'I']]
Myarray1的形状:(2, 9)
3. NumPy的计算功能
数据建模和分析需要对数据进行必要的整理和加工,包括计算基本描述统计量,计算生成新变量、矩阵运算等
3.1 NumPy数组的计算
对数组元素计算基本描述统计量的方法有:
-
.mean():计算数组元素的均值
-
.std():计算数组元素的标准差
-
.sum():总和
-
.max():最大值
-
.cumsum():计算数组元素的当前累计和。
-
.sqrt():对数组元素开平方
-
sort():对数组元素排序,排序结果并不覆盖原数组内容。
-
rint():对数组元素做四舍五入。
-
sign()求数组元素的正负符号。1表示正号,-1表示负号。
相关方法: -
np.arange():是NumPy中最常用函数之一,用于生成在指定范围内取值的1维数组。如:np.arange(10)生成数组元素是0至9的1维数组,共包含10个元素。
-
np.random.seed():指定随机数种子,指定种子的目的是确保每次运行代码时,生成的随机数可以再现。否则,每次运行代码生成的随机数会不相同。
-
np.random.randn(10):随机生成包含10个元素且服从标准正态分布的一维数组。
-
.where()依次对数组元素进行逻辑判读。where()需指定判断条件(如>0),满足条件的返回第一个值(如‘正’),否则返回第二个值(如‘负’)。若省略第2和第3个参数,例如:where(Myarray3>0)将给出满足条件的元素索引号。
-
MyArray2+MyArray3:MyArray2、MyArray3两个数组相同位置上的元素相加。
MyArray2=np.arange(10)
print('MyArray2:\n{0}'.format(MyArray2))
print('MyArray2的基本描述统计量:\n均值:%f,标准差:%f,总和:%f,最大值:%f'%(MyArray2.mean(),MyArray2.std(),MyArray2.sum(),MyArray2.max()))
print('MyArray2的累计和:{0}'.format(MyArray2.cumsum()))
print('MyArray2开平方:{0}'.format(np.sqrt(MyArray2)))
np.random.seed(123)
MyArray3=np.random.randn(10)
print('MyArray3:\n{0}'.format(MyArray3))
print('MyArray3排序结果:\n{0}'.format(np.sort(MyArray3)))
print('MyArray3四舍五入到最近整数:\n{0}'.format(np.rint(MyArray3)))
print('MyArray3各元素的正负号:{0}'.format(np.sign(MyArray3)))
print('MyArray3各元素非负数的显示"正",负数显示"负":\n{0}'.format(np.where(MyArray3>0,'正','负')))
print('MyArray2+MyArray3的结果:\n{0}'.format(MyArray2+MyArray3))
MyArray2:
[0 1 2 3 4 5 6 7 8 9]
MyArray2的基本描述统计量:
均值:4.500000,标准差:2.872281,总和:45.000000,最大值:9.000000
MyArray2的累计和:[ 0 1 3 6 10 15 21 28 36 45]
MyArray2开平方:[0. 1. 1.41421356 1.73205081 2. 2.23606798
2.44948974 2.64575131 2.82842712 3. ]
MyArray3:
[-1.0856306 0.99734545 0.2829785 -1.50629471 -0.57860025 1.65143654
-2.42667924 -0.42891263 1.26593626 -0.8667404 ]
MyArray3排序结果:
[-2.42667924 -1.50629471 -1.0856306 -0.8667404 -0.57860025 -0.42891263
0.2829785 0.99734545 1.26593626 1.65143654]
MyArray3四舍五入到最近整数:
[-1. 1. 0. -2. -1. 2. -2. -0. 1. -1.]
MyArray3各元素的正负号:[-1. 1. 1. -1. -1. 1. -1. -1. 1. -1.]
MyArray3各元素非负数的显示"正",负数显示"负":
['负' '正' '正' '负' '负' '正' '负' '负' '正' '负']
MyArray2+MyArray3的结果:
[-1.0856306 1.99734545 2.2829785 1.49370529 3.42139975 6.65143654
3.57332076 6.57108737 9.26593626 8.1332596 ]
3.2 创建矩阵和矩阵乘法
首先,利用NumPy的 random.normal(5,1,(2,4)) 函数生成2行4列的2维数组,数组元素服从均值为5,标准差为1的正态分布。然后,利用 floor() 函数得到距各数组元素最近的最大整数。然后利用 eye() 函数生成一个大小(这里是5行5列)的单位阵Y,最后利用 dot() 函数计算矩阵X和矩阵Y(单位阵)的矩阵乘积,将得到2行5列的矩阵。
np.random.seed(40)
X=np.floor(np.random.normal(5,1,(2,4)))
Y=np.eye(4)
print('X:\n{0}'.format(X))
print('Y:\n{0}'.format(Y))
print('X和Y的点积:\n{0}'.format(np.dot(X,Y)))
X:
[[4. 4. 4. 5.]
[3. 4. 7. 5.]]
Y:
[[1. 0. 0. 0.]
[0. 1. 0. 0.]
[0. 0. 1. 0.]
[0. 0. 0. 1.]]
X和Y的点积:
[[4. 4. 4. 5.]
[3. 4. 7. 5.]]
3.3 矩阵运算初步
一些数据建模中较为重要的矩阵运算。
如求矩阵的逆、特征值和特征向量以及奇异值的分解等,需要导入 NumPy 的 linalg 模块下有关矩阵运算的函数。
- X.T 是 X 的转置
- inv() :计算矩阵的逆
- 行列式值 det()
- 特征值和对应的特征向量 eig()
- 对矩阵进行奇异值分解 svd()
from numpy.linalg import inv,svd,eig,det
X=np.random.randn(3,3)
print(X)
mat=X.T.dot(X)
print(mat)
print('矩阵mat的逆:\n{0}'.format(inv(mat)))
print('矩阵mat的行列式值:\n{0}'.format(det(mat)))
print('矩阵mat的特征值和特征向量:\n{0}'.format(eig(mat)))
print('对矩阵mat做奇异值分解:\n{0}'.format(svd(mat)))
[[ 0.71026699 1.05553444 0.0540731 ]
[ 0.25795342 0.58828165 0.88524424]
[-1.01700702 -0.13369303 -0.4381855 ]]
[[1.60532245 1.03742729 0.71239585]
[1.03742729 1.47810209 0.63643131]
[0.71239585 0.63643131 0.9785878 ]]
矩阵mat的逆:
[[ 1.28702807 -0.69433079 -0.48537249]
[-0.69433079 1.31425796 -0.3492753 ]
[-0.48537249 -0.3492753 1.60237752]]
矩阵mat的行列式值:
0.8091570636269204
矩阵mat的特征值和特征向量:
(array([3.02645738, 0.49071486, 0.5448401 ]), array([[ 0.66296289, 0.74743519, 0.04267121],
[ 0.61792823, -0.51413291, -0.59483784],
[ 0.42266406, -0.42072316, 0.80271235]]))
对矩阵mat做奇异值分解:
(array([[-0.66296289, 0.04267121, -0.74743519],
[-0.61792823, -0.59483784, 0.51413291],
[-0.42266406, 0.80271235, 0.42072316]]), array([3.02645738, 0.5448401 , 0.49071486]), array([[-0.66296289, -0.61792823, -0.42266406],
[ 0.04267121, -0.59483784, 0.80271235],
[-0.74743519, 0.51413291, 0.42072316]]))