0%

python 科学计算 — numpy 学习笔记

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
[ 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
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:

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
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:

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
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
4 4
5 5 4

 

利用':'可以访问到某一维的全部数据:

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

 

参考资料:

请我喝杯咖啡吧~