python numpy的学习笔记 要使用numpy,首先需要import进来:
建议使用别名np,因为你会发现这几乎是一个大家都在用的写法!
一、创建数组
1.和list类似,可以直接用arange来表示范围:
1 2 3 import numpy as np a = np.arange(10) print a
Output:
从[2,20)间隔为3的等差数列
1 2 3 import numpy as np a = np.arange(2,20,3) print a
Output:
类似arange,linspace从[start , stop ] 生成num个数,Num个数间隔相等。(默认为float)
linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
1 print np.linspace(0, 2, 9)
Output:
1 [ 0. 0.25 0.5 0.75 1. 1.25 1.5 1.75 2. ]
2.用list/tuple创建数组(list也可以是二维的)
1 2 3 import numpy as np a = np.array([range(5)]) print a
3.快速生成x*y的全零数组
1 2 d=(2,3) #(2,3,4)变为3维 print np.zeros(d)
Output:
1 2 [[ 0. 0. 0.] [ 0. 0. 0.]]
默认生成的类型是浮点型 可以用dtype改为int
1 2 d = (4, 5) print np.ones(d, dtype=int)
还可以通过zeros_like生成相同形状的全0数组,如:
1 img = np.zeros_like(image)
0~1的随机数:
3.一维转化为二维数组 reshape
1 2 3 a= np.arange(10) a = a.reshape(2, 5) print a
Output:
1 2 [[0 1 2 3 4] [5 6 7 8 9]]
PS:
这个会根据列来自动适应行!
下面这句在a=np.arange(10)等价于a = a.reshape(2, 5)
在a=np.arange(20)等价于a = a.reshape(4, 5)!
甚至可以转化为更高维的:
1 2 3 4 import numpy as np a = np.arange(20) a = a.reshape(2,2,5) print a
Output:
1 2 3 4 5 6 7 [[[ 0 1 2 3 4] [ 5 6 7 8 9]] [[10 11 12 13 14] [15 16 17 18 19]]]
当然,也可以二维转化一维的:ravel
1 2 3 import numpy as np a = np.array([[1,2,3],[4,5,6]]) print np.ravel(a)
Output:
4. 切割vsplit和hsplit
vsplit和hsplit用法差不多,差别在于:vsplit来进行分行,而hsplit来分列(即作用于同一行中)。
numpy.vsplit(ary, indices_or_sections)
(1)指定切分个数(需要行数能被切分的个数整除)
看下面的代码,生成了6*3的数组,用vsplit切分为3个。
1 2 3 4 import numpy as np a = np.arange(18).reshape(-1,3) print a,'\n' print np.vsplit(a,3)
Output:
1 2 3 4 5 6 7 8 9 10 11 12 13 [[ 0 1 2] [ 3 4 5] [ 6 7 8] [ 9 10 11] [12 13 14] [15 16 17]] [array([[0, 1, 2], [3, 4, 5]]), array([[ 6, 7, 8], [ 9, 10, 11]]), array([[12, 13, 14], [15, 16, 17]])]
(2)指定位置切分
我只改动了最后一行,将vsplit第二个参数改为一个List,来指定切分的位置。
1 2 3 4 import numpy as np a = np.arange(18).reshape(-1,3) print a,'\n' print np.vsplit(a,[1,5])
Output:
1 2 3 4 5 6 7 8 9 10 11 12 13 [[ 0 1 2] [ 3 4 5] [ 6 7 8] [ 9 10 11] [12 13 14] [15 16 17]] [array([[0, 1, 2]]), array([[ 3, 4, 5], [ 6, 7, 8], [ 9, 10, 11], [12, 13, 14]]), array([[15, 16, 17]])]
5.查看数组属性
ndim :维度 shape:各维度的大小 size:全部的元素个数 dtype:查看元素类型 type:数组的类型
1 2 3 4 5 6 7 8 import numpy as np a = np.arange(20) a = a.reshape(2,2,5) print a.ndim #a的维度 print a.shape #a的各维度的大小 print a.size #a的全部的元素个数 print a.dtype #a的元素类型 print type(a) #a的类型
Output:
1 2 3 4 5 3 (2L, 2L, 5L) 20 int32 <type 'numpy.ndarray'>
二、数组操作
1.四则运算
+','-','*','/'运算都是基于全部的数组元素的
1 2 3 4 import numpy as np a = np.array([1,2]) b= np.array([3,4]) print a+b
Output:
2.开根号/指数
1 2 3 4 5 6 7 import numpy as np a = np.array([1,2]) print np.sqrt(a) print np.exp(a) print np.square(a) print np.power(a,5) print a ** 5 #可以用Power也可以直接 ** ,当然这么写比较爽
Output:
1 2 3 4 5 6 [ 1. 1.41421356] [ 2.71828183 7.3890561 ] [1 4] [ 1 32] [ 1 32]
3.数组最大最小值
1 2 3 4 5 6 7 8 import numpy as np a = np.arange(20).reshape(4,5) print a print a.min() print a.max() print a.sum() print a.min(axis=0) #minimun element in each column print a.min(axis=1) #minimun element in each row
Output:
1 2 3 4 5 6 7 8 9 10 [[ 0 1 2 3 4] [ 5 6 7 8 9] [10 11 12 13 14] [15 16 17 18 19]] 0 19 190 [0 1 2 3 4] [ 0 5 10 15]
numpy.ptp(a, axis=None, out=None)
返回最大和最小值之差
4.数组的均值/中位数
1 2 3 4 import numpy a =range(5) +[1000] print a print numpy.mean(a),numpy.median(a)
Output:
1 2 [0, 1, 2, 3, 4, 1000] 168.333333333 2.5
5.数组取值
可以直接用下标对齐取值,注意直接赋值的话是浅拷贝!(即a赋给b,意味着b指向了a对应数据的内存地址)
想要真正的复制一份a给b,可以使用copy:
1 2 3 4 5 6 7 8 # -*- coding:utf-8 -*- import numpy as np a = np.array([[1, 2], [3, 4]]) b = a #浅拷贝! c = a.copy() #深拷贝 np.copy(a) print a[1,1],a[1][1] b[1][1]=5 print a[1][1],b[1][1],c[1][1]
Output:
利用':'可以访问到某一维的全部数据:
1 2 3 4 5 6 7 # -*- coding:utf-8 -*- import numpy as np a = np.arange(20).reshape(4, 5) print a print '\n',a[:,[1,3]] #取出a的每一行的第2个和第4个元素 print '\n',a[:,2][a[:,0] > 5] #取出a中的第3列的元素,如果该行第1个元素 >5
Output:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 [[ 0 1 2 3 4] [ 5 6 7 8 9] [10 11 12 13 14] [15 16 17 18 19]] [[ 1 3] [ 6 8] [11 13] [16 18]] [12 17]
6.数组拼接
使用hstack 横向拼接
使用vstack 纵向拼接
1 2 3 4 5 6 7 8 import numpy as np import numpy.linalg as nlg a = np.array([1,2,3]) b = np.array([4,5,6]) c = np.hstack([a,b]) d = np.vstack([a,b]) print c print d
Output:
1 2 3 [1 2 3 4 5 6] [[1 2 3] [4 5 6]]
三、矩阵对象
矩阵对象和数组的主要有两点差别:
矩阵是二维的,而数组的可以是任意正整数维
矩阵的''操作符进行的是矩阵乘法,乘号左侧的矩阵列和乘号右侧的矩阵行要相等,而在数组中' '操作符进行的是每一元素的对应相乘,乘号两侧的数组每一维大小需要一致
1.创建矩阵
1 2 3 4 5 6 7 8 9 10 # -*- coding:utf-8 -*- import numpy as np a = np.arange(5) a = np.mat(a) #use np.mat(a) or np.asmatrix(a) print a,type(a) b = np.mat('1.0 2.0; 3.0 4.0') # you can use np.matrix() print b,type(b)
Output:
1 2 3 4 [[0 1 2 3 4]] <class 'numpy.matrixlib.defmatrix.matrix'> [[ 1. 2.] [ 3. 4.]] <class 'numpy.matrixlib.defmatrix.matrix'>
2.矩阵乘法
为了比较和数组的乘法,特地将b设为单位阵。
1 2 3 4 5 6 7 8 9 10 11 # -*- coding:utf-8 -*- import numpy as np a = np.array([[1, 2], [3, 4]]) b = np.array([[1, 0], [0, 1]]) print 'a=', a, '\nb=', b print print 'array : a*b:' print a * b print 'matrix: a*b:' print np.asmatrix(a) * np.asmatrix(b)
Output:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 a= [[1 2] [3 4]] b= [[1 0] [0 1]] array : a*b: [[1 0] [0 4]] matrix: a*b: [[1 2] [3 4]]
3.矩阵转置
1 2 3 4 5 # -*- coding:utf-8 -*- import numpy as np a = np.array([[1, 2, 3], [4, 5, 6]]) print np.transpose(a) #对于数组,用transpose print np.matrix(a).T #对于矩阵,直接T
Output:
1 2 3 4 5 6 [[1 4] [2 5] [3 6]] [[1 4] [2 5] [3 6]]
4.矩阵求逆
1 2 3 4 5 6 import numpy as np import numpy.linalg as nlg a = np.mat([[1,2],[4,4]]) print a b = nlg.inv(a) print a*b
Output:
1 2 3 4 [[1 2] [4 4]] [[ 1. 0.] [ 0. 1.]]
5.特征值和特征向量
1 2 3 4 5 6 7 8 import numpy as np import numpy.linalg as nlg a = np.random.rand(3,3) eig_value, eig_vector = nlg.eig(a) print "eigen value:" print eig_value print "eigen vector:" print eig_vector
Output:
1 2 3 4 5 6 7 eigen value: [ 1.35205837 -0.22652725 0.12474347] eigen vector: [[-0.66475046 -0.42263921 0.031526 ] [-0.54161542 0.70097608 -0.45506146] [-0.51454792 -0.57446378 0.88990178]]
四、其它
1.缺失值处理
NumPy用nan作为缺失值,可以用isnan判定:
1 2 3 4 import numpy as np a = np.random.rand(2,2) a[0, 1] = np.nan print np.isnan(a)
nan_to_num()可用来将nan替换成0
2.统计函数
np.bincount(a) :对整数数组中各个元素出现的次数进行统计,它要求数组中所有元素都是非负 的,返回值中,第i个元素表示第i个元素在a中出现的次数。
3.比较函数
直接用==比较
对于相同长度的,返回一个numpy数组,每个元素为相应位置上是否相等.
长度不相同,返回False
1 2 3 4 5 import numpy as np a = np.arange(5) b = np.array([0,1,2,4,3]) print a==b print a==np.array([0,1,2,4,3,5])
Output:
1 2 [ True True True False False] False
参考资料: