Numpy与统计学

  1. Numpy产生随机数

Random模块提供了许多产生符合特定随机分布的随机数的函数,他们的最后一个参数size都用于指定输出数组的形状,而其他参数都是分布函数的参数。

  • normal():正态分布,前两个参数分别为期望和标准差。
  • uniform():均与分布,前两个参数分别为区间的起始值和终值。
  • possion():泊松分布,第一个参数是 λ 系数,表示单位时间内随机事件的平均发生率。

permutation()和shuffle()函数
permutation()可以用于产生一个乱序数组,当参数为n时,他返回[0,n)这n个整数的随机排列;当参数作为一个序列时,他返回一个随机排列后的序列。而shuffle()则直接将参数数组的顺序打乱。

from numpy import random as nr
a = np.array([1,10,20,30,40])
print nr.permutation(10)
print nr.permutation(a)
print a

[3 2 6 0 9 4 8 5 1 7]
[20  1 40 30 10]
[ 1 10 20 30 40]
nr.shuffle(a)
print a
[20  1 10 40 30]

choice()从指定样本中进行随机抽样

  • size()参数用于指定输出数组的形状。
  • replace参数为True时,可重复抽样,默认为True。
  • p参数指定每个元素对应的抽取概率,不指定默认相同。
import numpy as np
from numpy import random as nr
a = np.arange(1, 20, dtype=float)
x = nr.choice(a, size=(6, 3))
y = nr.choice(a, size=(6,3), replace=False)
z = nr.choice(a,size=(6,3), p = a/np.sum(a))
print x
print y
print z

[[  9.  12.  11.]
 [  1.  11.   2.]
 [ 10.  17.   8.]
 [ 19.   4.   6.]
 [ 13.   7.   2.]
 [ 15.  10.  19.]]
[[ 15.  10.   1.]
 [ 12.  19.  16.]
 [  7.  14.   6.]
 [  3.   5.  17.]
 [ 13.   8.   4.]
 [  2.  11.  18.]]
[[ 19.  11.   6.]
 [ 18.   7.  13.]
 [  9.  10.  15.]
 [ 13.  19.  16.]
 [ 18.  15.  19.]
 [ 14.  17.   7.]]
  1. 求和、平均值、方差
函数名功能函数名功能
sum求和mean求期望
average加权平均数std标准差
var方差product连乘积
import numpy as np
from numpy import random as nr
a = nr.randint(0,20,size=(4,5))
print a
print np.sum(a, axis=0)
[[10  2 19  6 19]
 [10 10 19 15  0]
 [ 2 19  0  9  1]
 [ 9  7  8 18 19]]
[31 38 46 48 39]
#如果希望能够保持原数组的维数
print np.sum(a, 1, keepdims=True)
[[12  8  2  3 14]
 [ 6 18 15  2 11]
 [10 17  8 17  8]
 [15 11 12  2 13]]
[[39]
 [52]
 [60]
 [53]]

对很大的单精度浮点数类型的数组进行计算时,也可能出现精度不够的现象,这时可以通过dtype参数指定累加变量的类型。
mean计算数组的均值参数和sum()相同,不同的是:mean对于整数数组使用双精度浮点数进行计算,其他类型的数组,和元素类型相同进行运算。

  • std和var, ddof参数为0时,计算偏样本方差,为1时计算无偏样本方差,默认为0.
import numpy as np
from numpy import random as nr
a = nr.normal(0, 2.0, (1000,10000))
v1 = np.var(a, ddof=0)
v2 = np.var(a, ddof=1)
print np.mean(v1)
print np.mean(v2)
  1. 大小与排序

lexsort()函数,返回的数排序后的下标

import numpy as np
names = ["zhang","wang","li","wang","zhang"]
ages = [37, 33, 32, 50, 36]
idx1 = np.lexsort([ages, names])
idx2 = np.lexsort([names, ages])

sorted_data = np.array(zip(names, ages))[idx1]
print sorted_data
sorted_data = np.array(zip(names, ages))[idx2]
print sorted_data
[['li' '32']
 ['wang' '33']
 ['wang' '50']
 ['zhang' '36']
 ['zhang' '37']]
[['li' '32']
 ['wang' '33']
 ['zhang' '36']
 ['zhang' '37']
 ['wang' '50']]
  • 统计函数
