Numpy

Posted by Blog of biggan on January 1, 2018

Numpy

1.introduce

  1. Numerical Python 是 Python 语言的一个扩展程序库,支持大量的多维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。
  2. NumPy有两种数据结构,numpy.ndarray和numpy.matrix。ndarray是N 维数组对象 ,matrix是二维矩阵对象。
  3. ndarray和matrix是一系列同类型数据的集合,以 0 下标为开始进行集合中元素的索引。

2.matrix

  1. matrix创建

    n = np.matrix([1, 2, 4])
    print(n)
       
    m = np.matrix([[1, 2], [3, 4]])
    print(m)
    # np.matrix接收的参数必须是一维或二维的,且返回的是二维矩阵
    

Note:matrix是一种特定维度的ndarray,和ndarray使用方法相同,参考下面ndarray使用方法即可。

3. ndarray

  1. ndarray创建

    np.array(),用list或tuple创建ndarray

    a = [1, 2, 3]
    b = np.array(a)
    print(a)    # [1, 2, 3]
    print(b)    # [1 2 3]
       
    c = np.array([[1, 2, 3], [4, 5, 6]])
    print(c)
    # [[1 2 3]
    #  [4 5 6]]
       
    d = np.array([[1, 2, 3], [4, 5]])
    print(d)    # [list([1, 2, 3]) list([4, 5])]
       
    e = np.array([1, 2, 3]*3)
    print(e)    # [1 2 3 1 2 3 1 2 3]
       
    # numpy.array接收的参数,可以是各种维度的list, tuple
    # ndarray数组各元素之间没有逗号
    # 当list能构成一个矩阵时,转化后的numpy将是一个矩阵。
    # 当list不能构成一个矩阵,即list内list长度不一,转化后的numpy的元素为list。
    
  2. 特殊ndarray数组生成

    • 等比数列ndarray

      n1 = np.arange(0, 20, 2)  # 起,末,间隔 (左闭右开)
      print(n1)
      # [ 0  2  4  6  8 10 12 14 16 18]
      # 是arange 而不是 arrange, 元素为int
      
    • 全 0/1 ndarray数组

      n2 = np.zeros((2, 2))
      print(n2)
      # [[1. 1.]
      #  [1. 1.]]
           
      n3 = np.ones((2, 2))
      print(n3)
           
      # 参数为元组,要加()
      # ndarray数组内部元素为浮点型
      
    • 同维度ndarray数组

      n4 = np.ones_like(n2)
      print(n4)
      n5 = np.zeros_like(n2)
      print(n5)
      
  3. ndarray数组重构

    n = np.arange(0, 20, 2)
    print(n.shape)  # (10,)
       
    n1 = n.reshape(2, 5)
       
    print(n1)
    # [[ 0  2  4  6  8]
    #  [10 12 14 16 18]]
       
    print(n1.shape)	# (2, 5)
    
  4. ndarray数组运算

    • ndarray数组和常数运算

      #### (1 ndarray数组和常数算术运算  + - * / ** //
      # 对ndarray数组中每个元素与常数进行运算
      n = np.arange(0, 5)
      print(n*5, n+5, n//2)     # [0 5 10 15 20] [5 6 7 8 9] [0 0 1 1 2]
           
      #### (2 ndarray数组和常数逻辑运算  == > < >= <=
      # 对ndarray数组中每个元素与常数进行比较,返回的ndarray数组的元素为bool型
      a = np.arange(20).reshape(4, 5)
      print(a>0)
      # [[False  True  True  True  True]
      #  [ True  True  True  True  True]
      #  [ True  True  True  True  True]
      #  [ True  True  True  True  True]]
      
    • ndarray数组之间运算

      #### (3 ndarray数组之间运算  + - * / ** //
      ######## 要求运算的两ndarray数组维度相同,然后对应元素运算,结果维度不变
      n = np.arange(0, 10).reshape(2, 5)
      print(n)
      print(n*n)
      
    • numpy矩阵乘法

      #### (4 numpy矩阵乘法
          # 分为元素乘法和矩阵乘法,区别于向量的点乘(内积)和叉乘
          # 元素乘法:np.mutiply(a, b)
          # 矩阵乘法:np.dot(a, b) 或a.dot(b) 或 np.matmul(a,b)
          # * ,在np.array中被重载为元素乘法, 在np.matrix中被重载为矩阵乘法
            
      a = np.arange(0, 8).reshape(2, 4)
      b = np.arange(0, 8).reshape(4, 2)
      print(a*a)  # 元素乘法
      print(a.dot(b), np.matmul(a, b), sep='\n') # 矩阵乘法
         
      a = np.matrix(a)
      b = np.matrix(b)
      print(a*b)  # 矩阵乘法
      print(a.dot(b), np.matmul(a, b), sep='\n') # 矩阵乘法
    
  5. ndarray数组切片, 过滤

    • 切片

      ## 逗号隔开不同的维度,某维度若省略,或用:示意,则全选
      ## 对于每一个维度,用a:b的形式,选择索引a到b, 若省略:,则选择索引a到最后,若省略:b,则仅选择该维度上的索引a
      n = np.arange(0, 20).reshape(4, 5)
      print(n[1], n[1, ], n[1, :], sep='\n')
      print(n[1:], n[1:, ], n[1:, :], sep='\n')
      n[1] = 0
      n[2:, 2:] = 0
      print(n)
      
    • 过滤

      '''过滤'''
      a = np.arange(20).reshape(4, 5)
      print(a)
      # [[ 0  1  2  3  4]
      #  [ 5  6  7  8  9]
      #  [10 11 12 13 14]
      # [15 16 17 18 19]]
      print(a[a>10])
      # [11 12 13 14 15 16 17 18 19]
      a[a==0] = 111
      print(a)
      # [[111   1   2   3   4]
      #  [  5   6   7   8   9]
      #  [ 10  11  12  13  14]
      #  [ 15  16  17  18  19]]
      
  6. numpy常用函数

    a = np.arange(0, 20).reshape(4, 5)
    print(a)
    print(a.sum())
    print(a.max())
    print(a.min())
    print(a.mean())
    print(a.std())
    print(a.argmax())   # 最大元素的索引
    print(a.argmin())
    # 不论a的维度,默认返回是一个数
       
    print(a.sum(0))
    print(a.sum(1))
    # axis参数为求和的维度,对什么维度求和,则将此维度各元素想加。
    # 若为0,求和的对象是0维度上的所有向量,即[0 1 2 3 4] + [5 6 7 8 9] +  [10 11 12 13 14] + [15 16 17 18 19]
    # 若为1,求和对象为1维度上所有元素,即[0+1+2+3+4  5+6+7+8+9  10+11+12+13+14  30+34+38+42+46]
    # 其他函数的axis参数用法也类似