MK
摩柯社区 - 一个极简的技术知识社区
AI 面试

Python NumPy库的基础使用教程

2023-09-142.4k 阅读

NumPy 简介

NumPy(Numerical Python)是 Python 中最重要的数学计算库之一,它为 Python 提供了高性能的多维数组对象,以及用于处理这些数组的工具。NumPy 的设计初衷是为了高效地处理数值数据,其底层实现使用了 C 语言,这使得 NumPy 在处理大规模数据时,速度远远超过 Python 原生的列表(list)。

NumPy 的安装

在开始使用 NumPy 之前,需要先安装它。如果你使用的是 Anaconda 发行版,NumPy 已经默认安装好了。如果没有安装,可以使用 pip 进行安装:

pip install numpy

NumPy 数组(ndarray)

创建 NumPy 数组

NumPy 中的核心数据结构是 ndarray(N - dimensional array),即多维数组。可以通过多种方式创建 ndarray

  1. 从 Python 列表创建
    import numpy as np
    # 一维数组
    arr1d = np.array([1, 2, 3])
    print(arr1d)
    # 二维数组
    arr2d = np.array([[1, 2, 3], [4, 5, 6]])
    print(arr2d)
    
  2. 使用特定函数创建
    • np.zeros():创建一个全零的数组。
    zeros_arr = np.zeros((3, 4))
    print(zeros_arr)
    
    • np.ones():创建一个全一的数组。
    ones_arr = np.ones((2, 3))
    print(ones_arr)
    
    • np.empty():创建一个内容未初始化的数组。这个函数执行速度非常快,因为它不会对数组元素进行初始化,其内容是数组在内存中的原始值。
    empty_arr = np.empty((2, 2))
    print(empty_arr)
    
    • np.arange():类似于 Python 的 range() 函数,但返回的是一个 NumPy 数组。
    arange_arr = np.arange(1, 10, 2)
    print(arange_arr)
    
    • np.linspace():在指定的区间内生成等间距的数组。
    linspace_arr = np.linspace(0, 1, 5)
    print(linspace_arr)
    

NumPy 数组的属性

  1. ndim:获取数组的维度数量。
    arr = np.array([[1, 2, 3], [4, 5, 6]])
    print(arr.ndim)
    
  2. shape:获取数组每个维度的大小,返回一个元组。
    print(arr.shape)
    
  3. size:获取数组中元素的总数。
    print(arr.size)
    
  4. dtype:获取数组中元素的数据类型。
    print(arr.dtype)
    
    可以在创建数组时指定数据类型,例如:
    arr = np.array([1, 2, 3], dtype=np.float64)
    print(arr.dtype)
    

NumPy 数组的索引和切片

一维数组的索引和切片

一维数组的索引和切片与 Python 列表类似。

arr = np.arange(10)
# 索引
print(arr[3])
# 切片
print(arr[2:5])
print(arr[::2])

二维数组的索引和切片

对于二维数组,需要指定两个索引,一个用于行,一个用于列。

arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 索引
print(arr[1, 2])
# 切片
print(arr[1:, 1:])

可以通过省略号(...)来简化索引。例如,如果有一个三维数组 arr3darr3d[1, ...] 等价于 arr3d[1, :, :]

NumPy 数组的运算

算术运算

NumPy 数组支持各种算术运算,这些运算都是元素级别的。

arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
# 加法
print(arr1 + arr2)
# 减法
print(arr1 - arr2)
# 乘法
print(arr1 * arr2)
# 除法
print(arr1 / arr2)

同样的运算也适用于二维及更高维度的数组,只要数组的形状相同。

矩阵运算

NumPy 提供了矩阵乘法的功能,使用 dot() 方法或 @ 运算符。

arr1 = np.array([[1, 2], [3, 4]])
arr2 = np.array([[5, 6], [7, 8]])
# 矩阵乘法
print(np.dot(arr1, arr2))
print(arr1 @ arr2)

通用函数(ufunc)

NumPy 中的通用函数(ufunc)是一种对数组中每个元素进行操作的函数。常见的 ufunc 包括三角函数、指数函数、对数函数等。

  1. 三角函数
    arr = np.array([0, np.pi/2, np.pi])
    print(np.sin(arr))
    
  2. 指数函数
    arr = np.array([1, 2, 3])
    print(np.exp(arr))
    
  3. 对数函数
    arr = np.array([1, 10, 100])
    print(np.log(arr))
    

NumPy 数组的形状操作

改变数组的形状

  1. reshape():可以在不改变数组数据的情况下,改变数组的形状。
    arr = np.arange(12)
    new_arr = arr.reshape((3, 4))
    print(new_arr)
    
    如果指定的形状与数组元素总数不匹配,会抛出 ValueError
  2. flatten():将多维数组展平为一维数组。
    arr = np.array([[1, 2, 3], [4, 5, 6]])
    flat_arr = arr.flatten()
    print(flat_arr)
    

