zoukankan      html  css  js  c++  java
  • numpy快速入门

    numpy快速入门

    numpy是python的科学计算的核心库,很多更高层次的库都基于numpy。博主不太喜欢重量级的MATLAB,于是用numpy进行科学计算成为了不二选择。

    本文主要参考Scipy关于numpy的quickstart

    基础篇

    numpy的主要研究对象是同质多维数组,同质表示数据类型一致,多维表示有多个维度。举个例子就是以下形式:

    #生成范围为1~100,大小为3x4的随机矩阵
    In [25]: x = np.random.randint(1,100,size=(3,4))
    In [26]: x
    Out[26]:
    array([[28, 23, 32,  5],
           [32, 44, 85, 84],
           [21, 13,  1,  9]])
    

    几个重要属性

    • a.ndim

      轴的维度,通常为2(不是矩阵意义上的秩),求矩阵的秩:

    np.linalg.matrix_rank(a)
    

    • a.shape

      返回一个tuple,(m,n)分别表示行和列

    • a.size

      数组中数据项的个数

      (size=m imes n(m,n=a.shape))

    • a.dtype

      返回datatype

    • a.itemsize

      每个数据项所占用的字节(Byte)数

    • a.data

      返回一个实际的缓冲区,通常用不到,因为我们一般都是通过索引访问的

    创建数组

    主要通过两类方法

    1. 使用array函数创建
    data = np.array([[1,2,3],
                     [4,5,6],
                     [7,8,9]],dtype=float) #可以指定数据类型
    
    1. 使用函数创建特殊矩阵,例如:
    a1 = np.zeros((3,4)) #0矩阵
    a2 = np.ones((3,4)) #1矩阵
    a3 = np.empty((3,4)) #空矩阵,内容根据内存完全随机,使用前要初始化
    a4 = np.eye(5) #5x5单位矩阵
    a5 = np.arange(10,30) #和python的range类似
    a6 = np.linspace(2, np.pi, 10) #linear space线性等分函数
    a7 = np.random.rand(1,100,size=(3,4)) #普通的随机矩阵
    

    打印数组

    输出直接print即可

    In [79]: b = np.arange(12).reshape(2,2,3)
    In [80]: print b
    [[[ 0  1  2]
      [ 3  4  5]]
    
     [[ 6  7  8]
      [ 9 10 11]]]
    

    有时候数据量过多,numpy会隐藏中间的一些数据,使用···表示,如果想要全部显示,可以使用

    np.set_printoptions(threshold='nan')
    

    基本运算

    基本运算都是逐元素运算,产生一个新数组

    >>> a = array( [20,30,40,50] )
    >>> b = arange( 4 )
    >>> b
    array([0, 1, 2, 3])
    >>> c = a-b
    >>> c
    array([20, 29, 38, 47])
    >>> b**2
    array([0, 1, 4, 9])
    >>> 10*sin(a)
    array([ 9.12945251, -9.88031624,  7.4511316 , -2.62374854])
    >>> a<35
    array([True, True, False, False], dtype=bool)
    # 关于bool运算,还可以使用a.all()>35 a.any()>35返回唯一值
    

    关于乘法

    c = a * b #是逐个元素相乘
    c = np.dot(a,b) #是矩阵相乘
    

    简单函数

    In [88]: a = np.random.randint(1,100,size=(3,4))
    
    In [89]: a
    Out[89]:
    array([[64, 42, 17, 18],
           [42,  9, 26, 91],
           [85, 16,  9, 46]])
    
    In [90]: a.sum() #所有元素之和
    Out[90]: 465
      
    In [91]: a.sum(axis=0) #行相加,axis=0表示把每一行看成一个元素,axis=1表示列
    Out[91]: array([191,  67,  52, 155])
    
    In [92]: a.min() #全局最小
    Out[92]: 9
    
    In [93]: a.cumsum() #全局累计和
    Out[93]: array([ 64, 106, 123, 141, 183, 192, 218, 309, 394, 410, 419, 465])
    
    In [94]: a.cumsum(axis=0) #行累积和
    Out[94]:
    array([[ 64,  42,  17,  18],
           [106,  51,  43, 109],
           [191,  67,  52, 155]])
    
    In [95]: a.cumsum(axis=1) #列累积和
    Out[95]:
    array([[ 64, 106, 123, 141],
           [ 42,  51,  77, 168],
           [ 85, 101, 110, 156]])
    

    访问数据

    numpy访问数据的方法与MATLAB类似,主要是切片、索引、迭代

    • 切片
    In [113]: a = np.arange(12).reshape(3,4)
    
    In [114]: a
    Out[114]:
    array([[ 0,  1,  2,  3],
    [ 4,  5,  6,  7],
    [ 8,  9, 10, 11]])
    
    In [115]: a[1:3,:] #切片以逗号分割维度,1:3表示[1,3)的索引范围,跟list一致
    Out[115]:
    array([[ 4,  5,  6,  7],
    [ 8,  9, 10, 11]])
    

    • 索引

      取整行

      a[1]

      取整列

      a[:,2]

      取元素

      a[2,2]

    • 迭代

    In [119]: for row in a: #默认为行遍历
    ...:     print row
    
    In [120]: for x in a.flat: #flat可以把数组变成一维
    ...:     print x
    

    合并和分离

    合并

    In [131]: a = np.arange(6).reshape(2,3)
    
    In [132]: b = np.ones((2,3))
    
    In [133]: np.vstack((a,b)) #竖直堆放
    Out[133]:
    array([[ 0.,  1.,  2.],
           [ 3.,  4.,  5.],
           [ 1.,  1.,  1.],
           [ 1.,  1.,  1.]])
    
    In [134]: np.hstack((a,b)) #水平堆放
    Out[134]:
    array([[ 0.,  1.,  2.,  1.,  1.,  1.],
           [ 3.,  4.,  5.,  1.,  1.,  1.]])
    

    分离

    In [136]: c
    Out[136]:
    array([[ 0.,  1.,  2.],
           [ 3.,  4.,  5.],
           [ 1.,  1.,  1.],
           [ 1.,  1.,  1.]])
    
    In [137]: np.vsplit(c,2) #分成上下两组
    Out[137]:
    [array([[ 0.,  1.,  2.],
            [ 3.,  4.,  5.]]), array([[ 1.,  1.,  1.],
            [ 1.,  1.,  1.]])]
    
    In [142]: np.hsplit(c,3) #分成左右3组
    Out[142]:
    [array([[ 0.],
            [ 3.],
            [ 1.],
            [ 1.]]), array([[ 1.],
            [ 4.],
            [ 1.],
            [ 1.]]), array([[ 2.],
            [ 5.],
            [ 1.],
            [ 1.]])]
    

    拷贝

    In [144]: b = a #浅拷贝,b和a引用同一块内存
    
    In [145]: a is b
    Out[145]: True
    
    In [146]: b = a.copy() #深拷贝,b指向新的内存,其内容从a拷贝得到
    
    In [147]: b is a
    Out[147]: False
    
  • 相关阅读:
    Spring基础知识
    Hibernate基础知识
    Struts2基础知识
    在eclipse里头用checkstyle检查项目出现 File contains tab characters (this is the first instance)原因
    java后台获取cookie里面值得方法
    ckplayer 中的style.swf 中的 style.xml 中的修改方法
    java hql case when 的用法
    Windows下Mongodb安装及配置
    Mongodb中经常出现的错误(汇总)child process failed, exited with error number
    Mac 安装mongodb
  • 原文地址:https://www.cnblogs.com/fanghao/p/7498111.html
Copyright © 2011-2022 走看看