python numpy矩阵_python中的矩阵、多维数组----numpy

1. 引言

最近在将一个算法由matlab转成python,初学python,很多地方还不熟悉,总体感觉就是上手容易,实际上很优雅地用python还是蛮难的。目前为止,觉得就算法仿真研究而言,还是matlab用得特别舒服,可能是比较熟悉的缘故吧。matlab直接集成了很多算法工具箱,函数查询、调用、变量查询等非常方便,或许以后用久了python也会感觉很好用。与python相比,最喜欢的莫过于可以直接选中某段代码执行了,操作方便,python也可以实现,就是感觉不是很方便。

言归正传,做算法要用到很多的向量和矩阵运算操作,这些嘛在matlab里面已经很熟悉了,但用python的时候需要用一个查一个,挺烦的,所以在此稍作总结,后续使用过程中会根据使用体验更新。

python的矩阵运算主要依赖numpy包,scipy包以numpy为基础,大大扩展了后者的运算能力。

2. 创建一般的多维数组

import numpy as np

a = np.array([1,2,3], dtype=int) # 创建1*3维数组 array([1,2,3])

type(a) # numpy.ndarray类型

a.shape # 维数信息(3L,)

a.dtype.name # 'int32'

a.size # 元素个数:3

a.itemsize #每个元素所占用的字节数目:4

b=np.array([[1,2,3],[4,5,6]],dtype=int) # 创建2*3维数组 array([[1,2,3],[4,5,6]])

b.shape # 维数信息(2L,3L)

b.size # 元素个数:6

b.itemsize # 每个元素所占用的字节数目:4

c=np.array([[1,2,3],[4,5,6]],dtype='int16') # 创建2*3维数组 array([[1,2,3],[4,5,6]],dtype=int16)

c.shape # 维数信息(2L,3L)

c.size # 元素个数:6

c.itemsize # 每个元素所占用的字节数目:2

c.ndim # 维数

d=np.array([[1,2,3],[4,5,6]],dtype=complex) # 复数二维数组

d.itemsize # 每个元素所占用的字节数目:16

d.dtype.name # 元素类型:'complex128'

3. 创建特殊类型的多维数组

a1 = np.zeros((3,4)) # 创建3*4全零二维数组

输出:

array([[ 0., 0., 0., 0.],

[ 0., 0., 0., 0.],

[ 0., 0., 0., 0.]])

a1.dtype.name # 元素类型:'float64'

a1.size # 元素个数:12

a1.itemsize # 每个元素所占用的字节个数:8

a2 = np.ones((2,3,4), dtype=np.int16) # 创建2*3*4全1三维数组

a2 = np.ones((2,3,4), dtype='int16') # 创建2*3*4全1三维数组

输出:

array([[[1, 1, 1, 1],

[1, 1, 1, 1],

[1, 1, 1, 1]],

[[1, 1, 1, 1],

[1, 1, 1, 1],

[1, 1, 1, 1]]], dtype=int16)

a3 = np.empty((2,3)) # 创建2*3的未初始化二维数组

输出:(may vary)

array([[ 1., 2., 3.],

[ 4., 5., 6.]])

a4 = np.arange(10,30,5) # 初始值10,结束值:30(不包含),步长:5

输出:array([10, 15, 20, 25])

a5 = np.arange(0,2,0.3) # 初始值0,结束值:2(不包含),步长:0.2

输出:array([ 0. , 0.3, 0.6, 0.9, 1.2, 1.5, 1.8])

from numpy import pi

np.linspace(0, 2, 9) # 初始值0,结束值:2(包含),元素个数:9

输出:

array([ 0. , 0.25, 0.5 , 0.75, 1. , 1.25, 1.5 , 1.75, 2. ])

x = np.linspace(0, 2*pi, 9)

输出:

array([ 0. , 0.78539816, 1.57079633, 2.35619449, 3.14159265,

3.92699082, 4.71238898, 5.49778714, 6.28318531])

a = np.arange(6)

输出:

array([0, 1, 2, 3, 4, 5])

b = np.arange(12).reshape(4,3)

输出:

array([[ 0, 1, 2],

[ 3, 4, 5],

[ 6, 7, 8],

[ 9, 10, 11]])

c = np.arange(24).reshape(2,3,4)

输出:

array([[[ 0, 1, 2, 3],

[ 4, 5, 6, 7],

[ 8, 9, 10, 11]],

[[12, 13, 14, 15],

[16, 17, 18, 19],

[20, 21, 22, 23]]])

