一、什么是NumPy

NumPy(Numerical Python的简称)是一个用于处理数组(特别是多维数组)和矩阵运算的Python库,同时也提供了大量的高级数学函数来操作这些数组。NumPy构建在Python之上,为Python提供了大量的数学计算功能,并极大地提升了Python在执行大量数学计算和数组操作时的性能和效率。

1、主要特点

  1. 强大的N维数组对象:NumPy定义了一个强大的N维数组对象,称为ndarray。这个对象是一个快速、灵活的大数据容器,可以存储大量的数据,并且提供了方便的数据操作方法。

  2. 高效的性能:NumPy的内部实现使用了C语言,这使得其在进行大量数值计算时,性能远高于纯Python实现。NumPy数组在内存中是以连续块的形式存储的,这也有助于提高数据处理的效率。

  3. 广播功能:NumPy的广播功能允许对不同形状的数组进行数学运算,而无需进行额外的数据复制。这一特性在处理不同维度的数据时非常有用。

  4. 丰富的函数库:NumPy提供了大量的函数来处理数组,包括但不限于数学函数(如sin、cos、exp等)、统计函数(如mean、std、var等)、排序函数以及线性代数函数等。

  5. 与Python生态的集成:NumPy与Python的其他科学计算库(如SciPy、Pandas、Matplotlib等)紧密集成,可以方便地进行数据处理、科学计算和可视化。

  6. 易用性和灵活性:NumPy的API设计得非常直观和易用,用户可以轻松地执行复杂的数组操作和数学计算。同时,NumPy也支持自定义的数据类型,为用户提供了极大的灵活性。

2、主要功能

  1. 数组创建和操作:NumPy提供了多种方式来创建数组,如通过列表、元组等Python原生数据结构,或者直接使用NumPy的函数(如numpy.zerosnumpy.ones等)。此外,NumPy还提供了丰富的数组操作功能,如切片、索引、形状变换等。

  2. 数学和逻辑运算:NumPy支持对数组进行各种数学运算(加、减、乘、除等)和逻辑运算(与、或、非等),这些操作都可以直接在数组上进行,而无需编写循环。

  3. 线性代数和统计功能:NumPy包含了大量的线性代数函数,如矩阵乘法、特征值分解等。同时,它也提供了丰富的统计函数,用于计算数组的均值、中位数、标准差等统计量。

  4. 随机数生成:NumPy包含了一个强大的随机数生成器,可以生成各种分布的随机数,如均匀分布、正态分布等。

  5. 与C/C++/Fortran代码的集成:NumPy提供了与C/C++/Fortran等语言的接口,使得用户可以在Python中调用这些语言编写的函数,从而进一步提高计算性能。

  6. 数据IO功能:NumPy支持从文件中读取和写入数据,包括文本文件和二进制文件,这为用户在处理大量数据时提供了便利。

二、常用函数

1、创建函数

在NumPy中,有多种函数可以用来创建数组。更多函数参考官网

这些函数提供了创建NumPy数组的不同方式,以满足各种数值计算需求。在实际应用中,可以根据具体的使用场景选择合适的创建函数。

以下是一些主要的NumPy数组创建函数及其详细介绍和示例:

  1. numpy.array():将输入数据(列表、元组等)转换为NumPy ndarray对象

    import numpy as np
    arr = np.array([1, 2, 3, 4])
    print(arr)  # 输出: [1 2 3 4]
    
  2. numpy.zeros():创建一个全零的数组,形状由参数指定

    import numpy as np
    zeros_arr = np.zeros((2, 3))
    print(zeros_arr)
    # 输出:
    # [[0. 0. 0.]
    #  [0. 0. 0.]]
    
  3. numpy.ones():创建一个全一的数组,形状由参数指定

    import numpy as np
    ones_arr = np.ones((2, 3))
    print(ones_arr)
    # 输出:
    # [[1. 1. 1.]
    #  [1. 1. 1.]]
    
  4. numpy.empty():创建一个给定形状和类型的新数组,但不初始化数组的条目(即数组的内容是随机的,取决于内存的状态)

    import numpy as np
    empty_arr = np.empty((2, 3))
    print(empty_arr)  # 输出内容可能是随机的,因为是未初始化的内存
    
  5. numpy.eye():创建一个对角线为1,其余位置为0的二维数组(即单位矩阵)。

    import numpy as np
    identity_matrix = np.eye(3)
    print(identity_matrix)
    # 输出:
    # [[1. 0. 0.]
    #  [0. 1. 0.]
    #  [0. 0. 1.]]
    
  6. numpy.arange():返回在给定范围内的等差数组。

    import numpy as np
    arange_arr = np.arange(5)
    print(arange_arr)  # 输出: [0 1 2 3 4]
    
  7. numpy.linspace():在指定的区间内返回均匀间隔的数字。

    import numpy as np
    linspace_arr = np.linspace(0, 10, 5)
    print(linspace_arr)  # 输出: [ 0.   2.5  5.   7.5 10. ]
    
  8. numpy.fromfunction():通过函数来创建数组,函数会对每个索引调用一次,并使用返回的结果填充数组。

    import numpy as np
    def f(x, y):
        return x + y
    
    func_arr = np.fromfunction(f, (3, 3), dtype=int)
    print(func_arr)
    # 输出:
    # [[0 1 2]
    #  [1 2 3]
    #  [2 3 4]]
    
  9. numpy.full():创建一个给定形状和类型的新数组,并用指定的值填充。

    import numpy as np
    full_arr = np.full((2, 3), 7)
    print(full_arr)
    # 输出:
    # [[7 7 7]
    #  [7 7 7]]
    

