引言

  NumPy是Python科学计算的核心库。因为机器学习模型处理的数据本质上是数值型的,所以我们需要可以进行高效的数据表示与计算的工具。NumPy 的数组在内存中连续存储,并且其底层运算由 C 语言实现,使得其数值计算速度极快。NumPy 提供了简洁一致的语法为机器学习算法处理海量数据提供了必需的性能和基础结构。

一、创建NumPy数组:AI数据的"容器"

  1、从Python列表创建

    NumPy的核心是array对象。让我们来创建它们:首先,通过np.array将普通列表转换为一维数组。接着,将一个嵌套列表转换为二维数组,形状(2,3)清晰地表明这是一个2行3列的矩阵。最后,更复杂的嵌套列表被转换为三维数组,形状(2,2,2)表示它由2个2x2的矩阵组成。

import numpy as np
# 从列表创建一维数组
list1 = [1, 2, 3, 4, 5]
arr1 = np.array(list1)
print(f"一维数组:{arr1}")
print(f"数组形状:{arr1.shape}")
print(f"数组维度:{arr1.ndim}")
# 从嵌套列表创建二维数组
list2 = [[1, 2, 3], 
         [4, 5, 6]]
arr2 = np.array(list2)
print(f"\n二维数组:\n{arr2}")
print(f"数组形状:{arr2.shape}")  
print(f"数组维度:{arr2.ndim}")   
# 从嵌套列表创建三维数组
list3 = [[[1, 2], [3, 4]], 
         [[5, 6], [7, 8]]]
arr3 = np.array(list3)
print(f"\n三维数组:\n{arr3}")
print(f"数组形状:{arr3.shape}")  
print(f"数组维度:{arr3.ndim}") 

2、直接创建数值数组

  NumPy提供了快速创建具有特定初始值数组的函数。np.zeros(shape) 创建指定形状的全零数组,常用于初始化存储空间;np.ones(shape) 创建全为1的数组,适合构建掩码或基准矩阵;np.full(shape, value) 则创建所有元素均为指定值的数组。

import numpy as np 
# 创建全为0的数组
zeros_1d = np.zeros(5)
zeros_2d = np.zeros((3, 4))
print(f"一维零数组:{zeros_1d}")
print(f"二维零数组:\n{zeros_2d}")
# 创建全为1的数组
ones_2d = np.ones((2, 3))
print(f"\n二维1数组:\n{ones_2d}")
# 创建指定值的数组
full_arr = np.full((2, 2), 7)
print(f"\n全为7的数组:\n{full_arr}")

二、数组的升维:让数据"立体"起来

1、reshape()方法:最常用的升维方法

  NumPy中用于改变数组形状的核心方法是reshape(),它可以在不改变数组数据的前提下重新排列维度结构。该方法通过接收目标形状参数来重塑数组,要求新形状的元素总数必须与原数组一致。

import numpy as np
# 创建一个一维数组
arr = np.arange(16)
print(f"原始一维数组:{arr}")
print(f"原始形状:{arr.shape}")
# 变成4x4的二维数组(矩阵)
matrix_4x4 = arr.reshape(4, 4)
print(f"\n4x4矩阵:\n{matrix_4x4}")
print(f"新形状:{matrix_4x4.shape}")
# 变成三维数组:2x2x4
cube = arr.reshape(2, 2, 4)
print(f"\n三维数组(2x2x4):\n{cube}")
print(f"新形状:{cube.shape}")

2、resize()方法:直接修改原数组

  resize() 方法与 reshape() 的区别在于其直接修改原数组的能力。resize() 会改变原始数组的形状和大小,如果新形状的元素数量与原数组不同,它会自动截断多余元素或用0填充缺失部分来适应新尺寸。需要注意的是,数组的 resize() 方法是原地操作,会永久改变原数组;而 reshape() 返回一个新视图且不改变原数组。

import numpy as np
# resize会直接修改原始数组
arr = np.array([1, 2, 3, 4, 5, 6, 7, 8])
print(f"修改前:{arr}")
arr.resize(2, 4)  
print(f"修改后:\n{arr}")
# 注意:resize会改变原始数组,reshape返回新数组但不改变原数组

