美文网首页python数学应用
Numpy库的使用介绍

Numpy库的使用介绍

作者: tansuhang | 来源:发表于2021-05-25 13:41 被阅读0次

    导言

    Numpy库是Python进行科学计算的基础库,它是一个由多维数组对象组成,包含数学运算、逻辑运算、形状操作、排序、选择、I/O、离散傅里叶变换、基本线性代数、基本统计运算、随机模拟等功能。本文将介绍Numpy库的基本操作和简单应用。

    官方参考文档链接: NumPy Reference — NumPy v1.20 Manual

    1 Numpy库的安装

    在Linux和macOS系统下的安装:

    sudo pip install numpy
    

    在Windows系统下的安装:

    pip install numpy
    

    2 Numpy 数组

    首先导入numpy

    import numpy as np
    

    我们可以使用np.zeros创建一个只包含0的数组。

    a = np.zeros(3)
    print(a)
    print(type(a)) # 打印变量a的类型
    

    输出结果如下:

    array([0., 0., 0.])
    numpy.ndarray
    

    Numpy数组和Python自带的列表有些类似,但是在Numpy数组中,每一个元素的数据类型必须相同。常见的数据类型包括:1. float64: 64 位浮点型数字,2. int64: 64 位整数型数字,3. bool: 8 位 True 或者 False判断。通常来说,默认的数据类型为float64

    输入以下代码:

    a = np.zeros(3)
    print(type(a[0]))
    a = np.zeros(3, dtype=int) # 把数据类型转化为整数型
    print(type(a[0]))
    

    输出结果如下:

    numpy.float64
    numpy.int64
    

    3 数组维度

    建立一个长度为10,元素均为0的数组z

    z = np.zeros(10)
    

    目前z数组没有维度,既不是行向量也不是列向量。数组的维度由shape属性记录,记录在一个元组中。

    print(z.shape)
    

    输出结果如下:

    (10,)
    

    输出结果中的元组只含有一个元素,代表数组的长度。为了使数组具有维度,我们可以改变shape属性。

    z.shape = (10, 1)
    print(z)
    

    输出结果如下:

    array([[0.],
           [0.],
           [0.],
           [0.],
           [0.],
           [0.],
           [0.],
           [0.],
           [0.],
           [0.]])
    
    z = np.zeros(4)
    z.shape = (2, 2)
    print(z)
    

    输出结果如下:

    array([[0., 0.],
           [0., 0.]])
    

    4 创建数组

    我们先前提到过,np.zeros能构建元素为0的数组,np.ones则与之类似,能构建元素为1的数组。另一个类似的函数是np.empty,它能在内存中创建一个空数组,以备之后填入数据。

    z = np.empty(3)
    print(z)
    

    输出结果如下:

    array([0., 0., 0.])
    

    为了创建均匀间隔创建数值序列,我们可以使用np.linspace函数

    z = np.linspace(start = 0, stop = 100, num = 5)
    print(z)
    

    输出结果如下:

    array([ 0., 25., 50., 75., 100.])
    

    为创建单位矩阵,我们可以使用np.identity或者np.eye函数

    z = np.identity(2)
    print(z)
    

    输出结果如下:

    array([[1., 0.],
           [0., 1.]])
    

    此外,使用np.array函数,Python的列表,元组等也能转换为Numpy数组

    a = np.array([10, 20]) # 使用列表构建数组
    print(a)
    b = np.array((10, 20), dtype=float) # 使用元组构建数组
    # dtype 选项可以指定数据类型
    print(b)
    c = np.array([[1, 2], [3, 4]]) # 使用列表嵌套列表构建数组
    print(c)
    

    输出结果如下:

    array([10, 20])
    array([10., 20.])
    array([[1, 2],
           [3, 4]])
    

    Numpy数组中也存在深拷贝和浅拷贝的区别,深拷贝即再内存中新建一个数据副本,两个数组内存地址不同,可以分别修改,浅拷贝即不在内存中新建地址,仅仅引用之前的地址,两个数组内存地址相同,只能同时修改

    a = np.random.randn(3)
    print(a)
    b = a
    b[0] = 0.0
    print(a)
    # 浅拷贝
    a = np.random.randn(3)
    print(a)
    b = np.copy(a)
    print(b)
    # 深拷贝
    

    输出结果如下:

    array([-0.09651763, -0.4620335 , 1.2756674 ])
    array([ 0. , -0.4620335, 1.2756674])
    array([ 0.81440966, -1.05123774, -1.24405026])
    array([ 0.81440966, -1.05123774, -1.24405026])
    

    5 数组的索引

    对于一维数组或者没有维度的数组,索引的方式和Python类似

    z = np.linspace(1, 2, 5)
    print(z)
    print(z[0])
    print(Z[0:2])
    print(z[-1])
    

    输出结果如下:

    array([1. , 1.25, 1.5 , 1.75, 2. ])
    1.0
    array([1. , 1.25])
    2.0
    

    对于多维数组,索引方式如下:

    z = np.array([[1, 2], [3, 4]])
    print(z)
    print(z[0, 0])
    print(z[0, 1])
    

    输出结果如下:

    array([[1, 2],
           [3, 4]])    
    1
    2
    

    多维列表中,若要提取行和列

    print(z[0, :])
    print(z[:, 1])
    

    输出结果如下:

    array([1, 2])
    array([2, 4])
    

    NumPy也能通过构建新的数组作为索引提取数据

    z = np.linspace(2, 4, 5)
    print(z)
    indices = np.array((0, 2, 3))
    print(z[indices])
    

    输出结果如下:

    array([2. , 2.5, 3. , 3.5, 4. ])
    array([2. , 3. , 3.5])
    

    最后,布尔类型的数据也可用于提取元素

    d = np.array([0, 1, 1, 0, 0], dtype=bool)
    print(d)
    print(z[d])
    

    输出结果如下:

    array([False, True, True, False, False])
    array([2.5, 3. ])
    

    6 数组的方法

    数组有非常多的方法,一些常见的方法如下:

    a = np.array((4, 3, 2, 1))
    print(a)
    print("sort =",a.sort())   # 对数组a进行排序
    print("sum =",a.sum())  # 对数组a进行求和
    print("mean =",a.mean())   # 求出数组a的均值
    print("max =",a.max())   # 求出数组a的最大值
    print("argmax =",a.argmax())   # 返回最大元素的索引
    print("cumsum =",a.cumsum())   # 对每个元素累积求和
    print("cumprod =",a.cumprod())    # 对每个元素累积求积
    print("var =",a.var())  # 求数组a的方差
    print("std =", a.std())   # 求数组a的标准差
    a.shape = (2, 2)
    print(a.T)  # 对数组a进行转置
    

    输出结果如下:

    array([4, 3, 2, 1])
    sort = array([1, 2, 3, 4])
    sum = 10
    mean = 2.5
    max = 4
    argmax = 3
    cumsum = array([ 1, 3, 6, 10])
    cumprod = array([ 1, 2, 6, 24])
    var = 1.25
    std = 1.118033988749895
    array([[1, 3],
           [2, 4]])
    

    7 数组的操作

    7.1 算术操作

    a = np.array([1, 2, 3, 4])
    b = np.array([5, 6, 7, 8])
    print(a + b)    # 加
    print(a * b)    # 乘
    print(a + 10)    # 对每个元素添加一个标量
    print(a * 10)    # 对每个元素乘一个标量
    

    输出结果如下:

    array([ 6, 8, 10, 12])
    array([ 5, 12, 21, 32])
    array([11, 12, 13, 14])
    array([10, 20, 30, 40])
    

    7.2 矩阵乘法

    A = np.ones((2, 2))
    B = np.ones((2, 2))
    print(A @ B)  # 两个矩阵相乘
    

    输出结果如下:

    array([[2., 2.],
           [2., 2.]])
    

    相关文章

      网友评论

        本文标题:Numpy库的使用介绍

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