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]]
    
posted @ 2019-01-22 19:05  琳嘉  阅读(169)  评论(0编辑  收藏  举报