zoukankan      html  css  js  c++  java
  • Numpy学习笔记

    Numpy学习笔记

    什么是Numpy

    • NumPy是一个功能强大的Python库,主要用于对多维数组执行计算,允许更高级的数据操作和数学计算。 它包括数学、逻辑、数组形状变换、排序、选择、I/O 、离散傅立叶变换、基本线性代数、基本统计运算、随机模拟等等。
      • 机器学习模型:在编写机器学习算法时,需要对矩阵进行各种数值计算。例如矩阵乘法、换位、加法等。NumPy提供了一个非常好的库,用于简单(在编写代码方面)和快速(在速度方面)计算。NumPy数组用于存储训练数据和机器学习模型的参数。
      • 图像处理和计算机图形学:计算机中的图像表示为多维数字数组。NumPy成为同样情况下最自然的选择。实际上,NumPy提供了一些优秀的库函数来快速处理图像。例如,镜像图像、按特定角度旋转图像等。
      • 数学任务:NumPy对于执行各种数学任务非常有用,如数值积分、微分、内插、外推等。因此,当涉及到数学任务时,它形成了一种基于Python的MATLAB的快速替代。
    • Numpy安装:在shell上使用以下命令:pip install numpy

    Numpy基础知识

    • NumPy的数组类被称为ndarray。别名为 array。 请注意,numpy.array 与标准Python库类 array.array 不同,后者仅处理一维数组并提供较少的功能。 ndarray 对象则提供更关键的属性:
      • ndarray.ndim:数组的轴(维度)的个数。在Python世界中,维度的数量被称为rank。
      • ndarray.shape:数组的维度。这是一个整数的元组,表示每个维度中数组的大小。对于有n行和m列的矩阵,shape将是(n,m)。因此,shape元组的长度就是rank或维度的个数 ndim
      • ndarray.size:数组元素的总数。这等于shape的元素的乘积。
      • ndarray.dtype:一个描述数组中元素类型的对象。可以使用标准的Python类型创建或指定dtype。另外NumPy提供它自己的类型。例如numpy.int32、numpy.int16和numpy.float64。
      • ndarray.itemsize:数组中每个元素的字节大小。例如,元素为 float64 类型的数组的 itemsize 为8(=64/8),而 complex32 类型的数组的 itemsize 为4(=32/8)。它等于 ndarray.dtype.itemsize
      • ndarray.data:该缓冲区包含数组的实际元素。通常,我们不需要使用此属性,因为我们将使用索引访问数组中的元素。

    经典例子

    >>> import numpy as np
    >>> a = np.arange(15).reshape(3, 5)
    >>> a
    array([[ 0,  1,  2,  3,  4],
            [ 5,  6,  7,  8,  9],
            [10, 11, 12, 13, 14]])
    >>> a.shape
    (3, 5)
    >>> a.ndim
    2
    >>> a.dtype.name
    'int64'
    >>> a.itemsize
    8
    >>> a.size
    15
    >>> type(a)
    <type 'numpy.ndarray'>
    >>> b = np.array([6, 7, 8])
    >>> b
    array([6, 7, 8])
    >>> type(b)
    <type 'numpy.ndarray'>
    

    ndarray数组创建方法

    • 利用python语言中的列表、元组来创建。

      • a = np.array(list/tuple)
        
    • 数组的类型也可以在创建时明确指定:

      • c = np.array(list.tuple,dtype=np.float32)
        
    • 利用Numpy中的函数创建特定的ndarray数组,shape是元组类型

      函数 说明
      np.arange(n) 使用和range()一样,类型为ndarray
      np.ones(shape) 创建一个全1数组
      np.zeros(shape) 创建一个全0数组
      np.full(shape,val) 创建一个全val数组
      np.eye(n) 创建一个正方形n*n单位矩阵,对角线为1,其余为0
      • 以np.full(shope,val)举例

        d = np.full((2,3),3) #val不能省略
        print(d)
        # 输出
        [[3 3 3]
         [3 3 3]]
        
    • 用已知数组形状来生成特定值数组,已知数组a

      函数 说明
      np.ones_like(a) 生成数组a形状的全1数组
      np.zeros_like(a) 生成数组a形状的全0数组
      np.full_like(a,val) 生成数组a形状的全val数组
      • 以np.full_like(shope,val)举例

        d = np.eye(2)
        print("d数组为:",d)
        e = np.full_like(d,2)
        print("e数组为:",e)
        # 输出
        d数组为: [[1. 0.]
         [0. 1.]]
        e数组为: [[2. 2.]
         [2. 2.]]
        
    • 其他创建数组方法

      函数 说明
      np.linspace() 根据数据等距填充到数组
      np.concatenate() 将若干个数组合并成一个新的数组
      ## np.linspace()示例
      
      d = np.linspace(0,10,3) #第一个值为起始值,第二个值为结束值,第三个值为元素个数
      #d数组为: [ 0.  5. 10.]
      
      d = np.linspace((10,10,10),(0,0,0),3)#第一个值为起始值,第二个值为结束值,第三个值为元素个数,这里把一维数组看作一个元素比较好理解
      [[10. 10. 10.]
       [ 5.  5.  5.]
       [ 0.  0.  0.]]
       
      #注意:无论初始值和结束值是几维,这两个值形状一定要对应好,且两个值中的每个维度的所有项的形状相同
      

    数组的维度变换

    方法 说明
    .reshape(shape) 不改变数组元素,返回一个shape形状的数组,原数组不变
    .resize(shape) 同上,但是是修改了原数组
    .swapaxes(ar1,ar2) 将数组n各维度中的两个维度进行调换
    .flatten() 对数组降维,返回一维数组,原数组不变

    数组的类型变换

    • new_array = array.astype(new_type),不改变原数组类型

    数组向列表转换

    • list1 = array.tolist()

    将一个数组分成几个较小的数组

    • 使用 hsplit ,可以沿其水平轴拆分数组,通过指定要返回的均匀划分的数组数量,或通过指定要在其后进行划分的列:

      np.hsplit(a,3)   # Split a into 3
      p.hsplit(a,(3,4))   # Split a after the third and the fourth column
      
    • vsplit 沿纵轴分割,并且 array_split 允许指定沿哪个轴分割。

    数组运算

    • 数组与标量之间的运算:数组中的每一个元素和标量进行运算
    • 数组求和。np.sum(a) 或a.sum()
    • 数组方差。np.var(a)
    数组常见的几种值
    方法 说明
    array.mean() 数组所有元素的算术平均值
    array.max() 数组所有元素的最大值
    array.min() 数组所有元素的最小值

    浅谈axis

    a = [[[1 2 3 4][4 3 2 1]]
         [[1 2 3 4][4 3 2 1]]]
    a.shape = (2, 2, 4)#即从里到外共nol=3层
    #以a.sum(axis=n) n可以是0,1,2的值,即最大为nol-1,也可以是-3,-2 -1的值,这里是和数组层数相关,为负数时是正数-层数即0-3=-3,所以看下一行
    #a.sum(axis=0)和a.sum(axis=-3)结果相同
    

    如上图所示有3层[],给上面三层[]编号n——从左到右分别是0,1,2;这里的n和上述a.sum(axis=n) 一致。

    • a.sum(axis=0) 即在第1层[]中对应元素相加之和,1+1=2,2+2=4,3+3=6.....3+3=6,2+2=4,1+1=2。整合结果为:

      [[2 4 6 8]
       [8 6 4 2]]
      
    • a.sum(axis=1) 即在第2层[]中对应元素相加之和,1+4=5,2+3=5,3+2=5,4+1=5,1+4=5,2+3=5,3+2=5,4+1=5。整合结果为:

      [[5 5 5 5]
       [5 5 5 5]]
      
    • a.sum(axis=2) 即在第3层[]中对应元素相加之和,1+2+3+4=10,4+3+2+1=10,1+2+3+4=10,4+3+2+1=10。整合结果为:

      [[10 10]
       [10 10]]
      
  • 相关阅读:
    【数论】【快速幂】【扩展欧几里得】【BSGS算法】bzoj2242 [SDOI2011]计算器
    【数论】【ex-BSGS】poj3243 Clever Y
    【数论】【扩展欧几里得】hdu3579 Hello Kiki
    【CCpp程序设计2017】推箱子游戏
    【Miller-Rabin算法】
    【数论】nefu119 组合素数
    【数论】nefu118 n!后面有多少个0
    【树形dp】vijos P1180 选课
    【树形dp】Codeforces Round #405 (rated, Div. 1, based on VK Cup 2017 Round 1) B. Bear and Tree Jumps
    【树形dp】VK Cup 2012 Round 1 D. Distance in Tree
  • 原文地址:https://www.cnblogs.com/chu03/p/10305457.html
Copyright © 2011-2022 走看看