美文网首页
Numpy使用

Numpy使用

作者: Bool吖 | 来源:发表于2019-06-16 23:15 被阅读0次

    NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。

    NumPy 是一个运行速度非常快的数学库,主要用于数组计算,包含:

    • 一个强大的N维数组对象 ndarray
    • 广播功能函数
    • 整合 C/C++/Fortran 代码的工具
    • 线性代数、傅里叶变换、随机数生成等功能

    一、Numpy安装

    使用pip工具安装

    python -m pip install --user numpy scipy matplotlib ipython jupyter pandas sympy nose
    

    --user 选项可以设置只安装在当前的用户下,而不是写入到系统目录。

    Linux 下安装
    Ubuntu & Debian

    sudo apt-get install python-numpy python-scipy python-matplotlib ipython ipython-notebook python-pandas python-sympy python-nose
    

    CentOS/Fedora

    sudo dnf install numpy scipy python-matplotlib ipython python-pandas sympy python-nose atlas-devel
    

    Mac 系统

    Mac 系统的 Homebrew 不包含 NumPy 或其他一些科学计算包,所以可以使用以下方式来安装:

    python -m pip install numpy scipy matplotlib
    

    验证是否成功:

    ➜  ~ python3
    Python 3.6.5 (default, May 28 2018, 22:41:59)
    [GCC 4.2.1 Compatible Apple LLVM 9.1.0 (clang-902.0.39.1)] on darwin
    Type "help", "copyright", "credits" or "license" for more information.
    >>> from numpy import *
    >>> eye(4)
    array([[1., 0., 0., 0.],
           [0., 1., 0., 0.],
           [0., 0., 1., 0.],
           [0., 0., 0., 1.]])
    

    1、Numpy数据类型

    NumPy支持比Python更多种类的数值类型。下表列出了NumPy中定义的不同数据类型。

    数据类型 描述
    boo_ 存储一个字节的布尔值(true or false)
    int_ 默认整数,相当于 C 的long,通常为int32或int64
    intc 相当于 C int,通常为int32或int64
    intp 用于索引的整数,相当于 C 的size_t,通常为int32或int64
    int8 1个字节(-128 ~ 127)
    int16 16 位整数(-32768 ~ 32767)
    int32 32 位整数(-2147483648 ~ 2147483647)
    int64 64 位整数(-9223372036854775808 ~ 9223372036854775807)
    uint8 8 位无符号整数(0 ~ 255)
    uint16 16 位无符号整数(0 ~ 65535)
    uint32 32 位无符号整数(0 ~ 4294967295)
    uint64 64 位无符号整数(0 ~ 18446744073709551615)
    float_ float64的简写
    float16 半精度浮点:符号位,5 位指数,10 位尾数
    float64 双精度浮点:符号位,11 位指数,52 位尾数
    complex_ complex128的简写
    complex64 复数,由两个 32 位浮点表示(实部和虚部)
    complex128 复数,由两个 64 位浮点表示(实部和虚部)
    complex256 复数,128位
    object Python对象类型
    string_ 修正的ASCII字符串类型
    unicode_ 修正的Unicode类型

    小技巧:int8,int16,int32,int64 可替换为等价的字符串 'i1','i2','i4',其他类型也有类似的缩写。

    np.astype显式地转换数据类型
    Numpy还有一些预先定义的特殊值:

    比如:np.nannp.pinp.e

    np.nan: 缺失值,或者理解为'不是一个数'
    np.pi:圆周率 3.1415926...
    np.e:自然数e 2.718281828459045...

    一、Numpy 数组

    1、数组创建

    1).使用array方法。使用Python列表或者原则作为参数如:
    a1 = np.array([2,3,4])
    a2 = np.array((1,23,3))
    

    数组的类型将根据序列中元素的类型推导出来。同时array自动将二维或三维序列转换为对应的二维或者三维数组。
    Numpy数组被创建时也可以制定数据的类型如:

    c = np.array([2,3,4], dtype=complex)

    我们也可以创建一个都是0的数组或者都是1的数组例如:
    使用zero创建一个都是0的数组:

    b1 = np.zeros((3,4))
    b = np.zeros((5,), dtype=np.float)
    

    创建一个全部为1的数组

    np.ones((2,3,4), dtype=np.int16) # 制定类型
    

    创建一个为空的数组:

    np.empty((2,3))
    

    可能返回未初始化的垃圾数值,不安全

    创建一个全有8组成的数组:

    np.full((3,4), 8)
    
    2). 返回array序列函数

    使用arange返回array序列函数:np.arange(start, stop, step, dtype)
    使用linspace函数:np.linspace(start, stop, num. endpoint, retstep, dtyp)
    备注:arange浮点会有精度问题,可以使用linspace
    更多类似的函数有:array, zeros, zeros_like, ones, ones_like, empty, empty_like, arange, linspace, numpy.random.rand, numpy.random.randn, fromfunction, fromfile

    2、数组运算

    对数组进行算术运算,就会对整个数组的所有元祖进行逐一运算,并将运算结果保存在一个新数组内,不破坏原始数组。

    >>> a = np.array([20,30,40,50])
    >>> b = np.arange(4)
    >>> b
    array([0, 1, 2, 3])
    >>> c = a+b
    >>> c
    array([20, 31, 42, 53])
    >>> b**2
    array([0, 1, 4, 9])
    >>> np.sin(a)
    array([ 0.91294525, -0.98803162,  0.74511316, -0.26237485])
    

    计算矩阵乘法:使用@或者dot(),如

    >>> A = np.array([[1,1], [0,1]])
    >>> B = np.array([[2,0], [3,4]])
    >>> A @ B
    array([[5, 4],
           [3, 4]])
    >>> A.dot(B)
    array([[5, 4],
           [3, 4]])
    

    对于+=*=这一类操作符,会修改原始的数组,而不是新建一个。

    3、通用函数

    函数名 描述
    abs 逐个元素进行绝对值计算
    fabs 复试的绝对值计算
    sqrt 平方根
    square 平方
    exp 自然指数函数
    log 以e为底的对数
    log10 以10为底的对数
    log2 以2为底的对数
    sign 计算每个元素的符号值
    ceil 计算每个元素的最高整数值
    floor 计算每个元素的最小整数值
    rint 保留到整数位
    modf 分别将元素的小数部分和整数部分按数组形式返回
    isnan 判断每个元素是否为NaN,返回布尔值
    isfinite 返回数组中的元素是否有限
    isinf 返回数组中的元素是否无限
    cos 余弦
    sin 正弦
    tan 正切
    arccos 反余弦
    arcsin 反正弦
    arctan 反正切

    下面是部分二元通用函数:

    函数名 描述
    add 将数组的对应元素相加
    subtract 在第二个数组中,将第一个数组中包含的元素去除
    multiply 将数组的对应元素相乘
    divide 相除
    floor_divide 整除,放弃余数
    power 幂函数
    maxium 逐个元素计算最大值
    minimum 逐个元素计算最小值
    mod 按元素进行求模运算

    4、索引切片迭代

    Numpy的切片操作,默认是修改原数组的,而不是原生Python那样,以复制为主。

    >>> a = np.arange(10)**3
    >>> a
    array([  0,   1,   8,  27,  64, 125, 216, 343, 512, 729])
    >>> a[2]
    8
    >>> a[2:5]
    array([ 8, 27, 64])
    >>> a[:6:2]
    array([ 0,  8, 64])
    >>> a[:6:2]=-1000
    >>> a
    array([-1000,     1, -1000,    27, -1000,   125,   216,   343,   512,
             729])
    >>> a[::-1]
    array([  729,   512,   343,   216,   125, -1000,    27, -1000,     1,
           -1000])
    

    5、添加删除去重

    下面是几个常见的数组操作:

    • append:将值添加到数组末尾
    • insert: 沿指定轴将值插入到指定下标之前
    • delete: 返回删掉某个轴的子数组的新数组
    • unique: 寻找数组内的唯一元素

    6、形状变换

    可以通过数组的shape属性,查看它的形状,reshape方法不会修改数组本身,resize则正好相反:

    7、堆积数组

    可以在不同的轴上堆积数组:

    >>> a = np.floor(10*np.random.random((2,2)))
    >>> a
    array([[7., 4.],
           [8., 8.]])
    >>> b = np.floor(10*np.random.random((2,2)))
    >>> b
    array([[3., 0.],
           [0., 1.]])
    >>> np.vstack((a,b))
    array([[7., 4.],
           [8., 8.],
           [3., 0.],
           [0., 1.]])
    >>> np.hstack((a,b))
    array([[7., 4., 3., 0.],
           [8., 8., 0., 1.]])
    >>> np.column_stack((a,b))
    array([[7., 4., 3., 0.],
           [8., 8., 0., 1.]])
    

    8、分割数组

    使用hsplit,可以沿着数组的水平轴拆分数组,方法是指定要返回的相等形状数组的数目,或者指定在其后面进行拆分的列:

    >>> a = np.floor(10*np.random.random((2,12)))
    >>> a
    array([[3., 3., 9., 3., 3., 1., 6., 5., 2., 2., 3., 5.],
           [8., 1., 4., 0., 0., 1., 5., 9., 9., 0., 8., 9.]])
    >>> np.hsplit(a,3)
    [array([[3., 3., 9., 3.],
           [8., 1., 4., 0.]]), array([[3., 1., 6., 5.],
           [0., 1., 5., 9.]]), array([[2., 2., 3., 5.],
           [9., 0., 8., 9.]])]
    >>> np.hsplit(a, (3,4))
    [array([[3., 3., 9.],
           [8., 1., 4.]]), array([[3.],
           [0.]]), array([[3., 1., 6., 5., 2., 2., 3., 5.],
           [0., 1., 5., 9., 9., 0., 8., 9.]])]
    >>> np.array_split(a,3)
    [array([[3., 3., 9., 3., 3., 1., 6., 5., 2., 2., 3., 5.]]), array([[8., 1., 4., 0., 0., 1., 5., 9., 9., 0., 8., 9.]]), array([], shape=(0, 12), dtype=float64)]
    >>> np.array_split(a,3, axis=0)
    [array([[3., 3., 9., 3., 3., 1., 6., 5., 2., 2., 3., 5.]]), array([[8., 1., 4., 0., 0., 1., 5., 9., 9., 0., 8., 9.]]), array([], shape=(0, 12), dtype=float64)]
    >>> np.array_split(a,3, axis=1)
    [array([[3., 3., 9., 3.],
           [8., 1., 4., 0.]]), array([[3., 1., 6., 5.],
           [0., 1., 5., 9.]]), array([[2., 2., 3., 5.],
           [9., 0., 8., 9.]])]
    

    9、视图和复制

    在操作或变换数组的时候,有时候会修改数组本身,有时候又不会,具体分为下面三种情况:

    • 完全不复制
    • view视图(view)
    • 深度拷贝(copy)

    10、统计方法

    方法 说明
    sum 求和
    mean 算术平均数
    std 标准差
    var 方差
    min 最小值
    max 最大值
    argmax 最大元素在指定轴上的索引
    argmin 最小元素在指定轴上的索引
    cumsum 累积的和
    cumprod 累积的乘积

    11、随机数

    numpy 带一个random模块,下表是部分函数:

    函数 功能
    random 返回一个区间[0.0, 1.0)中的随机函数
    seed 向随机数生成器传递随机状态种子
    permutation 返回一个序列的随机排列,或者返回一个乱序的整数范围序列
    shuffle 随机排列一个序列
    rand 从均匀分布中抽取样本
    randint 根据给定的有低到高的范围抽取随机整数
    randn 从均值0,方差1的正态分布中抽取样本
    normal 从正态分布中抽取样本
    beta 从beta分布中抽取样本
    gamma 从伽马分布中抽取样本
    uniform 从均匀[0, 1)中抽取样本
    ... ...

    相关文章

      网友评论

          本文标题:Numpy使用

          本文链接:https://www.haomeiwen.com/subject/eiinfctx.html