使用numpy.set_printoptions可以设置numpy变量的打印格式

在ipython环境下,使用help(numpy.set_printoptions)查询使用帮助和示例

4. 多维数组的基本操作

加法和减法操作要求操作双方的维数信息一致,均为M*N为数组方可正确执行操作。

a = np.arange(4)

输出:

array([0, 1, 2, 3])

b = a**2

输出:

array([0, 1, 4, 9])

c = 10*np.sin(a)

输出:

array([ 0. , 8.41470985, 9.09297427, 1.41120008])

n < 35

输出:

array([ True, True, True, True], dtype=bool)

A = np.array([[1,1],[0,1]])

B = np.array([[2,0],[3,4]])

C = A * B # 元素点乘

输出:

array([[2, 0],

[0, 4]])

D = A.dot(B) # 矩阵乘法

输出:

array([[5, 4],

[3, 4]])

E = np.dot(A,B) # 矩阵乘法

输出:

array([[5, 4],

[3, 4]])

多维数组操作过程中的类型转换

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

a = np.ones((2,3),dtype=int) # int32

b = np.random.random((2,3)) # float64

b += a # 正确

a += b # 错误

a = np.ones(3,dtype=np.int32)

b = np.linspace(0,pi,3)

c = a + b

d = np.exp(c*1j)

输出:

array([ 0.54030231+0.84147098j, -0.84147098+0.54030231j,

-0.54030231-0.84147098j])

d.dtype.name

输出:

'complex128'

多维数组的一元操作,如求和、求最小值、最大值等

a = np.random.random((2,3))

a.sum()

a.min()

a.max()

b = np.arange(12).reshape(3,4)

输出:

array([[ 0, 1, 2, 3],

[ 4, 5, 6, 7],

[ 8, 9, 10, 11]])

b.sum(axis=0) # 按列求和

输出:

array([12, 15, 18, 21])

b.sum(axis=1) # 按行求和

输出:

array([ 6, 22, 38])

b.cumsum(axis=0) # 按列进行元素累加

输出:

array([[ 0, 1, 2, 3],

[ 4, 6, 8, 10],

[12, 15, 18, 21]])

b.cumsum(axis=1) # 按行进行元素累加

输出:

array([[ 0, 1, 3, 6],

[ 4, 9, 15, 22],

[ 8, 17, 27, 38]])

universal functions

B = np.arange(3)

np.exp(B)

np.sqrt(B)

C = np.array([2.,-1.,4.])

np.add(B,C)

其他的ufunc函数包括:

5. 数组索引、切片和迭代

a = np.arange(10)**3

a[2]

a[2:5]

a[::-1] # 逆序输出

for i in a:

print (i**(1/3.))

def f(x,y):

return 10*x+y

b = np.fromfunction(f,(5,4),dtype=int)

b[2,3]

b[0:5,1]

b[:,1]

b[1:3,:]

b[-1]

c = np.array([[[0,1,2],[10,11,12]],[[100,101,102],[110,111,112]]])

输出:

array([[[ 0, 1, 2],

[ 10, 11, 12]],

[[100, 101, 102],

[110, 111, 112]]])

c.shape

输出:

(2L, 2L, 3L)

c[0,...]

c[0,:,:]

输出:

array([[ 0, 1, 2],

[10, 11, 12]])

c[:,:,2]

c[...,2]

输出:

array([[ 2, 12],

[102, 112]])

for row in c:

print(row)

for element in c.flat:

print(element)

a = np.floor(10*np.random.random((3,4)))

输出:

array([[ 3., 9., 8., 4.],

[ 2., 1., 4., 6.],

[ 0., 6., 0., 2.]])

a.ravel()

输出:

array([ 3., 9., 8., ..., 6., 0., 2.])

a.reshape(6,2)

输出:

array([[ 3., 9.],

[ 8., 4.],

[ 2., 1.],

[ 4., 6.],

[ 0., 6.],

[ 0., 2.]])

a.T

输出:

array([[ 3., 2., 0.],

[ 9., 1., 6.],

[ 8., 4., 0.],

[ 4., 6., 2.]])

a.T.shape

输出:

(4L, 3L)

a.resize((2,6))

输出:

array([[ 3., 9., 8., 4., 2., 1.],

[ 4., 6., 0., 6., 0., 2.]])

