数据建模与分析|NumPy教程与示例

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 矩阵运算初步

一些数据建模中较为重要的矩阵运算。
如求矩阵的逆、特征值和特征向量以及奇异值的分解等,需要导入 NumPylinalg 模块下有关矩阵运算的函数。

  • X.TX 的转置
  • 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]]))
  • 11
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

皖山文武

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值