zoukankan      html  css  js  c++  java
  • python中的矩阵、多维数组

    2. 创建一般的多维数组 

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

    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([[[1111],
            [1111],
            [1111]],
     
           [[1111],
            [1111],
            [1111]]], 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([10152025])
    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(029)   # 初始值0,结束值:2(包含),元素个数:9
    输出:
    array([ 0.  ,  0.25,  0.5 ,  0.75,  1.  ,  1.25,  1.5 ,  1.75,  2.  ])
    = np.linspace(02*pi, 9)
    输出:
    array([ 0.        ,  0.78539816,  1.57079633,  2.35619449,  3.14159265,
            3.92699082,  4.71238898,  5.49778714,  6.28318531])
     
     
    = np.arange(6)
    输出:
    array([012345])
    = np.arange(12).reshape(4,3)
    输出:
    array([[ 0,  1,  2],
           3,  4,  5],
           6,  7,  8],
           91011]])
    = np.arange(24).reshape(2,3,4)
    输出:
    array([[[ 0,  1,  2,  3],
            4,  5,  6,  7],
            8,  91011]],
     
           [[12131415],
            [16171819],
            [20212223]]]) 

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

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

    = np.arange(4)
    输出:
    array([0123])
    = a**2
    输出:
    array([0149])
    = 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([[20],
           [04]])
    = A.dot(B)   # 矩阵乘法
    输出:
    array([[54],
           [34]])
    = np.dot(A,B)   # 矩阵乘法
    输出:
    array([[54],
           [34]])

    4. 多维数组的基本操作

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

     

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

    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

    = np.ones((2,3),dtype=int)      # int32
    = np.random.random((2,3))     # float64
    += a  # 正确
    += b  # 错误
    = 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'

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

    = 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,  91011]])
    b.sum(axis=0)    # 按列求和
    输出:
    array([12151821])
    b.sum(axis=1)    # 按行求和
    输出:
    array([ 62238])
    b.cumsum(axis=0)   # 按列进行元素累加
    输出:
    array([[ 0,  1,  2,  3],
           4,  6,  810],
           [12151821]])
    b.cumsum(axis=1)   # 按行进行元素累加
    输出:
    array([[ 0,  1,  3,  6],
           4,  91522],
           8172738]])

    universal functions

    = 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. 数组索引、切片和迭代

    = np.arange(10)**3
    a[2]
    a[2:5]
    a[::-1# 逆序输出
    for in a:
        print (i**(1/3.))
    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]
    = np.array([[[0,1,2],[10,11,12]],[[100,101,102],[110,111,112]]])
    输出:
    array([[[  0,   1,   2],
            10,  11,  12]],
     
           [[100101102],
            [110111112]]])
    c.shape
    输出:
    (2L2L3L)
    c[0,...]
    c[0,:,:]
    输出:
    array([[ 0,  1,  2],
           [101112]])
    c[:,:,2]
    c[...,2]
    输出:
    array([[  2,  12],
           [102112]])
     
    for row in c:
        print(row)
     
    for element in c.flat:
        print(element)
    = 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
    输出:
    (4L3L)
    a.resize((2,6))
    输出:
    array([[ 3.,  9.,  8.,  4.,  2.,  1.],
           4.,  6.,  0.,  6.,  0.,  2.]])
    a.shape
    输出:
    (2L6L)
    a.reshape(3,-1)
    输出:
    array([[ 3.,  9.,  8.,  4.],
           2.,  1.,  4.,  6.],
           0.,  6.,  0.,  2.]])

    详查以下函数:

    ndarray.shapereshaperesizeravel

    6. 组合不同的多维数组

    = 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([12304])
    np.c_[np.array([[1,2,3]]),0,0,0,np.array([[4,5,6]])]
    输出:
    array([[123000456]])

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

    hstackvstackcolumn_stackconcatenatec_r_

    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

    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]
  • 相关阅读:
    命令模式
    js代理模式,处理缓存
    js设计模式之策略模式
    查看并修改签名证书keystore的密码,alias别名等相关参数
    【fiddler】配置代理后个别app连不上网的问题
    使用Fiddler域名过滤、断点、小技巧绕过前端验证
    App上架各大应用市场的地址及操作方法
    获取APK获取APK证书MD5、SHA1、SHA256等秘钥
    Python一切皆对象
    WEB基础之布局与定位
  • 原文地址:https://www.cnblogs.com/mlan/p/8245594.html
Copyright © 2011-2022 走看看