- 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.]]
- 求和、平均值、方差
函数名 | 功能 | 函数名 | 功能 |
---|---|---|---|
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)
- 大小与排序
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个元素落在0到0.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