Python3基本工具包:Numpy

作者:xxw9485
时间:2018/3/10
来源:http://mp.weixin.qq.com/s/54fQScsNn9Sg-G02CEoaOw


Numpy

NumPy是Python科学计算的基础包。它提供了多维数组对象、基于数组的各种派生对象(例如,masked Array, 矩阵)。除此之外,还提供了各种各样的加快数组操作的例程,包括数学基本计算、逻辑、图形操作、排序、选择、输入输出,离散傅立叶变换、基础线性代数、基础统计操作、随机仿真等等。

1 使用Numpy构建矩阵

数组的创建可以使用numpy模块中的array()函数实现,一维数组只需要给array()函数传入一个列表或元组,二维数组则是传入嵌套的列表或元组。

# 输入:
import numpy as np
a = np.array([1,2,3,4,5])
print(a)
b = np.array((1,2,3,4,5))
print(b)
c = np.array([[1,4,7],[2,5,8],[3,6,9]])
print(c)
print(a.shape)
print(b.shape)
print(c.shape)
# 输出:
[1 2 3 4 5]
[1 2 3 4 5]
[[1 4 7]
 [2 5 8]
 [3 6 9]]
(5,)
(5,)
(3, 3)

上面a和b为一维数组,c为二维数组,返回一个数组的行数和列数可使用shape方法。

2 元素的获取

使用索引的方式,查询一维数组和二维数组的元素。一维数组的索引与列表、元组的索引完全一致,这里就不在赘述;二维数组的索引就稍微有点复杂。

# 输入:
import numpy as np
a = np.array([[1,4,7],[2,5,8],[3,6,9]])
print(a[:,2],'\n') # 获取二维数组的第三列
print(a[1,:],'\n') # 获取二维数组的第二行
print(a[1,1],'\n') # 获取二维数组第二行第二列的元素
print(a[[0,2],:],'\n') # 获取二维数组第一、第三行  
print(a[:,[1,2]],'\n') # 获取二维数组第二、第三列
print(a[[1,2],[0,1]],'\n') # 获取二维数组第二行第一列的交叉元素和第三行第二列的交叉元素
# 输出:
[7 8 9] 

[2 5 8] 

5 

[[1 4 7]
 [3 6 9]] 

[[4 7]
 [5 8]
 [6 9]] 

[2 6]

注意:
1. print()函数中的’\n’,目的用来换行。
2. 最后一个返回的结果不是一个矩阵,而是相当于坐标为[1,0]和[2,1]对应的两个值。下面的例子才是返回一个矩阵。

# 输入:
import numpy as np
a = np.array([[1,4,7],[2,5,8],[3,6,9]])
print(a[[0,1],:][:,[1,2]],'\n') # 返回第一第二行和第二第三列的交叉元素矩阵。
# 输出:
[[4 7]
 [5 8]] 

3 数学函数

np.abs # 取绝对值
np.fabs # 取绝对值
np.sqrt # 算术平方根
np.square # 平方
np.exp # 指数
np.log2 # 对数
np.log10 # 对数
np.log(x,base) # 对数
np.sign # 符号函数(大于0的数返回1、小于0的数返回-1、0返回0值)
np.cell # 向上取整
np.floor # 向下取整
np.rint  # 返回最近的整数
np.isnan # 判断是否缺失
np.isfinite # 判断是否有限
np.isinf # 判断是否无限
np.power # 幂运算
np.mod # 余数

4 统计函数

np.max # 最大值
np.fmax # 浮点型的最大值
np.mim # 最小值
np.fmin # 浮点型的最小值
np.sum # 求和
np.mean # 均值
np.std # 标准差
np.var # 方差
np.median # 中位数

5 映射函数

apply_along_axis()函数与R语言中的apply函数用法一致,可以针对某个轴的方向进行函数操作,同样,在pandas模块的DataFrmae对象中,可以使用apply函数达到相同的效果。
语法:

numpy.apply_along_axis(func, axis, arr, *args, **kwargs)

