机器学习入门——Numpy的基本用法

Numpy

Array

  • Array的属性

    • 维数
    • 形状——x行x列
    • size——数组中所有元素数量的总数
    # numpy.array常用的属性
    arr = np.array([[1,2,3],[4,5,6]])
    print(arr)
    print("number of dim:", arr.ndim)
    print("shape:", arr.shape)
    print("size:", arr.size)
    
  • Numpy创建array

    • 创建array时指定类型

      a = np.array([2,3,4], dtype = np.double)
      a = np.array([2,3,4], dtype = int)
      a = np.array([2,3,4], dtype = float)
      print(a.dtype)
      
    • 创建多维array

      b = np.array([[1,2,3],[4,5,6]])
      
    • 生成全0/1矩阵

      # 生成全0/1矩阵
      c1 = np.zeros((2,2),dtype = int)
      c2 = np.ones((3,3))
      

      默认情况下,zeros和ones的类型为float64

    • 生成有序数组

      d = np.arange(10,20,2)
      
      1. np.arange()完整表达为arange([start],end,[step]),其中step不是必须项,start默认为0
      2. 生成的数组包含start,不包含end
    • 将生成的数组转换为矩阵

      e = np.arange(12).reshape(3,4)
      

      需要注意数组的元素个数要和矩阵的元素个数相同

    • 生成线段

      e2 = np.linspace(1,10,5)
      
      1. linspace(初值,终值,段数),会自适应步长,包含终值
      2. 也可以使用reshape

Numpy基础运算

Array运算

  • array的加减法
a1 = np.array([10,20,30,40])
a2 = np.arange(4)

res1 = a1 - a2
res2 = a1 + a2

两个维度相同的array对应元素进行运算

  • array的平方运算

    res2 = a1**2
    

    对应元素进行平方运算

  • 三角函数运算

    res3 = 10*np.sin(a1)
    res3 = 10*np.cos(a1)
    res3 = 10*np.tan(a1)
    
  • 判断数组中的元素大于、小于、等于某个值

    print(a1 > 3)
    

矩阵运算

a = np.array([[1,1], [0,1]])
b = np.arange(4).reshape(2,2)
  • 元素逐个相乘

    c = a * b
    

    两个矩阵不一定要同型。列相同按照列进行,行相同按照行进行

  • 矩阵乘法

    c_dot = np.dot(a, b)
    c = a.dot(b)
    

    计算规则的两个对象需要满足矩阵乘法的定义要求

  • 生成随机矩阵

    a = np.random.rand(2,4)
    

    参数为生成数组的形状,默认为一个数

  • 矩阵中的max,min,sum

    np.sum(a)
    np.max(a)
    np.min(a)
    
    print(np.max(a, axis=0)) # 输出每一每列的最大值
    
    

    函数由axis属性,axis=1代表对行操作,axis=0代表对列操作

  • 矩阵元素的平均值

    np.mean(A)
    np.average(A)
    

    可以用axis执行是对行还是列进行计算,axis=0对列,axis=1对行

  • 矩阵中元素的中位数

    np.median(A)
    
  • 矩阵元素逐项累加、累差

    np.cumsum(A)
    np.diff(A)
    
  • 矩阵转置

    np.transpose(A)
    A.T
    
  • 替换矩阵中值得范围

    np.clip(A, 5, 9)
    

    clip(array,min,max)替换后,矩阵中大于max的值换为max,小于min的值替换为min

索引计算

  • 通过索引访问

    A[index] #一维
    
    # 二维
    A[index1][index2]
    A[index1,index2]
    A[index,:] # index-1行的所有数
    A[:,index] # index-1列的所有数
    A[index][index1:index2] # index-1行index1-1到index2-2的数
    
    1. index从0开始计算
    2. 对于二维数组,如果只指定一个索引,则输出一整行
  • 矩阵中最值的索引

    np.argmin(A)
    np.argmax(A)
    
  • 矩阵中非零元素的坐标

    np.nonzero(A)
    

    输出结果为两个array,第一个array代表元素的行索引,第二个array代表元素的列索引

  • 矩阵元素排序

    np.sort(A)
    

    这里的排序是对矩阵中的元素按行为单位进行排序

  • 对行/列迭代

    # 对行
    for row in A:
        print(row)
        
    # 对列
    for column in A.T:
        print(column)
    

    python中没有对列迭代的机制,可以迭代转置矩阵的行

  • 迭代每一个元素

    A.flat  # 返回一个迭代器
    A.flatten() # 返回一个一行的数组
    
    for item in A.flat:
        print(item)
    

Array合并

  • 按行上下合并(vertical stack)

    C = np.vstack((A,B))
    
  • 水平合并到一行(horizontal stack)

    C = np.hstack((A,B))
    
  • 利用concatenate()

    C = np.concatenate((A,A,B,B), axis=0) # 等价于vstack()
    print(C)
    C = np.concatenate((A,A,B,B), axis=1) # 等价于hstack()
    print(C)
    

Array分割

  • 从两个方向进行等量分割

    print(np.split(A.T,2,axis=0)) # np.vsplit(A.T,2)
    print(np.split(A,2,axis=1)) # np.hsplit(A,2)
    

    可以理解为axis指定了对矩阵的某一个维度进行分割

    如一个(4,6)的矩阵

    axis=0,就是对4进行分割,分割成两个(2,6)的矩阵

copy和deep copy

  • 如果对于两个数组,采用b=a进行赋值,本质上是传递了对象的地址,当a改变值b也会改变
  • 如果使用b=a.copy()则仅仅是进行元素值的赋值,两者并没有相互关联

版权声明:本文为qq_42160460原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。