numpy的使用

发布时间 2023-10-19 16:18:40作者: ssnape

创建NumPy数组

  • 从Python列表创建数组:

    使用np.array()函数可以从Python列表创建NumPy数组。例如:

    arr = np.array([1, 2, 3, 4, 5])
    
  • 使用特殊数组:

    NumPy提供了一些快速创建特殊数组的函数,如全零、全一、单位矩阵等。例如:

    zeros = np.zeros((2, 3))    # 创建一个2x3的全零数组
    ones = np.ones((3, 3))      # 创建一个3x3的全一数组
    identity = np.eye(3)        # 创建一个3x3的单位矩阵
    
  • 生成等间隔数列:

    np.linspace()函数用于生成在指定范围内等间隔的数列。例如:

    linspace_arr = np.linspace(0, 1, 5)  # 生成0到1之间的5个等间隔数
    
  • 随机生成数组:

    np.random模块提供了用于生成随机数组的函数。例如,np.random.rand()生成0到1之间的随机数。

    random_arr = np.random.rand(2, 2)  # 生成2x2的随机数数组
    

数组属性和操作

  • 获取数组形状、维度和元素数量:

    • shape属性返回数组的形状,如 (n, m) 表示n行m列。
    • ndim属性返回数组的维度。
    • size属性返回数组的元素数量。

    例如:

    shape = arr.shape
    dimensions = arr.ndim
    size = arr.size
    
  • 重塑数组形状:

    使用reshape()函数可以改变数组的形状。例如:

    reshaped = arr.reshape(2, 3)  # 将数组变形为2x3的形状
    
  • 访问数组元素:

    通过索引可以访问数组的特定元素。NumPy的索引从0开始。例如:

    element = arr[2]  # 获取索引为2的元素
    

数组运算

  • 数组与标量的运算:

    NumPy允许对整个数组进行标量运算,即将标量应用到数组的每个元素。例如:

    result = arr + 2  # 数组中的每个元素加2
    
  • 数组之间的运算:

    对两个数组执行相同形状的元素级操作。例如:

    result = arr1 + arr2  # 对应元素相加
    
  • 数组内积和矩阵乘法:

    • np.dot()函数用于计算两个数组的内积。
    • np.matmul()函数用于执行矩阵乘法。

    例如:

    dot_product = np.dot(arr1, arr2)  # 内积
    matrix_product = np.matmul(matrix1, matrix2)  # 矩阵乘法
    
  • 常见的数学函数:

    NumPy提供了各种数学函数,如平均值、标准差、最大值和最小值的计算。例如:

    mean = np.mean(arr)
    std_dev = np.std(arr)
    max_val = np.max(arr)
    min_val = np.min(arr)
    

数组索引和切片

  • 切片数组:

    使用切片操作可以选择数组中的一部分。切片操作的语法为 start:stop:step

    sliced_arr = arr[start:stop:step]
    
  • 多维数组索引和切片:

    对于多维数组,可以使用逗号分隔的索引和切片来访问特定维度的元素。例如:

    element = arr[2, 3]  # 获取二维数组中的特定元素
    sub_array = arr[:2, 1:3]  # 切片获取子数组
    
  1. 条件和布尔索引

    可以使用条件表达式创建布尔数组,然后使用这些布尔数组来索引原始数组中满足条件的元素。例如:

    bool_arr = arr > 2  # 创建布尔数组,表示大于2的元素
    filtered_arr = arr[bool_arr]  # 使用布尔数组进行索引,获取满足条件的元素
    

数组的复制和视图

  • 复制数组:

    使用 copy() 方法可以创建原始数组的副本,修改副本不会影响原始数组。例如:

    copy_arr = arr.copy()
    
  • 创建数组的视图:

    使用 view() 方法可以创建一个原始数组的视图,即共享相同的数据存储。修改视图也会影响原始数组。例如:

    view_arr = arr.view()
    

数组排序

使用 np.sort() 函数可以对数组进行排序。默认情况下,它会返回一个新的已排序副本,不会修改原始数组。例如:

sorted_arr = np.sort(arr)

数组的文件操作

NumPy允许将数组保存到磁盘并从磁

盘加载。可以使用 np.save()np.load() 函数执行这些操作。例如:

np.save('filename.npy', arr)  # 保存数组到文件
loaded_arr = np.load('filename.npy')  # 从文件加载数组

广播(Broadcasting)

广播是NumPy的一个重要功能,它允许在不同形状的数组之间进行运算。NumPy会自动调整数组的形状以匹配运算的要求,使得元素级操作能够顺利进行。

广播的规则如下:

  1. 维度较小的数组会在维度上进行"补齐",以与维度较大的数组匹配。 在某个维度上,如果两个数组的尺寸相同或其中一个数组的尺寸为1,那么它们在这个维度上是兼容的。

  2. 如果两个数组在所有维度上都兼容,它们可以一起广播。 这意味着,NumPy会自动扩展较小的数组以匹配较大数组的形状。

  3. 如果两个数组在任何一个维度上都不兼容,则广播操作无法进行,将抛出错误。

以下是广播的示例:

import numpy as np

# 示例 1:标量与数组的广播
arr = np.array([1, 2, 3])
result = arr + 5  # 将5广播到arr的每个元素上
# 结果:array([6, 7, 8])

# 示例 2:数组与数组的广播
arr1 = np.array([[1, 2], [3, 4]])
arr2 = np.array([10, 20])
result = arr1 + arr2  # arr2在第二维度上被广播
# 结果:array([[11, 22],
#          [13, 24]])

# 示例 3:无法广播的情况
arr1 = np.array([[1, 2], [3, 4]])
arr3 = np.array([1, 2, 3])
result = arr1 + arr3  # 无法广播,因为维度不兼容
# 报错:ValueError: operands could not be broadcast together with shapes (2,2) (3,)

# 示例 4:广播的应用 - 归一化
data = np.array([[10, 20, 30], [40, 50, 60], [70, 80, 90]])
mean = data.mean(0)  # 沿着第0维度(列)计算均值
std_dev = data.std(0)  # 沿着第0维度(列)计算标准差
normalized_data = (data - mean) / std_dev  # 广播均值和标准差

上述示例中,广播使我们能够轻松地对不同形状的数组执行元素级操作。在示例3中,由于维度不兼容,所以无法进行广播操作,会引发错误。

广播功能在实际工作中非常有用,可以用于执行许多常见的数据处理任务,如数据归一化、矢量化运算等。使用广播,可以编写更简洁、高效和可读性强的NumPy代码。