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
import  numpy as np
=  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. 创建特殊类型的多维数组 

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
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.   ])
=  np.linspace( 0 2 * pi,  9 )
输出:
array([  0.         ,   0.78539816 ,   1.57079633 ,   2.35619449 ,   3.14159265 ,
         3.92699082 ,   4.71238898 ,   5.49778714 ,   6.28318531 ])
 
 
=  np.arange( 6 )
输出:
array([ 0 1 2 3 4 5 ])
=  np.arange( 12 ).reshape( 4 , 3 )
输出:
array([[  0 ,   1 ,   2 ],
        3 ,   4 ,   5 ],
        6 ,   7 ,   8 ],
        9 10 11 ]])
=  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为数组方可正确执行操作。

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
=  np.arange( 4 )
输出:
array([ 0 1 2 3 ])
=  a * * 2
输出:
array([ 0 1 4 9 ])
=  10 * np.sin(a)
输出:
  array([  0.         ,   8.41470985 ,   9.09297427 ,   1.41120008 ])
 
 
n <  35
输出:
array([  True ,   True ,   True ,   True ], dtype = bool )
 
=  np.array([[ 1 , 1 ],[ 0 , 1 ]])
=  np.array([[ 2 , 0 ],[ 3 , 4 ]])
=  *  B     # 元素点乘
输出:
array([[ 2 0 ],
        [ 0 4 ]])
=  A.dot(B)    # 矩阵乘法
输出:
array([[ 5 4 ],
        [ 3 4 ]])
=  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

1
2
3
4
=  np.ones(( 2 , 3 ),dtype = int )       # int32
=  np.random.random(( 2 , 3 ))      # float64
+ =  a   # 正确
+ =  b   # 错误
1
2
3
4
5
6
7
8
9
10
=  np.ones( 3 ,dtype = np.int32)
=  np.linspace( 0 ,pi, 3 )
=  +  b
=  np.exp(c * 1j )
输出:
array([  0.54030231 + 0.84147098j - 0.84147098 + 0.54030231j ,
        - 0.54030231 - 0.84147098j ])
d.dtype.name
输出:
  'complex128'

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

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
=  np.random.random(( 2 , 3 ))
a. sum ()
a. min ()
a. max ()
 
 
=  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

1
2
3
4
5
=  np.arange( 3 )
np.exp(B)
np.sqrt(B)
=  np.array([ 2. , - 1. , 4. ])
np.add(B,C)

其他的ufunc函数包括:

allanyapply_along_axisargmaxargminargsortaveragebincountceilclipconjcorrcoefcovcrosscumprodcumsumdiffdotfloor,innerlexsortmaxmaximummeanmedianminminimumnonzeroouterprodreroundsortstdsumtracetransposevar,vdotvectorizewhere

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

1
2
3
4
5
6
=  np.arange( 10 ) * * 3
a[ 2 ]
a[ 2 : 5 ]
a[:: - 1 # 逆序输出
for  in  a:
     print  (i * * ( 1 / 3. ))
1
2
3
4
5
6
7
8
def  f(x,y):
     return  10 * x + y
=  np.fromfunction(f,( 5 , 4 ),dtype = int )
b[ 2 , 3 ]
b[ 0 : 5 , 1 ]
b[:, 1 ]
b[ 1 : 3 ,:]
b[ - 1 ]
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
=  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)
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
=  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. ]])

详查以下函数:

ndarray.shapereshaperesizeravel

 

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
=  np.floor( 10 * np.random.random(( 2 , 2 )))
输出:
array([[  5. ,   2. ],
        6. ,   2. ]])
=  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. ]])
 
 
=  np.array([ 4. , 2. ])
=  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 ]])

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

hstackvstackcolumn_stackconcatenatec_r_

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
=  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.  多维数组的复制操作

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
=  np.arange( 12 )
输出:
array([  0 ,   1 ,   2 , ...,   9 10 11 ])
 
 
not  copy at  all
 
=  a
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
 
 
浅复制
 
=  a.view()
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 ]])
=  a[:, 1 : 3 ]
s[:]  =  10
print (a)
输出:
array([[    0 ,    10 ,    10 ,     3 ],
        [ 1234 ,    10 ,    10 ,     7 ],
        [    8 ,    10 ,    10 ,    11 ]])
 
 
深复制
=  a.copy()
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

arangearraycopyemptyempty_likeeyefromfilefromfunctionidentitylinspacelogspacemgridogridonesones_likerzeros,zeros_like

Conversions

ndarray.astypeatleast_1datleast_2datleast_3dmat

Manipulations

array_splitcolumn_stackconcatenatediagonaldsplitdstackhsplithstackndarray.itemnewaxisravelrepeatreshaperesize,squeezeswapaxestaketransposevsplitvstack

Questionsallanynonzerowhere

Ordering

argmaxargminargsortmaxminptpsearchsortedsort

Operations

choosecompresscumprodcumsuminnerndarray.fillimagprodputputmaskrealsum

Basic Statistics

covmeanstdvar

Basic Linear Algebra

crossdotouterlinalg.svdvdot

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

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]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值