zoukankan      html  css  js  c++  java
  • numpy学习笔记——读懂官方文档

    1. 安装方法

    pycharm-file-setting-project interpreter-选择‘+’-搜索numpy

    2. 基本功能

    >>> import numpy as np
    >>> a = np.arange(15).reshape(3, 5)   
    # arange需要整理的数据集大小   reshape整理成几行几列
    
    >>> a
    array([[ 0,  1,  2,  3,  4],
           [ 5,  6,  7,  8,  9],
           [10, 11, 12, 13, 14]])
    # 输入a,直接整理成从0递增的三行五列数据
    
    >>> a.shape  # a的格式 三行五列
    (3, 5)
    
    >>> a.ndim  # a的维数 2
    2
    
    >>> a.dtype.name  #dtype表示数组a内元素类型
    'int64'
    
    >>> a.itemsize   # 数组中每个元素占几位 8
    8
    
    >>> a.size  # a的大小 15
    15

    3. 构造数组

    (1)使用array函数

    # 生成一维数组
    >>> a = np.array([2,3,4])  
    >>> a
    array([2, 3, 4])
    
    # 生成二维数组,注意中括号和小括号
    >>> b = np.array([(1.5,2,3), (4,5,6)])  
    >>> b
    array([[ 1.5,  2. ,  3. ],
           [ 4. ,  5. ,  6. ]])
     
    # 生成复杂数组,类型提前声明,注意括号
    >>> c = np.array( [ [1,2], [3,4] ], dtype=complex )
    >>> c
    array([[ 1.+0.j,  2.+0.j],
           [ 3.+0.j,  4.+0.j]])

    (2)生成零数组zeros,一数组ones,空数组empty

    >>> np.zeros( (3,4) )  
    array([[ 0.,  0.,  0.,  0.],
           [ 0.,  0.,  0.,  0.],
           [ 0.,  0.,  0.,  0.]])

    (3)arange生成数字序列

    # 顺序递增序列
    d = np.arange(15)
    d
    array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14])
    
    #开始10,结束30,步长5
    #注意:不包括30
    >>> np.arange( 10, 30, 5 )
    array([10, 15, 20, 25])

    (4)linspace

    # 0-2之间均匀找9个数,包括0和2
    >>> np.linspace( 0, 2, 9 )                 
    array([ 0.  ,  0.25,  0.5 ,  0.75,  1.  ,  1.25,  1.5 ,  1.75,  2.  ])

    (5)使用函数

    >>> x = np.linspace( 0, 2*3.14, 10 )   
    >>> x
    array([ 1.        ,  1.58666667,  2.17333333,  2.76      ,  3.34666667,
            3.93333333,  4.52      ,  5.10666667,  5.69333333,  6.28      ])
    >>>np.sin(x)
    array([ 0.84147098,  0.99987407,  0.82390046,  0.37239904, -0.20363962,
           -0.71157736, -0.98155025, -0.92327428, -0.55623802, -0.0031853 ])

    (6)随机数 random

    >>> np.random.rand(3,2)
    array([[ 0.14022471,  0.96360618],  
           [ 0.37601032,  0.25528411],  
           [ 0.49313049,  0.94909878]]) 

    4. 数组的输出

    # 三维数组的输出
    >>> c = np.arange(24).reshape(2,3,4) 
    # reshape的理解:第3个维度是4,里面有4个数据;
              第2个维度是3,里面有3个包含4个数据的数组
              第1个维度是2,里面有2个三行四列的矩阵
    >>> print(c) [[[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]] [[12 13 14 15] [16 17 18 19] [20 21 22 23]]]

    5. 主要操作

    (1)点乘和叉乘

    >>> A = np.array( [[1,1],
    ...             [0,1]] )
    >>> B = np.array( [[2,0],
    ...             [3,4]] )
    
    # 对应元素直接相乘
    >>> A*B                         
    array([[2, 0],
           [0, 4]])
    
    # 矩阵乘法
    >>> A.dot(B)                
    array([[5, 4],
           [3, 4]])
    >>> np.dot(A, B)     
    array([[5, 4],
           [3, 4]])

    (2)求最大max、最小min、求和sum,

    在整个数组范围中求

    >>> a = np.random.random((2,3))
    >>> a
    array([[ 0.18626021,  0.34556073,  0.39676747],
           [ 0.53881673,  0.41919451,  0.6852195 ]])
    >>> a.sum()
    2.5718191614547998
    >>> a.min()
    0.1862602113776709
    >>> a.max()
    0.6852195003967595

    在某个维度求和

    >>> b = np.arange(12).reshape(3,4)
    >>> b
    array([[ 0,  1,  2,  3],
           [ 4,  5,  6,  7],
           [ 8,  9, 10, 11]])
    
    >>> b.sum(axis=0)       #  对列求和               
    array([12, 15, 18, 21])
    
    >>> b.min(axis=1)       # 对行求和               
    array([0, 4, 8])
    
    >>> b.cumsum(axis=1)     # 每行逐次求和             
    array([[ 0,  1,  3,  6],
           [ 4,  9, 15, 22],
           [ 8, 17, 27, 38]])

    6. 常用函数

    aqrt、exp、sort...

    7. 索引、切片、正则化

    多维操作和一维操作相似

    >>> def f(x,y):
    ...     return 10*x+y
    ...
    >>> b = np.fromfunction(f,(5,4),dtype=int)
    >>> b
    array([[ 0,  1,  2,  3],
           [10, 11, 12, 13],
           [20, 21, 22, 23],
           [30, 31, 32, 33],
           [40, 41, 42, 43]])
    
    # 输出第2行,第3列的数
    >>> b[2,3]
    23
    # 输出第0-5行(不包括第5行),第1列的数
    >>> b[0:5, 1]                       
    array([ 1, 11, 21, 31, 41])
    # 输出所有行,第1列的数
    # :表示所有
    >>> b[ : ,1]                        
    array([ 1, 11, 21, 31, 41])
    # 输出1-3行(不包括第3行),所有数
    >>> b[1:3, : ]                      
    array([[10, 11, 12, 13],
           [20, 21, 22, 23]])
    # 输出最后一行
    >>> b[-1]                                
    array([40, 41, 42, 43])

    ...的用法

    >>> c = np.array( [[[  0,  1,  2],    # c是三维数组
    ...                 [ 10, 12, 13]],
    ...                [[100,101,102],
    ...                 [110,112,113]]])
    >>> c.shape
    (2, 2, 3)
    
    >>> c[1,...]    # 相当于 c[1,:,:] or c[1]
    array([[100, 101, 102],
           [110, 112, 113]])
    >>> c[...,2]   # 相当于 c[:,:,2]
    array([[  2,  13],
           [102, 113]])

    对行操作和对单个元素操作flat

    # 对行进行操作
    >>> for row in b:
    ...     print(row)
    ...
    [0 1 2 3]
    [10 11 12 13]
    [20 21 22 23]
    [30 31 32 33]
    [40 41 42 43]
    
    # 对每个元素进行操作
    >>> for element in b.flat:
    ...     print(element)
    ...
    0
    1
    2
    3
    10
    11
    12
    13
    20
    21
    22
    23
    30
    31
    32
    33
    40
    41
    42
    43

    8. 矩阵形状操作

    shape

    ravel

    >>> a = np.floor(10*np.random.random((3,4)))
    >>> a
    array([[ 2.,  8.,  0.,  6.],
           [ 4.,  5.,  1.,  1.],
           [ 8.,  9.,  3.,  6.]])
    >>> a.shape
    (3, 4)
    
    >>> a.ravel()  # 拉成一维的了
    array([ 2.,  8.,  0.,  6.,  4.,  5.,  1.,  1.,  8.,  9.,  3.,  6.])
    
    >>> a.reshape(6,2)  # 重新设定形状   若把2改为-1,则会自动计算
    array([[ 2.,  8.],
           [ 0.,  6.],
           [ 4.,  5.],
           [ 1.,  1.],
           [ 8.,  9.],
           [ 3.,  6.]])

    转置T

    >>> a.T  
    array([[ 2.,  4.,  8.],
           [ 8.,  5.,  9.],
           [ 0.,  1.,  3.],
           [ 6.,  1.,  6.]])

    9.矩阵堆叠

    多维操作时,hstack沿着第二维堆叠,vstack沿着第一维堆叠,

    并且有可选参数来控制沿着哪个维度堆叠。

    >>> a = np.floor(10*np.random.random((2,2)))
    >>> a
    array([[ 8.,  8.],
           [ 0.,  0.]])
    >>> b = np.floor(10*np.random.random((2,2)))
    >>> b
    array([[ 1.,  8.],
           [ 0.,  4.]])
    
    # 竖着堆
    >>> np.vstack((a,b))
    array([[ 8.,  8.],
           [ 0.,  0.],
           [ 1.,  8.],
           [ 0.,  4.]])
    #横着堆
    >>> np.hstack((a,b))
    array([[ 8.,  8.,  1.,  8.],
           [ 0.,  0.,  0.,  4.]])

    函数 column_stack

    直接使用

    >>> np.r_[1:4,0,4]
    array([1, 2, 3, 0, 4])

    10. 分割数组

    横向数着切hsplit、纵向数着切vsplit

    >>> a = np.floor(10*np.random.random((2,12)))
    >>> a
    array([[ 9.,  5.,  6.,  3.,  6.,  8.,  0.,  7.,  9.,  7.,  2.,  7.],
              [ 1.,  4.,  9.,  2.,  2.,  1.,  0.,  6.,  2.,  2.,  4.,  0.]])
     
    >>> np.hsplit(a,3)     # 切成三个数组
    [array([[ 9.,  5.,  6.,  3.], [ 1.,  4.,  9.,  2.]]),
     array([[ 6.,  8.,  0.,  7.], [ 2.,  1.,  0.,  6.]]),
     array([[ 9.,  7.,  2.,  7.], [ 2.,  2.,  4.,  0.]])]
    >>> np.hsplit(a,(3,4))   # 第三列和第四列后面切一刀
    [array([[ 9.,  5.,  6.], [ 1.,  4.,  9.]]),
     array([[ 3.], [ 2.]]),
     array([[ 6.,  8.,  0.,  7.,  9.,  7.,  2.,  7.], [ 2.,  1.,  0.,  6.,  2.,  2.,  4.,  0.]])]

    11.拷贝

    操作数组时,有时候拷贝了副本,有时候没有,如何区分这些情况。

    (1)不拷贝

      简单的赋值

      函数调用

    (2)浅拷贝

      view生成一个数据相同新数组

    >>> c = a.view()  
    >>> c is a     # c和a是同一个数组
    False  
    >>> c.base is a      #c是a持有数据的镜像  
    True  
    >>> c.flags.owndata  
    False  
    
    
    >>> c.shape = 2,6    # 改变c的形状,a的形状没变  
    >>> a.shape  
    (3, 4) 
    >>> c[0,4] = 1234        #改变c的数据,a的数据改变
    >>> a  
    array([[   0,    1,    2,    3],  
           [1234,    5,    6,    7],  
           [   8,    9,   10,   11]]) 

      数据切片后返回浅拷贝,原始数据不受损

    (3)深拷贝

      copy完全拷贝数组和数据

    >>> d = a.copy()                   
    >>> d is a
    False
    >>> d.base is a         # d和a没有关系              
    False

    12. 索引

    >>> a = np.arange(12)**2                      
    >>> i = np.array( [ 1,1,3,8,5 ] )            
    >>> a[i]            # 输出的是数组a中第i个位置中的数                
    array([ 1,  1,  9, 64, 25])

    若a是多维的,则索引指向它的第一维

    索引可以是多维的,索引的每一维必须形状相同

    利用索引来选择数组

    >>> a = np.arange(12).reshape(3,4)
    >>> b1 = np.array([False,True,True])            
    >>> b2 = np.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])

    ix_()函数 为了方便计算使用

    可以为了获得多元组的结果而用来结合不同向量。例如,如果你想要用所有向量a、b和c元素组成的三元组来计算a+b*c

    >>> a = np.array([2,3,4,5])
    >>> b = np.array([8,5,4])
    >>> c = np.array([5,4,6,8,3])
    >>> ax,bx,cx = np.ix_(a,b,c)
    >>> ax
    array([[[2]],
           [[3]],
           [[4]],
           [[5]]])
    >>> bx
    array([[[8],
            [5],
            [4]]])
    >>> cx
    array([[[5, 4, 6, 8, 3]]])
    >>> ax.shape, bx.shape, cx.shape
    ((4, 1, 1), (1, 3, 1), (1, 1, 5))
    
    >>> result = ax+bx*cx
    >>> result
    array([[[42, 34, 50, 66, 26],
            [27, 22, 32, 42, 17],
            [22, 18, 26, 34, 14]],
           [[43, 35, 51, 67, 27],
            [28, 23, 33, 43, 18],
            [23, 19, 27, 35, 15]],
           [[44, 36, 52, 68, 28],
            [29, 24, 34, 44, 19],
            [24, 20, 28, 36, 16]],
           [[45, 37, 53, 69, 29],
            [30, 25, 35, 45, 20],
            [25, 21, 29, 37, 17]]])
    >>> result[3,2,4]
    17
    >>> a[3]+b[2]*c[4]
    17

    13. 线性代数

    >>> import numpy as np
    >>> a = np.array([[1.0, 2.0], [3.0, 4.0]])
    >>> print(a)
    [[ 1.  2.]
     [ 3.  4.]]
    
    >>> a.transpose()  # 转置
    array([[ 1.,  3.],
           [ 2.,  4.]])
    
    >>> np.linalg.inv(a)  # 取反
    array([[-2. ,  1. ],
           [ 1.5, -0.5]])
    
    >>> u = np.eye(2) # 单位阵
    >>> u
    array([[ 1.,  0.],
           [ 0.,  1.]])
    
    >>> j = np.array([[0.0, -1.0], [1.0, 0.0]])
    >>> np.dot (j, j)   # 矩阵间相乘
    array([[-1.,  0.],
           [ 0., -1.]])
    
    >>> y = np.array([[5.], [7.]])
    >>> np.linalg.solve(a, y)   # 解方程
    array([[-3.],
           [ 4.]])

    14. 直方图 

    >>> import numpy as np
    >>> import matplotlib.pyplot as plt
    >>> mu, sigma = 2, 0.5
    >>> v = np.random.normal(mu,sigma,10000)
    >>> plt.hist(v, bins=50, normed=1)      
    >>> plt.show()

     

  • 相关阅读:
    判断php变量是否定义,是否为空
    HTTP Client 编写
    推荐《冒号课堂——编程范式与OOP思想》
    一些免费的HTML编辑器
    如何判断mysql中数据表中两个列之间的相同记录和不同记录
    PostgreSQL 8.4, SQL Server 2008, MySQL 5.1比较
    JDBC纵览
    使用jdbc连接sql数据库
    关于PHP中变量的判定
    如何判断数据库中是否存在一个数据表
  • 原文地址:https://www.cnblogs.com/syyy/p/7898854.html
Copyright © 2011-2022 走看看