为什么使用NumPy而不是list,是因为list元素在系统内存中是分散存储的,而NumPy数组存储在一个均匀连续的内存块中,这样数组计算遍历所有的元素,不像list还需要对内存地址进行查找,从而节省计算资源。
并且在内存访问中,缓存会直接把字节块从RAM加载到CPU寄存器中,因为数据连续存储在内存中,NumPy直接利用现代CPU的矢量化指令运算,加载寄存器中的多个连续浮点数,另外NumPy中的矩阵运算可以采用多线程的方式,充分利用多核CPU计算资源,大大提升了计算效率。
有关这一部分,完全云里雾里的,不太懂,只知道数组比list要好。
提高内存和计算资源利用率的一个重要规则:避免隐式拷贝,采用就地操作的方式!
NumPy有重要的两个对象:ndarray(N-dimensional array object,解决多维数组问题)和ufunc(universal function object 解决对数组进行处理的函数)
(一)创建数组
import numpy as np
a = np.array([1, 2, 3])
b = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
b[1,1]=10
print a.shape
print b.shape
print a.dtype
print b
运行结果:
(3L,)
(3L, 3L)
int32
[[ 1 2 3]
[ 4 10 6]
[ 7 8 9]]
多重数组可以通过数组嵌套来实现,如b中的[1,2,3]就是一个元素;shape获得数组大小;dtype获得元素属性;对数组中的值进行修改的话,直接赋值,下标从0开始。
结构数组
import numpy as np
persontype = np.dtype({
'names':['name', 'age', 'chinese', 'math', 'english'],
'formats':['S32','i', 'i', 'i', 'f']})
peoples = np.array([("ZhangFei",32,75,100, 90),("GuanYu",24,85,96,88.5),
("ZhaoYun",28,85,92,96.5),("HuangZhong",29,65,85,100)],
dtype=persontype)
ages = peoples[:]['age']
chineses = peoples[:]['chinese']
maths = peoples[:]['math']
englishs = peoples[:]['english']
print np.mean(ages)
print np.mean(chineses)
print np.mean(maths)
print np.mean(englishs)
运行结果:
28.25
77.5
93.25
93.75
由于前面自己没有学过numpy,只能自己大概理解一下老师的例子然后记住,在这个例子里面首先定义了一个结构类型,然后在定义数组时,讲数组类型设置为自定义结构类型。注意区分括号类型。
连续数组的创建
x1 = np.arange(1,11,2)
x2 = np.linspace(1,9,5)
都是创建等差数组,最后结果一样都是[1,3,5,7,9],arrage()类似于内置的range()函数,通过初始值、终值、步长来创建等差数列的一维数组,默认不包括终值
linspace()通过初始值、终值、元素个数创建等差数列的一维数组,默认包括终值
算数运算
加、减、乘、除、求n次方和取余数。
x1 = np.arange(1,11,2)
x2 = np.linspace(1,9,5)
print np.add(x1, x2)
print np.subtract(x1, x2)
print np.multiply(x1, x2)
print np.divide(x1, x2)
print np.power(x1, x2)
print np.remainder(x1, x2)
求余数也可以是:mod()
统计函数
(1)计算数组/矩阵中的最大值函数amax(),最小值函数amin()
import numpy as np
a = np.array([[1,2,3], [4,5,6], [7,8,9]])
print np.amin(a)
print np.amin(a,0)
print np.amin(a,1)
print np.amax(a)
print np.amax(a,0)
print np.amax(a,1)
运行结果:
1
[1 2 3]
[1 4 7]
9
[7 8 9]
[3 6 9]
amin(a)指的是数组中全部元素的最小值,amin(a,0)是沿着axis=0轴的最小值,axis=0轴即是列,axis=1是行
从axis=0看,即从列看,每一列的最小值是[1,2,3],axis=1即从行看,每行的最小值是[1,4,7]
(2)统计最大值与最小值之差ptp()
a = np.array([[1,2,3], [4,5,6], [7,8,9]])
print np.ptp(a)
print np.ptp(a,0)
print np.ptp(a,1)
运行结果是:
8
[6 6 6]
[2 2 2]
ptp()统计数组中最大值与最小值之差,ptp(a,axis=0)是从列看,统计每一列最大值与最小值之差;axis=1从行看,统计每一行最大值与最小值之差
(3)统计数组的百分位数percentile()
a = np.array([[1,2,3], [4,5,6], [7,8,9]])
print np.percentile(a, 50)
print np.percentile(a, 50, axis=0)
print np.percentile(a, 50, axis=1)
运算结果:
5.0
[4. 5. 6.]
[2. 5. 8.]
percentile()代表第p个百分位数,p的取值是0-100,p=0就是最小值,p=50就是平均值,p=100求最大值。
(4)统计数组中的中位数median()、平均数mean()
(5)统计数组中的加权平均值average()
a = np.array([1,2,3,4])
wts = np.array([1,2,3,4])
print np.average(a)
print np.average(a,weights=wts)
运行结果:
2.5
3.0
默认每个元素权重一样
(6)统计数组中的标准差std()、方差var()
NumPy排序
sort(a,axis=-1,kind='quicksort',order=None),在kind里面可以指定quicksort、mergesort、heapsort分别表示快速排序、合并排序、堆排序;axis=1-就是沿着数组的最后一个轴进行排序,axis=None代表采用扁平化方式作为一个向量进行排序。
a = np.array([[4,3,2],[2,4,1]])
print np.sort(a)
print np.sort(a, axis=None)
print np.sort(a, axis=0)
print np.sort(a, axis=1)
运行结果:
[[2 3 4]
[1 2 4]]
[1 2 2 3 4 4]
[[2 3 1]
[4 4 2]]
[[2 3 4]
[1 2 4]]