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
            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. 创建特殊类型的多维数组
|  
            
            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.  
             ])
            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为数组方可正确执行操作。
|  
            
            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
              |  
           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
|  
            
            1
             
           
            2
             
           
            3
             
           
            4
              |  
           a 
             = 
             np.ones((
             2
             ,
             3
             ),dtype
             =
             int
             )      
             # int32
            b 
             = 
             np.random.random((
             2
             ,
             3
             ))     
             # float64
            b 
             +
             = 
             a  
             # 正确
            a 
             +
             = 
             b  
             # 错误
             | 
|  
            
            1
             
           
            2
             
           
            3
             
           
            4
             
           
            5
             
           
            6
             
           
            7
             
           
            8
             
           
            9
             
           
            10
              |  
           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'
             | 
多维数组的一元操作,如求和、求最小值、最大值等
|  
            
            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
              |  
           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
|  
            
            1
             
           
            2
             
           
            3
             
           
            4
             
           
            5
              |  
           B 
             = 
             np.arange(
             3
             )
            np.exp(B)
            np.sqrt(B)
            C 
             = 
             np.array([
             2.
             ,
             -
             1.
             ,
             4.
             ])
            np.add(B,C)
             | 
其他的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
              |  
           a 
             = 
             np.arange(
             10
             )
             *
             *
             3
            a[
             2
             ]
            a[
             2
             :
             5
             ]
            a[::
             -
             1
             ] 
             # 逆序输出
            for 
             i 
             in 
             a:
                
             print 
             (i
             *
             *
             (
             1
             /
             3.
             ))
             | 
|  
            
            1
             
           
            2
             
           
            3
             
           
            4
             
           
            5
             
           
            6
             
           
            7
             
           
            8
              |  
           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
             ]
             | 
|  
            
            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
              |  
           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)
             | 
|  
            
            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
              |  
           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.
             ]])
             | 
详查以下函数:
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
              |  
           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
             ]])
             | 
详细使用请查询以下函数:
hstack, vstack, column_stack, concatenate, c_, r_
7. 将较大的多维数组分割成较小的多维数组
|  
            
            1
             
           
            2
             
           
            3
             
           
            4
             
           
            5
             
           
            6
             
           
            7
             
           
            8
             
           
            9
             
           
            10
             
           
            11
             
           
            12
             
           
            13
             
           
            14
             
           
            15
             
           
            16
              |  
           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. 多维数组的复制操作
|  
            
            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
              |  
           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
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
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]
内容整理参考链接如下:
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
                  
                  
                  
                  
本文详细介绍 Python 中 NumPy 库的使用方法,包括数组创建、特殊数组生成、数组操作及索引技巧等内容,适用于从入门到进阶的学习需求。
          
      
          
                
                
                
                
              
                
                
                
                
                
              
                
                
              
            
                  
					1218
					
被折叠的  条评论
		 为什么被折叠?
		 
		 
		
    
  
    
  
            


            