概述
python中的矩阵、多维数组----numpy
1. 引言
最近在将一个算法由matlab转成python,初学python,很多地方还不熟悉,总体感觉就是上手容易,实际上很优雅地用python还是蛮难的。目前为止,觉得就算法仿真研究而言,还是matlab用得特别舒服,可能是比较熟悉的缘故吧。matlab直接集成了很多算法工具箱,函数查询、调用、变量查询等非常方便,或许以后用久了python也会感觉很好用。与python相比,最喜欢的莫过于可以直接选中某段代码执行了,操作方便,python也可以实现,就是感觉不是很方便。
言归正传,做算法要用到很多的向量和矩阵运算操作,这些嘛在matlab里面已经很熟悉了,但用python的时候需要用一个查一个,挺烦的,所以在此稍作总结,后续使用过程中会根据使用体验更新。
python的矩阵运算主要依赖numpy包,scipy包以numpy为基础,大大扩展了后者的运算能力。
2. 创建一般的多维数组
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
3. 创建特殊类型的多维数组
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
|
使用numpy.set_printoptions可以设置numpy变量的打印格式
在ipython环境下,使用help(numpy.set_printoptions)查询使用帮助和示例
4. 多维数组的基本操作
加法和减法操作要求操作双方的维数信息一致,均为M*N为数组方可正确执行操作。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
|
多维数组操作过程中的类型转换
When operating with arrays of different types, the type of the resulting array corresponds to the more general or precise one (a behavior known as upcasting)
即操作不同类型的多维数组时,结果自动转换为精度更高类型的数组,即upcasting
1 2 3 4 |
|
1 2 3 4 5 6 7 8 9 10 |
|
多维数组的一元操作,如求和、求最小值、最大值等
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
|
universal functions
1 2 3 4 5 |
|
其他的ufunc函数包括:
all, any, apply_along_axis, argmax, argmin, argsort, average, bincount, ceil, clip, conj, corrcoef, cov, cross, cumprod, cumsum, diff, dot, floor,inner, lexsort, max, maximum, mean, median, min, minimum, nonzero, outer, prod, re, round, sort, std, sum, trace, transpose, var,vdot, vectorize, where
5. 数组索引、切片和迭代
1 2 3 4 5 6 |
|
1 2 3 4 5 6 7 8 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
|
详查以下函数:
ndarray.shape, reshape, resize, ravel
6. 组合不同的多维数组
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
|
详细使用请查询以下函数:
hstack, vstack, column_stack, concatenate, c_, r_
7. 将较大的多维数组分割成较小的多维数组
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
实现类似功能的函数包括:
hsplit,vsplit,array_split
8. 多维数组的复制操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
|
numpy基本函数和方法一览
Array Creation
arange, array, copy, empty, empty_like, eye, fromfile, fromfunction, identity, linspace, logspace, mgrid, ogrid, ones, ones_like, r, zeros,zeros_like
Conversions
ndarray.astype, atleast_1d, atleast_2d, atleast_3d, mat
Manipulations
array_split, column_stack, concatenate, diagonal, dsplit, dstack, hsplit, hstack, ndarray.item, newaxis, ravel, repeat, reshape, resize,squeeze, swapaxes, take, transpose, vsplit, vstack
Questionsall, any, nonzero, where
Ordering
argmax, argmin, argsort, max, min, ptp, searchsorted, sort
Operations
choose, compress, cumprod, cumsum, inner, ndarray.fill, imag, prod, put, putmask, real, sum
Basic Statistics
cov, mean, std, var
Basic Linear Algebra
cross, dot, outer, linalg.svd, vdot
完整的函数和方法一览表链接:
https://docs.scipy.org/doc/numpy-dev/reference/routines.html#routines
9. 特殊的索引技巧
1 a = np.arange(12)**2
2 输出:
3 array([
0,
1,
4, ...,
81, 100, 121])
4 i = np.array([1,1,3,8,5])
5 a[i]
6 输出:
7 array([ 1,
1,
9, 64, 25])
8
9 j = np.array([[3,4],[9,7]])
10 a[j]
11 输出:
12 array([[ 9, 16],
13
[81, 49]])
14
15
16 palette = np.array([[0,0,0],[255,0,0],[0,255,0],[0,0,255],[255,255,255]])
17 image = np.array([[0,1,2,0],[0,3,4,0]])
18 palette[image]
19 输出:
20 array([[[
0,
0,
0],
21
[255,
0,
0],
22
[
0, 255,
0],
23
[
0,
0,
0]],
24
25
[[
0,
0,
0],
26
[
0,
0, 255],
27
[255, 255, 255],
28
[
0,
0,
0]]])
29
30
31 i = np.array([[0,1],[1,2]])
32 j = np.array([[2,1],[3,3]])
33 a[i,j]
34 输出:
35 array([[ 2,
5],
36
[ 7, 11]])
37 l = [i,j]
38 a[l]
39 输出:
40 array([[ 2,
5],
41
[ 7, 11]])
42
43
44 a[i,2]
45 输出:
46 array([[ 2,
6],
47
[ 6, 10]])
48
49 a[:,j]
50 输出:
51 array([[[ 2,
1],
52
[ 3,
3]],
53
54
[[ 6,
5],
55
[ 7,
7]],
56
57
[[10,
9],
58
[11, 11]]])
s = np.array([i,j])
print(s)
array([[[0, 1],
[1, 2]],
[[2, 1],
[3, 3]]])
a[tuple(s)]
输出:
array([[ 2,
5],
[ 7, 11]])
print(tupe(s))
输出:
(array([[0, 1],
[1, 2]]), array([[2, 1],
[3, 3]]))
10. 寻找最大值/最小值及其对应索引值
time = np.linspace(20, 145, 5)
输出:
array([
20.
,
51.25,
82.5 ,
113.75,
145.
])
data = np.sin(np.arange(20)).reshape(5,4)
输出:
array([[ 0.
,
0.84147098,
0.90929743,
0.14112001],
[-0.7568025 , -0.95892427, -0.2794155 ,
0.6569866 ],
[ 0.98935825,
0.41211849, -0.54402111, -0.99999021],
[-0.53657292,
0.42016704,
0.99060736,
0.65028784],
[-0.28790332, -0.96139749, -0.75098725,
0.14987721]])
ind = data.argmax(axis=0)
输出:
array([2, 0, 3, 1], dtype=int64)
time_max = time[ind]
输出:
array([
82.5 ,
20.
,
113.75,
51.25])
data_max = data[ind, xrange(data.shape[1])]
输出:
array([ 0.98935825,
0.84147098,
0.99060736,
0.6569866 ])
np.all(data_max == data.max(axis=0))
输出:
True
a = np.arange(5)
a[[1,3,4]] = 0
print(a)
输出:
array([0, 0, 2, 0, 0])
a = np.arange(5)
a[[0,0,2]] = [1,2,3]
print(a)
输出:
array([2, 1, 3, 3, 4])
a = np.arange(5)
a[[0,0,2]] += 1
print(a)
输出:
array([1, 1, 3, 3, 4])
a = np.arange(12).reshape(3,4)
b = a > 4
输出:
array([[False, False, False, False],
[False,
True,
True,
True],
[ True,
True,
True,
True]], dtype=bool)
a[b]
输出:
array([ 5,
6,
7,
8,
9, 10, 11])
a[b] = 0
print(a)
输出:
array([[0, 1, 2, 3],
[4, 0, 0, 0],
[0, 0, 0, 0]])
a = np.arange(12).reshape(3,4)
b1 = np.array([False,True,True])
b2 = n.array([True,False,True,False])
a[b1,:]
输出:
array([[ 4,
5,
6,
7],
[ 8,
9, 10, 11]])
a[b1]
输出:
array([[ 4,
5,
6,
7],
[ 8,
9, 10, 11]])
a[:,b2]
输出:
array([[ 0,
2],
[ 4,
6],
[ 8, 10]])
a[b1,b2]
输出:
array([ 4, 10])
11. ix_() function
1 a = np.array([2,3,4,5])
2 b = np.array([8,5,4])
3 c = np.array([5,4,6,8,3])
4 ax,bx,cx = np.ix_(a,b,c)
5 print(ax)
# (4L, 1L, 1L)
6 输出:
7 array([[[2]],
8
9
[[3]],
10
11
[[4]],
12
13
[[5]]])
14 print(bx)
# (1L, 3L, 1L)
15 输出:
16 array([[[8],
17
[5],
18
[4]]])
19 print(cx)
# (1L, 1L, 5L)
20 输出:
21 array([[[5, 4, 6, 8, 3]]])
22
23
24 result = ax + bx*cx
25 输出:
26 array([[[42, 34, 50, 66, 26],
27
[27, 22, 32, 42, 17],
28
[22, 18, 26, 34, 14]],
29
30
[[43, 35, 51, 67, 27],
31
[28, 23, 33, 43, 18],
32
[23, 19, 27, 35, 15]],
33
34
[[44, 36, 52, 68, 28],
35
[29, 24, 34, 44, 19],
36
[24, 20, 28, 36, 16]],
37
38
[[45, 37, 53, 69, 29],
39
[30, 25, 35, 45, 20],
40
[25, 21, 29, 37, 17]]])
41
42 result[3,2,4]
43 输出:17
12. 线性代数运算
a = np.array([[1.,2.],[3.,4.]])
a.transpose()
# 转置
np.linalg.inv(a)
# 求逆
u = np.eye(2)
# 产生单位矩阵
np.dot(a,a)
# 矩阵乘积
np.trace(a)
# 求矩阵的迹
y = np.array([5.],[7.]])
np.linalg.solve(a,y)
# 求解线性方程组
np.linalg.eig(a)
# 特征分解
“Automatic” Reshaping
1 a = np.arange(30)
2 a.shape = 2,-1,3
3 a.shape
#
(2L, 5L, 3L)
4 print(a)
5 array([[[ 0,
1,
2],
6
[ 3,
4,
5],
7
[ 6,
7,
8],
8
[ 9, 10, 11],
9
[12, 13, 14]],
10
11
[[15, 16, 17],
12
[18, 19, 20],
13
[21, 22, 23],
14
[24, 25, 26],
15
[27, 28, 29]]])
1 x = np.arange(0,10,2)
2 y = np.arange(5)
3 m = np.vstack([x,y])
4 输出:
5 array([[0, 2, 4, 6, 8],
6
[0, 1, 2, 3, 4]])
7 n = np.hstack([x,y])
8 输出:
9 array([0, 2, 4, 6, 8, 0, 1, 2, 3, 4])
13. 矩阵的创建
a = np.array([1,2,3])
a1 = np.mat(a)
输出:
matrix([[1, 2, 3]])
type(a1)
输出:
numpy.matrixlib.defmatrix.matrix
a1.shape
输出:
(1L, 3L)
a.shape
输出:
(3L,)
b=np.matrix([1,2,3])
输出:
matrix([[1, 2, 3]])
from numpy import *
data1 = mat(zeros((3,3)))
data2 = mat(ones((2,4)))
data3 = mat(random.rand(2,2))
data4 = mat(random.randint(2,8,size=(2,5)))
data5 = mat(eye(2,2,dtype=int))
14. 常见的矩阵运算
1 a1 = mat([1,2])
2 a2 = mat([[1],[2]])
3 a3 = a1 * a2
4 print(a3)
5 输出:
6 matrix([[5]])
7
8 print(a1*2)
9 输出:
10 matrix([[2, 4]])
11
12 a1 = mat(eye(2,2)*0.5)
13 print(a1.I)
14 输出:
15 matrix([[ 2.,
0.],
16
[ 0.,
2.]])
17
18
19 a1 = mat([[1,2],[2,3],[4,2]])
20 a1.sum(axis=0)
21 输出:
22 matrix([[7, 7]])
23 a1.sum(axis=1)
24 输出:
25 matrix([[3],
26
[5],
27
[6]])
28 a1.max()
# 求矩阵元素最大值
29 输出:
30 4
31 a1.min()
# 求矩阵元素最小值
32 输出:
33 1
34
35 np.max(a1,0)
# 求矩阵每列元素最大值
36 输出:
37 matrix([[4, 3]])
38 np.max(a1,1)
# 求矩阵每行元素最大值
39 输出:
40 matrix([[2],
41
[3],
42
[4]])
43
44
45 a = mat(ones((2,2)))
46 b = mat(eye((2)))
47 c = hstack((a,b))
48 输出:
49 matrix([[ 1.,
1.,
1.,
0.],
50
[ 1.,
1.,
0.,
1.]])
51 d = vstack((a,b))
52 输出:
53 matrix([[ 1.,
1.],
54
[ 1.,
1.],
55
[ 1.,
0.],
56
[ 0.,
1.]])
15. 矩阵、数组、列表之间的互相转换
1 aa = [[1,2],[3,4],[5,6]]
2 bb = array(aa)
3 cc = mat(bb)
4
5 cc.getA()
# 矩阵转换为数组
6 cc.tolist()
# 矩阵转换为列表
7 bb.tolist() # 数组转换为列表
8
9
10 # 当列表为一维时,情况有点特殊
11 aa = [1,2,3,4]
12 bb = array(aa)
13 输出:
14 array([1, 2, 3, 4])
15 cc = mat(bb)
16 输出:
17 matrix([[1, 2, 3, 4]])
18
19 cc.tolist()
20 输出:
21 [[1, 2, 3, 4]]
22
23 bb.tolist()
24 输出:
25 [1, 2, 3, 4]
26
27 cc.tolist()[0]
28 输出:
29 [1, 2, 3, 4]
最后
以上就是优雅诺言为你收集整理的python中的矩阵,多维数组和numpy库的的使用1. 引言2. 创建一般的多维数组 3. 创建特殊类型的多维数组 4. 多维数组的基本操作5. 数组索引、切片和迭代6. 组合不同的多维数组7. 将较大的多维数组分割成较小的多维数组8. 多维数组的复制操作9. 特殊的索引技巧10. 寻找最大值/最小值及其对应索引值11. ix_() function12. 线性代数运算13. 矩阵的创建14. 常见的矩阵运算15. 矩阵、数组、列表之间的互相转换的全部内容,希望文章能够帮你解决python中的矩阵,多维数组和numpy库的的使用1. 引言2. 创建一般的多维数组 3. 创建特殊类型的多维数组 4. 多维数组的基本操作5. 数组索引、切片和迭代6. 组合不同的多维数组7. 将较大的多维数组分割成较小的多维数组8. 多维数组的复制操作9. 特殊的索引技巧10. 寻找最大值/最小值及其对应索引值11. ix_() function12. 线性代数运算13. 矩阵的创建14. 常见的矩阵运算15. 矩阵、数组、列表之间的互相转换所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复