三、数组的降维:简化复杂数据

1、flatten()和ravel()方法

  flatten()和ravel()都是用于将多维数组展平为一维数组的常用方法,但它们在内存处理和安全性上有重要区别。flatten()会创建原数组的一个完整副本,对返回的新数组进行修改不会影响原始数据,这种方法安全但消耗更多内存。ravel() 返回的是原数组的视图,对返回数组的修改会直接反映到原始数组上,这种方式内存效率高但安全性低。此外,还可以通过直接修改数组的 shape 属性来改变数组形状,这同样会直接影响原始数据。

import numpy as np
# 创建一个三维数组
arr_3d = np.arange(8).reshape(2, 2, 2)
print(f"原始三维数组:\n{arr_3d}")
print(f"形状:{arr_3d.shape}")
# 方法1:flatten()
flat_arr = arr_3d.flatten()
print(f"\nflatten()结果:{flat_arr}")
# 修改flatten的结果不会影响原数组
flat_arr[0] = 100
print(f"修改后flatten数组:{flat_arr}")
print(f"原数组不变:\n{arr_3d}")
# 方法2:ravel()
ravel_arr = arr_3d.ravel()
ravel_arr[0] = 200  # 这会修改原数组!
print(f"\nravel()后修改,原数组也变了:\n{arr_3d}")
# 方法3:直接修改shape属性
arr_3d.shape = (8,)  # 直接变为一维
print(f"\n直接修改shape后:{arr_3d}")

四、创建特殊的数组:AI中的"模板"

1、等差数列数组

  np.arange()是NumPy中用于生成均匀间隔数值序列的函数,直接返回一个NumPy数组。它有起始值(包含)、结束值(不包含)和步长作为参数。

import numpy as np
# 参数:起始值, 结束值, 步长
arr1 = np.arange(0, 10, 2)
print(f"arange(0,10,2):{arr1}")
# 生成0-9的数组
arr2 = np.arange(10)
print(f"arange(10):{arr2}")

2、等间距数组

  np.linspace()用于在指定区间内生成指定数量的等间隔数值数组,包含起始值和结束值。它有起始值、结束值和元素数量三个参数。

import numpy as np
arr = np.linspace(0, 1, 5)  # 在0-1之间生成5个等间距数
print(f"linspace(0,1,5):{arr}")

3、单位矩阵和对角矩阵

  NumPy提供了创建特殊矩阵的函数:np.eye(n) 生成 n×n 的单位矩阵(主对角线为1,其余为0);np.diag([a,b,c,...]) 生成以指定序列为主对角线的方阵,其余位置为0;np.full((m,n), value) 创建所有元素均为指定值的矩阵。

import numpy as np
# 单位矩阵:对角线为1,其余为0
identity = np.eye(3) 
print(f"3x3单位矩阵:\n{identity}")
# 对角线矩阵:指定对角线值
diagonal = np.diag([1, 2, 3, 4])
print(f"\n对角线矩阵:\n{diagonal}")
# 全为指定值的矩阵
all_sevens = np.full((3, 3), 7)
print(f"\n全为7的3x3矩阵:\n{all_sevens}")

五、NumPy中常用的两个函数:arange和linspace

  np.arange和np.linspace是NumPy中用于生成数值序列的两个核心函数np.arange(start, stop, step)基于固定步长生成等差数列。它类似于Python的range()但直接生成数组。np.linspace(start, stop, num)基于固定数量在闭区间内生成等间距数值,默认包含终止值。它确保的是区间被均匀分割。

import numpy as np
# arange:生成等差数列(指定步长)
arr_arange = np.arange(0, 10, 2)
print(f"   np.arange(0, 10, 2) = {arr_arange}")
print("类似Python的range,左闭右开区间")
# linspace:生成等间距数列(指定数量)
arr_linspace = np.linspace(0, 10, 5)  # 从0开始,到10结束(包含10),生成5个数
print(f"   np.linspace(0, 10, 5) = {arr_linspace}")
print("闭区间,等间距")