必选参数:func, axis, arr。其中func是我们自定义的一个函数;axis表示函数func对数组arr作用的轴,axis=1表示操作行,axis=0表示操作列;arr是一个数组,即函数计算的对象。
可选参数:*args, **kwargs。都是func()函数额外的参数。
返回值:numpy.apply_along_axis()函数返回的是一个根据func()函数以及维度axis运算后得到的的数组。

# 输入:
import numpy as np
a = np.array([[1,4,7],[2,5,8],[3,6,9]])
print(a)
print(np.apply_along_axis(np.mean,1,a)) # 计算矩阵每行的均值
print(np.apply_along_axis(np.sum,0,a)) # 计算矩阵每列的和
# 输出:
[[1 4 7]
 [2 5 8]
 [3 6 9]]
[ 4.  5.  6.]
[ 6 15 24]

6 随机数生成

numpy模块中的子模块random提供了很多产生随机数的方法,帮我们产生伪数据带来了极大的方便。有时候为了使每次产生的随机数都相同,就需要设置固定的随机种子(比如1),设置随机种子可以调用seed函数实现。

# 输入:
import numpy as np
np.random.seed(1)
a = np.random.random()
print(a)
np.random.seed(1)
a = np.random.random()
print(a)
np.random.seed()
a = np.random.random()
print(a)
np.random.seed()
a = np.random.random()
print(a)
# 输出:
0.417022004702574
0.417022004702574
0.10266849881339712
0.7271798615004479

7 离散分布

7.1 二项分布

二项分布在概率论和统计学中,二项分布是n个独立的是/非试验中成功的次数的离散概率分布,其中每次试验的成功概率为p。所以n次中有k次成功的概率可以表示为:

f(k;n,p)=Cknpk(1p)nk f ( k ; n , p ) = C n k p k ( 1 − p ) n − k

np.random.binomial(n,p,size=x)函数返回的是x个符合二项分布的随机数,另外size参数可以用来控制生成的随机数的形状,如size = 10表示一个10个长度的一维数组;size = (3,5)表示一个3×5的矩阵。

输入:
import numpy as np
np.random.seed(1)
n, p = 2, .5
a = np.random.binomial(n, p, size=10)
print(a)
b = np.random.binomial(n, p, size=(3,5))
print(b)
输出:
[1 1 0 1 0 0 0 1 1 1]
[[1 1 0 2 0]
 [1 1 1 0 0]
 [2 2 1 1 2]]

7.2 泊松分布

大量事件是有固定频率的,比如某路口平均每天发生事故次数2次,那么想知道在此处一天内发生4次事故的概率是多少就需要用到泊松分布:描述某段时间内,事件具体的发生概率。公式如下:

P(N(t)=n)=(λt)neλtn! P ( N ( t ) = n ) = ( λ t ) n e − λ t n !

P 表示概率,N表示某种函数关系,t 表示时间,n 表示数量,一天内发生2次事故的概率,就表示为 P(N(1) = 2) ,λ 表示事件的频率。
故在此处一天内发生4次事故的概率为:

P(N(1)=4)=(21)4e214!0.09 P ( N ( 1 ) = 4 ) = ( 2 ∗ 1 ) 4 e − 2 ∗ 1 4 ! ≈ 0.09

np.random.poisson(lam, size=x)返回的是x个符合泊松分布的随机数,lam相当于λ,也即是事件的频率。

# 输入:
import numpy as np
np.random.seed(1) #设置随机种子,保证每次运行都会出现相同的随机数
r3 = np.random.poisson(lam=6,size=10)
print(r3,'\n')
r4 = np.random.poisson(lam=(10,50,20),size=(5,3))
print(r4,'\n')
# 输出:
[2 3 7 7 4 6 5 6 2 4] 

[[11 52 13]
 [12 34 22]
 [17 61 19]
 [16 55 26]
 [12 45 22]]

上面例子生成3列泊松分布的数据,lamda参数分别取10,50,20,表示单位时间内某件事发生的频次。

8 连续分布

8.1 正态分布

