📜  Python中的NumPy 1(简介)

📅  最后修改于: 2020-04-15 05:08:50             🧑  作者: Mango

本文将帮助您熟悉Python中广泛使用的数组处理库NumPy

什么是NumPy?
NumPy是一个通用的数组处理程序包。它提供了一个高性能的多维数组对象,以及用于处理这些数组的工具。
它是使用Python进行科学计算的基本软件包。它包含各种功能,包括以下重要功能:

  • 强大的N维数组对象
  • 复杂的(broadcast)功能
  • 集成C/C++和Fortran代码的工具
  • 有用的线性代数,傅立叶变换和随机数函数

除了其明显的科学用途外,NumPy还可以用作通用数据的高效多维容器。
可以使用Numpy定义任意数据类型,它允许NumPy与各种数据库无缝且快速地集成。
安装:

  • MacLinux用户可以通过pip命令安装NumPy
    pip install numpy
    • Windows没有与Linux或Mac中类似的软件包管理器。
      请从此处下载NumPy的预构建Windows安装程序(根据您的系统配置和Python版本)。
      然后手动安装软件包。

    注意:下面讨论的所有示例都不能在在线IDE上运行
    1. NumPy中的数组: NumPy的主要对象是齐次多维数组。

    • 它是由相同整数组成的元素表(通常为数字),由正整数元组索引。
    • NumPy的数组类称为ndarray

    范例:

    [[ 1, 2, 3],
     [ 4, 2, 5]]
    此处,rank= 2(因为它是2维或2个轴),第一维(轴)长度= 2,第二维具有长度= 3,整体形状可以表示为:(2,3)
    # Python程序演示基本数组特征
    import numpy as np
    # 创建数组对象
    arr = np.array( [[ 1, 2, 3],
                     [ 4, 2, 5]] )
    # 打印对象的类型
    print("数组是类型: ", type(arr))
    # 打印array尺寸(轴)
    print("尺寸数: ", arr.ndim)
    # 列印形状
    print("阵列形状: ", arr.shape)
    # 数组的打印大小(元素总数)
    print("数组大小: ", arr.size)
    # 打印数组中元素的类型
    print("数组存储类型的元素: ", arr.dtype)

    输出:

    数组是类型:
    尺寸数::  2
    阵列形状:  (2, 3)
    数组大小:  6
    数组存储类型的元素:  int6

    2.数组创建:在NumPy中有多种创建数组的方法。

    • 例如,您可以使用array函数从常规Python 列表元组创建数组。根据序列中元素的类型推导所得数组的类型。
    • 通常,数组的元素最初是未知的,但是其大小是已知的。因此,NumPy提供了几个函数来创建具有初始占位符内容的数组。这些将增长阵列的必要性降至最低,否则这是一项昂贵的操作。例如: np.zeros,np.ones,np.full,np.empty等。
    • 为了创建数字序列,NumPy提供了类似于range的函数,该函数返回数组而不是列表。
    • arange:返回给定间隔内的均匀间隔的值,指定长。
    • linspace:返回给定间隔内的均匀间隔的值。
    • 重塑数组:我们可以使用重塑方法重塑数组。考虑一个形状为(a1,a2,a3,…,aN)的数组。我们可以重塑形状并将其转换为形状为(b1,b2,b3,…,bM)的另一个数组。唯一需要的条件是:
      a1 x a2 x a3…x aN = b1 x b2 x b3…x bM。(即数组的总的大小保持不变。)
    • 展平数组:我们可以使用展平flat方法将数组副本折叠为一个维度。它接受顺序参数。默认值为“ C”(对于行优先)。使用“ F”表示列优先。

    注意:创建数组时可以显式定义数组的类型。

    # Python程序演示数组创建技术 
    import numpy as np 
    # 从类型为float的列表创建数组 a = np.array([[1, 2, 4], [5, 8, 7]], dtype = 'float') 
    print ("使用传递的列表创建的数组:\n", a) 
    # 从元组创建数组 b = np.array((1 , 3, 2)) 
    print ("\n使用传递的元组创建的数组:\n", b) 
    # 创建一个全零的3X4数组 c = np.zeros((3, 4)) 
    print ("\n用全零初始化的数组:\n", c) 
    # 创建复杂类型的常量值数组 
    d = np.full((3, 3), 6, dtype = 'complex') 
    print ("\n用6填充初始化的数组." "数组类型是复数:\n", d) 
    # 创建一个具有随机值的数组 
    e = np.random.random((2, 2)) 
    print ("\n随机数组:\n", e) 
    # 创建一个从0到30的整数序列(步长为5) 
    f = np.arange(0, 30, 5) 
    print ("\n步长为5的顺序数组:\n", f) 
    # 创建一个范围为0到5的10个值的序列 
    g = np.linspace(0, 5, 10) 
    print ("\n一个序列数组,其间有10个值" "0 and 5:\n", g) 
    # 将3X4阵列重塑为2X2X3阵列 
    arr = np.array([[1, 2, 3, 4], [5, 2, 4, 2], [1, 2, 0, 1]]) 
    newarr = arr.reshape(2, 2, 3) 
    print ("\n原始阵列:\n", arr) print ("重塑数组:\n", newarr) 
    # 展平数组 arr = np.array([[1, 2, 3], [4, 5, 6]]) 
    flarr = arr.flatten() 
    print ("\n原始数组:\n", arr) 
    print ("展平数组:\n", flarr)

    输出:

    使用传递的列表创建的数组:
     [[ 1.  2.  4.]
     [ 5.  8.  7.]]
    使用传递的元组创建的数组:
     [1 3 2]
    用全零初始化的数组:
     [[ 0.  0.  0.  0.]
     [ 0.  0.  0.  0.]
     [ 0.  0.  0.  0.]]
    用6填充初始化的数组. 数组类型是复数:
     [[ 6.+0.j  6.+0.j  6.+0.j]
     [ 6.+0.j  6.+0.j  6.+0.j]
     [ 6.+0.j  6.+0.j  6.+0.j]]
    随机数组:
     [[ 0.46829566  0.67079389]
     [ 0.09079849  0.95410464]]
    步长为5的顺序数组:
     [ 0  5 10 15 20 25]
    一个序列数组,其间有10个值 0 and 5:
     [ 0.          0.55555556  1.11111111  1.66666667  2.22222222  2.77777778
      3.33333333  3.88888889  4.44444444  5.        ]
    原始阵列:
     [[1 2 3 4]
     [5 2 4 2]
     [1 2 0 1]]
    重塑数组:
     [[[1 2 3]
      [4 5 2]]
     [[4 2 1]
      [2 0 1]]]
    原始数组:
     [[1 2 3]
     [4 5 6]]
    展平数组:
     [1 2 3 4 5 6]/* Your code... */

    3.数组索引:了解数组索引的基础对于分析和操作数组对象很重要。NumPy提供了许多进行数组索引的方法。

    • 切片:就像Python中的列表一样,NumPy数组也可以切片。由于数组可以是多维的,因此您需要为数组的每个维度指定一个切片。
    • 整数数组索引:在此方法中,将传递列表以为每个维建立索引。完成了对应元素的一对一映射,以构造一个新的任意数组。
    • 布尔数组索引:当我们要从满足条件的数组中选择元素时,使用此方法输出:
      # Python程序演示numpy中的索引编制 
      import numpy as np 
      # 示例数组 arr = np.array([[-1, 2, 0, 4], [4, -0.5, 6, 0], [2.6, 0, 7, 8], [3, -7, 4, 2.0]]) 
      # 切片 temp = arr[:2, ::2] 
      print ("具有前两行和备用行的数组" "columns(0 and 2):\n", temp) 
      # 整数数组索引示例 
      temp = arr[[0, 1, 2, 3], [3, 2, 1, 0]] 
      print ("\n元素在索引(0, 3), (1, 2), (2, 1)," "(3, 0):\n", temp) 
      # 布尔数组索引示例 cond = arr > 0 
      # cond是一个布尔数组 
      temp = arr[cond] 
      print ("\n大于0的元素:\n", temp)
    具有前两行和备用行的数组(0 and 2):
     [[-1.  0.]
     [ 4.  6.]]
    元素在索引(0, 3), (1, 2), (2, 1),(3, 0):
     [ 4.  6.  0.  3.]
    大于0的元素:
     [ 2.   4.   4.   6.   2.6  7.   8.   3.   4.   2. ]

    4.基本操作: NumPy中提供了内置算术函数。

    • 对单个数组的运算我们可以使用重载算术运算符对数组进行按元素运算以创建新数组。在+ =,-=,* =运算符的情况下,将修改现有数组。
      # Python程序演示单个数组上的基本操作
      import numpy as np
      a = np.array([1, 2, 5, 3])
      # 给每个元素加1
      print ("每个元素加1:", a+1)
      # subtract 3 from each element
      print ("从每个元素中减去3:", a-3)
      # 每个元素乘以10
      print ("每个元素乘以10:", a*10)
      # 平方每个元素
      print ("平方每个元素:", a**2)
      # 修改现有数组
      a *= 2
      print ("将原始数组的每个元素加倍:", a)
      # 数组转置
      a = np.array([[1, 2, 3], [3, 4, 5], [9, 6, 0]])
      print ("\n原始数组:\n", a)
      print ("数组转置:\n", a.T)

      输出:

      每个元素加1: [2 3 6 4]
      从每个元素中减去3: [-2 -1  2  0]
      每个元素乘以10: [10 20 50 30]
      平方每个元素: [ 1  4 25  9]
      将原始数组的每个元素加倍: [ 2  4 10  6]
      原始数组:
       [[1 2 3]
       [3 4 5]
       [9 6 0]]
      数组转置:
       [[1 3 9]
       [2 4 6]
       [3 5 0]]

      一元运算符:许多一元运算作为ndarray类的方法提供。这包括总和,最小值,最大值等。也可以通过设置轴参数来逐行或逐列应用这些功能。

      # Python程序演示numpy中的一元运算符
      import numpy as np
      arr = np.array([[1, 5, 6],
                      [4, 7, 2],
                      [3, 1, 9]])
      # 数组的最大元素
      print ("最大元素是:", arr.max())
      print ("按行最大元素:",
                          arr.max(axis = 1))
      # 数组的最小元素
      print ("列式最小元素:",
                              arr.min(axis = 0))
      # 数组元素之和
      print ("所有数组元素的总和:",
                                  arr.sum())
      # 每行的累计总和
      print ("每一行的累计总和:\n",
                              arr.cumsum(axis = 1))
      

      输出:

      Largest element is: 9
      Row-wise maximum elements: [6 7 9]
      Column-wise minimum elements: [1 1 2]
      Sum of all array elements: 38
      Cumulative sum along each row:
      [[ 1  6 12]
       [ 4 11 13]
       [ 3  4 13]]

      二进制运算符:这些运算适用于元素数组,并创建一个新数组。您可以使用所有基本的算术运算符,例如+,-,/,等。对于+=,-=, =运算符,将修改现有的数组。

      # Python程序在Numpy中演示二进制运算符
      import numpy as np
      a = np.array([[1, 2],
                  [3, 4]])
      b = np.array([[4, 3],
                  [2, 1]])
      # 数组相加
      print ("数组总和:\n", a + b)
      # 数组乘法(逐元素乘法)
      print ("数组乘法:\n", a*b)
      # 矩阵乘法
      print ("矩阵乘法:\n", a.dot(b))

      输出:

      数组总和:
      [[5 5]
       [5 5]]
      数组乘法:
      [[4 6]
       [6 4]]
      矩阵乘法:
      [[ 8  5]
       [20 13]]
      • 通用函数(ufunc): NumPy提供了熟悉的数学函数,例如sin,cos,exp等。这些函数还在数组上逐元素进行操作,从而生成数组作为输出。

      注意:上面我们使用重载运算符执行的所有操作都可以使用ufuncs来完成,例如np.add,np.subtract,np.multiply,np.divide,np.sum等。

      # Python程序演示numpy中的通用函数
      import numpy as np
      # 创建一个正弦值数组
      a = np.array([0, np.pi/2, np.pi])
      print ("数组元素的正弦值:", np.sin(a))
      # 指数值
      a = np.array([0, 1, 2, 3])
      print ("数组元素的指数:", np.exp(a))
      # 数组值的平方根
      print ("数组元素的平方根:", np.sqrt(a))

      输出:

      数组元素的正弦值: [  0.00000000e+00   1.00000000e+00   1.22464680e-16]
      数组元素的指数: [  1.           2.71828183   7.3890561   20.08553692]
      数组元素的平方根: [ 0.          1.          1.41421356  1.73205081]

      4.排序数组:有一个简单的np.sort方法可以对NumPy数组进行排序。让我们来探讨一下。

      # Python程序演示numpy排序
      import numpy as np
      a = np.array([[1, 4, 2],
                       [3, 4, 6],
                    [0, -1, 5]])
      # 排序数组
      print ("数组元素按排序顺序:\n",
                          np.sort(a, axis = None))
      # 按行排序数组
      print ("按行排序的数组:\n",
                      np.sort(a, axis = 1))
      # 指定排序算法
      print ("通过应用合并排序进行列明智排序:\n",
                  np.sort(a, axis = 0, kind = 'mergesort'))
      # 显示结构化数组排序的示例为dtypes设置别名
      dtypes = [('name', 'S10'), ('grad_year', int), ('cgpa', float)]
      # 要放入数组的值
      values = [('Hrithik', 2009, 8.5), ('Ajay', 2008, 8.7),
                 ('Pankaj', 2008, 7.9), ('Aakash', 2009, 9.0)]
      # 创建数组
      arr = np.array(values, dtype = dtypes)
      print ("\n数组按名称排序:\n",
                  np.sort(arr, order = 'name'))
      print ("数组按毕业年份和cgpa排序:\n",
                      np.sort(arr, order = ['grad_year', 'cgpa']))

      输出:

      数组元素按排序顺序:
      [-1  0  1  2  3  4  4  5  6]
      按行排序的数组:
      [[ 1  2  4]
       [ 3  4  6]
       [-1  0  5]]
      通过应用合并排序进行列明智排序:
      [[ 0 -1  2]
       [ 1  4  5]
       [ 3  4  6]]
      数组按名称排序:
      [('Aakash', 2009, 9.0) ('Ajay', 2008, 8.7) ('Hrithik', 2009, 8.5)
       ('Pankaj', 2008, 7.9)]
      数组按毕业年份和cgpa排序:
      [('Pankaj', 2008, 7.9) ('Ajay', 2008, 8.7) ('Hrithik', 2009, 8.5)
       ('Aakash', 2009, 9.0)]

      因此,这是NumPy库的简短而简洁的介绍和教程。