2、数学运算

1)算术运算

NumPy支持基本的算术运算符,如加、减、乘、除等。这些运算符可以对NumPy数组进行元素级的操作。

  • 加法numpy.add() 或使用运算符 +
import numpy as np
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
c = np.add(a, b)  # 或者 c = a + b
print(c)  # 输出 [5 7 9]
  • 减法numpy.subtract() 或使用运算符 -
c = np.subtract(b, a)  # 或者 c = b - a
print(c)  # 输出 [3 3 3]
  • 乘法numpy.multiply() 或使用运算符 *
c = np.multiply(a, b)  # 或者 c = a * b
print(c)  # 输出 [4 10 18]
  • 除法numpy.divide() 或使用运算符 /
c = np.divide(b, a)  # 或者 c = b / a
print(c)  # 输出 [4.  2.5 2. ]

此外,NumPy还支持取模(numpy.mod()%)、取幂(numpy.power()**)以及取平方根(numpy.sqrt())等算术运算。

2)逻辑运算

NumPy提供了基本的逻辑运算符,用于对数组进行元素级的逻辑比较。这些运算符包括等于(==)、不等于(!=)、大于(>)、小于(<)、大于等于(>=)、小于等于(<=)等。例如:

c = (a > 2)  # 返回一个布尔数组 [False False True]
3)统计运算

NumPy提供了大量的统计运算函数,用于计算数组的统计特性。这些函数包括求和(numpy.sum())、平均值(numpy.mean())、最大值(numpy.max())、最小值(numpy.min())、方差(numpy.var())和标准差(numpy.std())等。例如:

s = np.sum(a)     # 计算数组a的和,输出6
m = np.mean(a)    # 计算数组a的平均值,输出2.0

arr = np.array([1, 2, 3, 4])
std_dev = np.std(arr) # 输出: 1.118033988749895
4)线性代数运算

NumPy还提供了丰富的线性代数运算函数,如矩阵乘积(numpy.dot()@)、转置(numpy.transpose().T)、逆矩阵(numpy.linalg.inv())等。这些函数使得NumPy在处理线性代数问题时非常高效。例如:

  • numpy.dot():计算矩阵乘积
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
C = np.dot(A, B)  # 或者 C = A @ B
print(C)  # 输出 [[19 22] [43 50]]
  • numpy.linalg.det():计算矩阵的行列式

    import numpy as np
    arr = np.array([[1, 2], [3, 4]])
    det_val = np.linalg.det(arr)
    # 输出: -2.0
    

此外,NumPy还支持更多的数学运算和函数,如三角函数、指数函数、对数函数等。这些功能使得NumPy成为Python中进行科学计算和数据分析的强大工具。

3、其他函数

