python numpy的学习笔记
要使用numpy,首先需要import进来:
建议使用别名np,因为你会发现这几乎是一个大家都在用的写法!
1 |
import numpy as np |
一、创建数组
1.和list类似,可以直接用arange来表示范围:
1 2 3 |
import numpy as np a = np.arange(10) print a |
Output:
1 |
[0 1 2 3 4 5 6 7 8 9] |
从[2,20)间隔为3的等差数列
1 2 3 |
import numpy as np a = np.arange(2,20,3) print a |
Output:
1 |
[ 2 5 8 11 14 17] |
类似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的随机数:
1 |
np.random.rand(5) |
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 |
a.reshape(-1, 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 |
[[[ 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:
1 |
[1 2 3 4 5 6] |
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 |
[[ 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 |
[[ 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:
1 |
[4 6] |
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 |
[ 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 |
[[ 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 |
4 4 5 5 4 |
利用’:’可以访问到某一维的全部数据:
1 2 3 4 5 6 |
# -*- 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 |
[[ 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 |
# -*- 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 |
[[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 |
# -*- 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 |
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 |
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 |
参考资料:
- 量化分析师的Python日记【第3天:一大波金融Library来袭之numpy篇】
- python 科学计算 -张若愚
本博客若无特殊说明则由 hrwhisper 原创发布
转载请点名出处:细语呢喃 > python 科学计算 — numpy 学习笔记
本文地址:https://www.hrwhisper.me/learning-notes-for-python-numpy/
还不错哦
提示Traceback (most recent call last): File “”, line 1, in ImportError: No module named ‘numpy’怎么破?
装下numpy包