数组的拼接

  1. np.concatenate():可以沿着指定的轴拼接多个数组。
    arr1 = np.array([[1, 2], [3, 4]])
    arr2 = np.array([[5, 6], [7, 8]])
    # 按行拼接
    row_concat = np.concatenate((arr1, arr2), axis = 0)
    print(row_concat)
    # 按列拼接
    col_concat = np.concatenate((arr1, arr2), axis = 1)
    print(col_concat)
    
  2. np.vstack()np.hstack():分别用于垂直(按行)和水平(按列)拼接数组。
    arr1 = np.array([1, 2])
    arr2 = np.array([3, 4])
    v_stack = np.vstack((arr1, arr2))
    h_stack = np.hstack((arr1, arr2))
    print(v_stack)
    print(h_stack)
    

数组的分割

  1. np.split():可以沿着指定的轴将数组分割成多个子数组。
    arr = np.arange(9)
    sub_arrays = np.split(arr, 3)
    for sub_arr in sub_arrays:
        print(sub_arr)
    
    对于二维数组,可以指定按行或按列分割。
    arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
    row_sub_arrays = np.split(arr, 3, axis = 0)
    col_sub_arrays = np.split(arr, 3, axis = 1)
    for sub_arr in row_sub_arrays:
        print(sub_arr)
    for sub_arr in col_sub_arrays:
        print(sub_arr)
    

NumPy 数组的广播(Broadcasting)

广播是 NumPy 中一种强大的机制,它允许在形状不同的数组之间进行算术运算。当两个数组的形状不完全相同时,NumPy 会自动尝试按照一定的规则扩展数组的形状,使得运算能够进行。

  1. 规则
    • 从数组的最后一个维度开始比较。
    • 如果两个数组在某一维度上的大小相同,或者其中一个数组在该维度上的大小为 1,则认为它们在该维度上是兼容的。
    • 如果两个数组在所有维度上都兼容,则可以进行广播。
  2. 示例
    arr1 = np.array([[1, 2, 3], [4, 5, 6]])
    arr2 = np.array([10, 20, 30])
    result = arr1 + arr2
    print(result)
    
    在这个例子中,arr2 被广播为与 arr1 形状相同的数组,然后进行元素级别的加法运算。

NumPy 中的数学统计函数

求和、求均值、求标准差等

  1. np.sum():计算数组中所有元素的和,也可以指定轴进行求和。
    arr = np.array([[1, 2, 3], [4, 5, 6]])
    total_sum = np.sum(arr)
    row_sum = np.sum(arr, axis = 1)
    col_sum = np.sum(arr, axis = 0)
    print(total_sum)
    print(row_sum)
    print(col_sum)
    
  2. np.mean():计算数组的均值。
    arr = np.array([1, 2, 3, 4, 5])
    mean_value = np.mean(arr)
    print(mean_value)
    
  3. np.std():计算数组的标准差。
    arr = np.array([1, 2, 3, 4, 5])
    std_value = np.std(arr)
    print(std_value)
    

最值相关函数

  1. np.max()np.min():分别计算数组中的最大值和最小值,也可以指定轴。
    arr = np.array([[1, 2, 3], [4, 5, 6]])
    max_value = np.max(arr)
    row_max = np.max(arr, axis = 1)
    col_max = np.max(arr, axis = 0)
    print(max_value)
    print(row_max)
    print(col_max)
    
  2. np.argmax()np.argmin():返回数组中最大值和最小值的索引,同样可以指定轴。
    arr = np.array([10, 20, 15])
    max_index = np.argmax(arr)
    min_index = np.argmin(arr)
    print(max_index)
    print(min_index)
    

NumPy 与文件操作

保存和加载 NumPy 数组

  1. np.save():将 NumPy 数组保存为 .npy 文件。
    arr = np.array([1, 2, 3, 4, 5])
    np.save('my_array.npy', arr)
    
  2. np.load():从 .npy 文件中加载 NumPy 数组。
    loaded_arr = np.load('my_array.npy')
    print(loaded_arr)
    
  3. np.savetxt()np.loadtxt():用于保存和加载文本文件。np.savetxt() 可以将数组保存为文本格式,np.loadtxt() 可以从文本文件中加载数据并转换为 NumPy 数组。
    arr = np.array([[1, 2, 3], [4, 5, 6]])
    np.savetxt('my_text_array.txt', arr, delimiter = ',')
    loaded_text_arr = np.loadtxt('my_text_array.txt', delimiter = ',')
    print(loaded_text_arr)
    

通过以上对 NumPy 库的基础使用教程,你应该对 NumPy 的核心功能有了较为深入的理解。在实际的数据分析、科学计算以及机器学习等领域,NumPy 都是不可或缺的工具,熟练掌握它将大大提高你的编程效率和数据处理能力。