a.shape

输出:

(2L, 6L)

a.reshape(3,-1)

输出:

array([[ 3., 9., 8., 4.],

[ 2., 1., 4., 6.],

[ 0., 6., 0., 2.]])

详查以下函数:

6. 组合不同的多维数组

a = np.floor(10*np.random.random((2,2)))

输出:

array([[ 5., 2.],

[ 6., 2.]])

b = np.floor(10*np.random.random((2,2)))

输出:

array([[ 0., 2.],

[ 4., 1.]])

np.vstack((a,b))

输出:

array([[ 5., 2.],

[ 6., 2.],

[ 0., 2.],

[ 4., 1.]])

np.hstack((a,b))

输出:

array([[ 5., 2., 0., 2.],

[ 6., 2., 4., 1.]])

from numpy import newaxis

np.column_stack((a,b))

输出:

array([[ 5., 2., 0., 2.],

[ 6., 2., 4., 1.]])

a = np.array([4.,2.])

b = np.array([2.,8.])

a[:,newaxis]

输出:

array([[ 4.],

[ 2.]])

b[:,newaxis]

输出:

array([[ 2.],

[ 8.]])

np.column_stack((a[:,newaxis],b[:,newaxis]))

输出:

array([[ 4., 2.],

[ 2., 8.]])

np.vstack((a[:,newaxis],b[:,newaxis]))

输出:

array([[ 4.],

[ 2.],

[ 2.],

[ 8.]])

np.r_[1:4,0,4]

输出:

array([1, 2, 3, 0, 4])

np.c_[np.array([[1,2,3]]),0,0,0,np.array([[4,5,6]])]

输出:

array([[1, 2, 3, 0, 0, 0, 4, 5, 6]])

详细使用请查询以下函数:

7. 将较大的多维数组分割成较小的多维数组

a = np.floor(10*np.random.random((2,12)))

输出:

array([[ 9., 7., 9., ..., 3., 2., 4.],

[ 5., 3., 3., ..., 9., 7., 7.]])

np.hsplit(a,3)

输出:

[array([[ 9., 7., 9., 6.],

[ 5., 3., 3., 1.]]), array([[ 7., 2., 1., 6.],

[ 7., 5., 0., 2.]]), array([[ 9., 3., 2., 4.],

[ 3., 9., 7., 7.]])]

np.hsplit(a,(3,4))

输出:

[array([[ 9., 7., 9.],

[ 5., 3., 3.]]), array([[ 6.],

[ 1.]]), array([[ 7., 2., 1., ..., 3., 2., 4.],

[ 7., 5., 0., ..., 9., 7., 7.]])]

实现类似功能的函数包括:

hsplit,vsplit,array_split

8. 多维数组的复制操作

a = np.arange(12)

输出:

array([ 0, 1, 2, ..., 9, 10, 11])

not copy at all

b = a

b is a # True

b.shape = 3,4

a.shape # (3L,4L)

def f(x) # Python passes mutable objects as references, so function calls make no copy.

print(id(x)) # id是python对象的唯一标识符

id(a) # 111833936L

id(b) # 111833936L

f(a) # 111833936L

浅复制

c = a.view()

c is a # False

c.base is a # True

c.flags.owndata # False

c.shape = 2,6

a.shape # (3L,4L)

c[0,4] = 1234

print(a)

输出:

array([[ 0, 1, 2, 3],

[1234, 5, 6, 7],

[ 8, 9, 10, 11]])

s = a[:,1:3]

s[:] = 10

print(a)

输出:

array([[ 0, 10, 10, 3],

[1234, 10, 10, 7],

[ 8, 10, 10, 11]])

深复制

d = a.copy()

d is a # False

d.base is a # False

d[0,0] = 9999

print(a)

输出:

array([[ 0, 10, 10, 3],

[1234, 10, 10, 7],

[ 8, 10, 10, 11]])

numpy基本函数和方法一览

Array Creation

Conversions

Manipulations

Ordering

Operations

Basic Statistics

Basic Linear Algebra

完整的函数和方法一览表链接:

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]] =0print(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]=0print(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*cx25 输出: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 *a24 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]

内容整理参考链接如下:

https://docs.scipy.org/doc/numpy-dev/user/quickstart.html

http://python.usyiyi.cn/translate/NumPy_v111/reference/arrays.scalars.html#arrays-scalars-built-in

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值