函数名功能函数名功能
unique去除重复元素bincount对整数数组的元素计数
histogram一维直方图统计digitze离散化
  • unique()返回其参数数组中所有不同的值,并且按照从小到大的顺序排列。他有两个可选参数:return_index:True表示同时返回原始数组中的下标。return_inverse:True表示原始数组在数组x中的下标。
 import numpy as np
a = np.random.randint(0, 8, 10)
x, index = np.unique(a, return_index=True)
y,yindex = np.unique(a, return_inverse=True)
print a
print x

print index
print y
print yindex
 [7 7 5 1 4 4 1 4 6 5]
[1 4 5 6 7]
[3 4 2 8 0]
[1 4 5 6 7]
[4 4 2 0 1 1 0 1 3 2]
  • histogram()对一维数组进行直方图统计,其参数列表如下:
    histogram(a,bins=10,range=None,weights=None,density=False)

a是待统计的数组,bins指定统计的区间的个数,ranges是一个长度为2的元组,表示统计范围的最大值和最小值,默认为None.当density参数为False时,函数返回a中的数据在每个区间的个数,为True时返回每个区间的概率密度。weights表示每个元素的权值。
histogram()返回两个一维数组——hist和bin_edges。第一个数组是每个区间的统计结果,第二个数组的长度为len(hist)+1,每两个相邻的数值构成一个统计区间。

import numpy as np
a = np.random.rand(100)
hist,bin = np.histogram(a, bins=5,range=(0, 1))
print hist
print bin
[14 21 21 24 20]
[ 0.   0.2  0.4  0.6  0.8  1. ]
表示有14个元素落在00.2之间。。。。

如果需要统计的区间长度不等

import numpy as np
a = np.random.rand(100)
hist,bin = np.histogram(a, bins=[0,0.4,0.8,1.0],range=(0, 1))
print hist
print bin
[37 48 15]
[ 0.   0.4  0.8  1. ]

4.分段函数

函数名功能
where矢量化判断表达式
piecewise分段函数
select多分支判断选择
x = np.range(10)
print np.where(x<5,9-x,x)
[9 8 7 6 5 5 6 7 8 9]
#如果x<5,选择的是9-x
x = np.arange(20)
print np.select([x>=10, x<5, True],
                [20-x, x+5, x])
x>=10时选择20-x,x<5时选择x+5,都不满足时选择x

import numpy as np
a = np.arange(20)
print np.piecewise(a,
                [a>=10,a<5],
                [10,  #a>=10    常数时
                lambda x:x+5,  # x<5,函数用lambda函数
                lambda x:x+1  ] )#其他

5.多维数组

函数名功能函数名功能
concatente连接多个数组vstack沿第0轴连接数组
hstack沿第一轴连接数组column_stack按列连接多个一维数组
split、array_split将数组分为多段transpose重新设置轴的顺序
swqpaxes交换两个轴的顺序

- concatenate(),第一个参数是包含多个数组的序列,他将沿着axis指定的轴(默认为0)连接数组。

import numpy as np
a = np.arange(16).reshape(4, 4)
c = np.concatenate([a,a])
print c
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]
 [ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]]

6.各种乘积运算:

函数名功能函数名功能
dot矩阵乘积inner内积
outter外积tensordot张量乘积

7.动态数组:

np.frombuffer()将array()数组的数据直接转换为Numpy数组。

import numpy as np
from array import array
a = array("d",[1,2,3,4])#创建一个array数组,类型为double
na = np.frombuffer(a,dtype=np.float)
通过np创建一个和a共享内存的Numpy数组
print a
print nan[1] = 20
print a

array('d', [1.0, 2.0, 3.0, 4.0])
[ 1.  2.  3.  4.]
[  1.  20.   3.   4.]

array可以调用append函数,每次添加元素后都要np.frombuffer()重新创建numpy数组。

同时处理多种数据类型:(可以使用bytearry()进行数据采集),bytearry是字节数组,需要用struct模块将python的数值转换为字节表示形式。

import numpy as np
import struct
buf = bytearray()
for i in range(5):
    buf += struct.pack("=hdd", i, np.math.sin(i*0.1), np.math.cos(i*0.1))  #h为短整型数,d为双精度浮点数
dtype = np.dtype({"names":["id", "sin", "cos"], "formats":["h", "d", "d"]})
data = np.frombuffer(buf, dtype = dtype)
print data
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值