六、数组元素的选取与修改:数据的"精确操作"

  NumPy数组的索引和修改是数据处理的核心操作,语法与列表类似但功能更强。选取元素支持基本索引、切片、不连续索引,修改元素可对单点、切片的元素直接赋值

1、一维数组

import numpy as np
# 创建一维数组
arr = np.arange(1, 11)  # 1-10
print(f"原始数组:{arr}")
# 选取单个元素
print(f"第3个元素(索引2):{arr[2]}")
print(f"最后一个元素:{arr[-1]}")
# 选取多个元素(切片)
print(f"\n前5个元素:{arr[:5]}")
print(f"第3到第7个:{arr[2:7]}")
# 选取不连续的元素
indices = [1, 3, 5, 7]
print(f"\n选取索引为{indices}的元素:{arr[indices]}")
# 修改单个元素
arr[0] = 100
print(f"修改第一个元素后:{arr}")
# 批量修改
arr[1:4] = [200, 300, 400]
print(f"批量修改后:{arr}")
# 条件修改
arr[arr > 200] = 999
print(f"条件修改后:{arr}")

 2、二维数组

import numpy as np
# 创建4x6的二维数组
arr = np.arange(24).reshape(4, 6)
print(f"4x6数组:\n{arr}")
print(f"形状:{arr.shape}")
# 选取单个元素:[行索引, 列索引]
print(f"第2行第3列:{arr[1, 2]}")
# 选取整行
print(f"\n第3行:{arr[2, :]}")
print(f"最后一行:{arr[-1, :]}")
# 选取整列
print(f"\n第4列:{arr[:, 3]}")
print(f"最后一列:{arr[:, -1]}")
# 选取子矩阵
print(f"\n前2行,前3列:\n{arr[:2, :3]}")
print(f"\n第1行和第3行,第2列到第5列:\n{arr[[0, 2], 1:5]}")
# 复杂选取
print(f"\n所有大于15的元素:{arr[arr > 15]}")
# 修改单个元素
arr[0, 0] = 999
print(f"修改(0,0)后:\n{arr}")
# 修改整行
arr[1, :] = 100
print(f"\n修改第2行后:\n{arr}")
# 修改整列
arr[:, 2] = 200  # 第3列全改为200
print(f"\n修改第3列后:\n{arr}")
# 条件修改
arr[arr > 150] = 0  # 所有大于150的元素改为0
print(f"\n条件修改后:\n{arr}")

3、三维数组

import numpy as np
# 创建2x3x4的三维数组(2层,每层3行4列)
arr = np.arange(24).reshape(2, 3, 4)
print(f"三维数组(2x3x4):\n{arr}")
print(f"形状:{arr.shape}")
# 选取单个元素:[层索引, 行索引, 列索引]
print(f"第2层第1行第3列:{arr[1, 0, 2]}")  # 输出:14
# 选取整层(二维数组)
print(f"\n第1层:\n{arr[0, :, :]}")
print(f"\n第2层:\n{arr[1, :, :]}")
# 选取所有层的某一行
print(f"\n所有层的第2行:\n{arr[:, 1, :]}")
# 选取所有层的某一列
print(f"\n所有层的第3列:\n{arr[:, :, 2]}")
# 选取子立方体
print(f"\n第1层的前2行,前3列:\n{arr[0, :2, :3]}")
print(f"\n所有层的最后2行,最后2列:\n{arr[:, -2:, -2:]}")
# 修改单个元素
arr[0, 0, 0] = 999
print(f"修改(0,0,0)后:\n{arr}")
# 修改整层
arr[1, :, :] = 100  # 第2层全改为100
print(f"\n修改第2层后:\n{arr}")
# 修改所有层的某一行
arr[:, 0, :] = 200  # 所有层的第1行改为200
print(f"\n修改所有层第1行后:\n{arr}")
# 条件修改
arr[arr > 150] = 0  # 所有大于150的元素改为0
print(f"\n条件修改后:\n{arr}")

  到这里我们就对Numpy库中的数组元素有了基本的认识,博主将与大家在后面的篇章中更深的去学习数组的相关知识。

更多推荐