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
    
  • 相关阅读:
    教程:如何手动安装Xamarin与Xamarin for VisualStudio
    安装matplotlib
    pycharm中文专业版安装使用
    在win7下安装PowerShell 5.0遇到的坑
    1997-2017
    系统界面截图
    组态与非组态结合的LT
    opencv mat转qimage
    QTableWidget 样式文件
    hiredis window 源码编译
  • 原文地址:https://www.cnblogs.com/fanghao/p/7498111.html
Copyright © 2011-2022 走看看