该分布也成高斯分布,呈现两头低,中间高,左右对称的倒钟形状,是连续分布中使用最频繁的一种分布。正态分布由两个参数描述:分布的期望值μ和方差σ^2 ,当μ=0、σ^2 =1时,称为标准正态分布。其公式如下:

f(x;μ,σ)=1σ2πe(xμ)22σ2 f ( x ; μ , σ ) = 1 σ 2 π e − ( x − μ ) 2 2 σ 2

np.random.normal(loc,scale,size=x)返回的是x个符合正态分布的随机数,loc为均值,scale为标准差。

# 输入:
import numpy as np
np.random.seed(1) #设置随机种子,保证每次运行都会出现相同的随机数
# 均值为2,标准差为3的正态分布
r5 = np.random.normal(loc = 2, scale = 3, size = 10)
print(r5,'\n')
r6 = np.random.normal(loc = 2, scale = 3, size = (3,5))
print(r6)
# 输出:
[ 6.87303609  0.16473076  0.41548474 -1.21890587  4.59622289 -4.90461609
  7.23443529 -0.2836207   2.95711729  1.25188887] 

[[ 6.38632381 -4.18042213  1.03274839  0.84783694  5.40130833]
 [-1.2996738   1.48271538 -0.63357525  2.12664124  3.74844564]
 [-1.30185753  5.43417113  4.70477216  3.50748302  4.70256785]]

8.2 其他常用分布

# 输入:
import numpy as np
np.random.seed(1) #设置随机种子,保证每次运行都会出现相同的随机数
r7 = np.random.standard_t(df = 3, size = (2,3)) # 自由度为3的t分布
print(r7,'\n')
r8 = np.random.f(dfnum = 2, dfden = 5, size = (3,5)) # 自由度为25的f分布
print(r8,'\n')
r9 = np.round(np.random.uniform(size = (3,4), low = 1, high = 10),0) # 110之间的均匀分布,并四舍五入取整
print(r9,'\n')
# 输出:
[[ 2.52088116 -1.13756823 -1.09478858]
 [-1.70781334  0.40792799 -0.50672438]] 

[[ 0.12167855  0.65503307  1.71293129  1.44691121  2.54191617]
 [ 0.06964423  6.16774986  0.04916023  0.28635355  4.41972259]
 [ 1.60388551  1.11849708  0.01890469  2.49884978  3.6290282 ]] 

[[  9.   4.   8.   8.]
 [  9.   7.   8.   4.]
 [  3.   9.   5.  10.]]

9 数据加载

numpy模块还提供了读取数据与写数据的函数,方便我们将外部数据文件读入到Python的工作环境中。这里推荐两个读数据的函数:np.loadtxt()和np.genfromtxt()

# 输入:
data1 = np.loadtxt(fname = 'loadtxt.txt', delimiter = ',', skiprows = 1)
date2 = np.genfromtxt(fname = 'loadtxt.txt', delimiter = ',', skip_header = 1, usecols = [0,2])
print(data1,'\n')
print(date2)
# 输出:
[] 

[]

注意:
- fname:指定外部文件的路径
- delimiter:指定文件中数据列的分隔符
- skiprows:指定读数时跳过的行数
- skip_header:指定跳过首行
- usecols:指定读取的数据列
- loadtxt函数和genfromtxt函数读入数据形成数组,故必须要求读进来的数据一定是数值型数据,否则会报错。

10 数据写出

通过使用numpy模块中的savetxt函数实现python数据的写出,函数语法如下:

np.savetxt(fname, X, fmt='%.18e', delimiter=' ', newline='\n', header='', footer='', comments='# ')

其中:

  • fname:指定数据写出的路径
  • X:指定需要写出的数据
  • fmt:指定输出数据的格式,默认科学计算法
  • delimiter:指定数据列之间的分隔符,默认空格符
  • newline:指定新行的标识符,默认换行
  • header:指定输出数据首行值
  • footer:指定输出数据的末行值
  • comments:指定注释符,默认“#”
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值