1)数组操作函数
  • numpy.reshape():改变数组的形状而不改变数据。

    import numpy as np
    a = np.arange(6)  # [0, 1, 2, 3, 4, 5]
    b = a.reshape(2, 3)
    print(b)
    # 输出:
    # [[0 1 2]
    #  [3 4 5]]
    
  • numpy.concatenate():连接两个或多个数组。

    import numpy as np
    a = np.array([[1, 2], [3, 4]])
    b = np.array([[5, 6]])
    c = np.concatenate((a, b), axis=0)
    print(c)
    # 输出:
    # [[1 2]
    #  [3 4]
    #  [5 6]]
    
  • numpy.sort():对数组进行排序

    import numpy as np
    arr = np.array([3, 1, 4, 1, 5, 9])
    sorted_arr = np.sort(arr); 
    # 输出: [1 1 3 4 5 9]
    
  • numpy.copy():数组复制

    import numpy as np  
    
    # 创建一个NumPy数组  
    original_array = np.array([1, 2, 3, 4, 5])  
      
    # 使用numpy.copy()复制数组  
    copied_array = np.copy(original_array)  
      
    # 修改原数组  
    original_array[0] = 100  
      
    # 输出原数组和复制后的数组  
    print("Original array:", original_array)  
    print("Copied array:", copied_array)
    # Original array: [100   2   3   4   5]  
    # Copied array: [1 2 3 4 5]
    
2)统计函数
  • numpy.median():计算数组的中位数。

    import numpy as np
    a = np.array([1, 2, 3, 4, 5])
    median = np.median(a)
    print(median)  # 输出: 3.0
    
  • numpy.percentile():计算数组的百分位数。

    import numpy as np
    a = np.array([1, 2, 3, 4, 5])
    p50 = np.percentile(a, 50)  # 计算50%百分位数,即中位数
    print(p50)  # 输出: 3.0
    
3)数组索引和切片函数
  • numpy.where():返回满足条件的元素的索引。

    import numpy as np
    a = np.array([1, 2, 3, 4, 5, 6])
    indices = np.where(a > 3)
    print(indices)  # 输出满足条件的索引,例如: (array([3, 4, 5]),)
    
  • numpy.argmax() 和 numpy.argmin():分别返回数组中最大值和最小值的索引。

    import numpy as np
    a = np.array([1, 2, 3, 0, 4, 5])
    max_index = np.argmax(a)
    min_index = np.argmin(a)
    print(max_index)  # 输出最大值5的索引: 5
    print(min_index)  # 输出最小值0的索引: 3
    
4)随机数生成
  • numpy.random.rand():生成0到1之间的随机数。

    import numpy as np
    random_array = np.random.rand(3, 2)  # 生成一个3x2的数组,元素值在0到1之间
    print(random_array)
    
  • numpy.random.randint():生成指定范围内的随机整数。

    import numpy as np
    random_ints = np.random.randint(0, 10, size=(2, 3))  # 生成一个2x3的数组,元素是0到9之间的随机整数
    print(random_ints)
    

这些函数只是NumPy库功能的一小部分,但它们在数据分析和科学计算中非常常用。NumPy的强大之处在于它能够高效地处理大型多维数组和矩阵,并提供丰富的数学函数来操作这些数据。

三、数组的索引与切片

在NumPy中,数组的索引与切片是非常核心的操作,它们允许我们访问和修改数组中的特定元素或元素子集。

1、索引

在NumPy中,你可以通过索引来访问数组中的单个元素。索引是基于0的,这意味着第一个元素的索引是0,第二个元素的索引是1,依此类推。

例如:

import numpy as np

# 创建一个一维数组
arr = np.array([1, 2, 3, 4, 5])

# 访问数组中的第一个元素
print(arr[0])  # 输出: 1

# 访问数组中的第三个元素
print(arr[2])  # 输出: 3

对于多维数组,你需要使用逗号分隔的索引元组来访问元素。例如:

# 创建一个二维数组
arr_2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

# 访问第一行第二列的元素
print(arr_2d[0, 1])  # 输出: 2

# 访问第二行第三列的元素
print(arr_2d[1, 2])  # 输出: 6

2、切片

切片允许你访问数组的一个子集,而不是单个元素。切片的基本语法是start:stop:step,其中start是切片的起始索引(包含),stop是切片的结束索引(不包含),step是切片的步长。

例如:

# 创建一个一维数组
arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])

# 获取索引1到5(不包含5)之间的元素
print(arr[1:5])  # 输出: [2 3 4 5]

# 获取索引2到数组末尾的所有元素,步长为2
print(arr[2::2])  # 输出: [3 5 7 9]

对于多维数组,你可以使用逗号分隔的切片来访问子集。例如:

# 创建一个二维数组
arr_2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

# 获取第一列的所有元素
print(arr_2d[:, 0])  # 输出: [1 4 7]

# 获取第一行和第二行的前两列
print(arr_2d[:2, :2])  # 输出: [[1 2] [4 5]]

注意,切片操作返回的是原数组的一个视图(如果可能的话),这意味着修改切片中的元素也会修改原数组中的相应元素。如果你想要一个独立的副本而不是视图,可以使用copy()方法。

参考

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