Python 多维数组学习示例

多维数组是数据科学、机器学习和科学计算中的重要数据结构。在Python中,我们可以使用不同的方法创建和操作多维数组。

1. 使用嵌套列表(原生Python方法)

python 复制代码
# 创建二维数组(矩阵)
matrix_2d = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]

print("二维数组:")
for row in matrix_2d:
    print(row)

# 访问元素
print(f"\nmatrix_2d[1][2] = {matrix_2d[1][2]}")  # 第2行第3列(索引从0开始)

# 创建三维数组
matrix_3d = [
    [
        [1, 2, 3],
        [4, 5, 6]
    ],
    [
        [7, 8, 9],
        [10, 11, 12]
    ]
]

print(f"\n三维数组形状: {len(matrix_3d)}x{len(matrix_3d[0])}x{len(matrix_3d[0][0])}")
print(f"matrix_3d[1][0][2] = {matrix_3d[1][0][2]}")  # 第2个矩阵的第1行第3列

# 遍历三维数组
print("\n遍历三维数组:")
for i, matrix in enumerate(matrix_3d):
    print(f"矩阵 {i}:")
    for row in matrix:
        print(f"  {row}")

2. 使用NumPy库(推荐)

NumPy是Python科学计算的核心库,提供了高效的多维数组操作。

python 复制代码
import numpy as np

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

print("二维数组:")
print(array_2d)
print(f"数组形状: {array_2d.shape}")
print(f"数组维度: {array_2d.ndim}")
print(f"数据类型: {array_2d.dtype}")

# 创建特殊数组
zeros_array = np.zeros((3, 4))  # 3x4的全0数组
ones_array = np.ones((2, 3, 4))  # 2x3x4的全1数组
identity_matrix = np.eye(4)  # 4x4单位矩阵
random_array = np.random.rand(3, 3)  # 3x3随机数组

print(f"\n全0数组:\n{zeros_array}")
print(f"\n全1数组:\n{ones_array}")
print(f"\n单位矩阵:\n{identity_matrix}")
print(f"\n随机数组:\n{random_array}")

# 数组索引和切片
print(f"\n数组索引和切片示例:")
print(f"第一行: {array_2d[0]}")
print(f"第二列: {array_2d[:, 1]}")
print(f"子矩阵 (前2行,后2列):\n{array_2d[:2, 1:]}")

# 数组运算
array_a = np.array([[1, 2], [3, 4]])
array_b = np.array([[5, 6], [7, 8]])

print(f"\n数组运算示例:")
print(f"数组相加:\n{array_a + array_b}")
print(f"数组相乘(逐元素):\n{array_a * array_b}")
print(f"矩阵乘法:\n{np.dot(array_a, array_b)}")
print(f"数组转置:\n{array_a.T}")

# 数组形状操作
print(f"\n数组形状操作:")
reshaped = array_2d.reshape(9, 1)
print(f"重塑为9x1数组:\n{reshaped}")

flattened = array_2d.flatten()
print(f"扁平化为一维数组:\n{flattened}")

# 数组统计
print(f"\n数组统计:")
print(f"总和: {array_2d.sum()}")
print(f"每列总和: {array_2d.sum(axis=0)}")
print(f"每行总和: {array_2d.sum(axis=1)}")
print(f"平均值: {array_2d.mean()}")
print(f"最大值: {array_2d.max()}")
print(f"最小值: {array_2d.min()}")

3. 多维数组的实际应用示例

python 复制代码
# 示例1: 图像处理(灰度图像)
import numpy as np

# 模拟一个5x5的灰度图像(像素值0-255)
image = np.random.randint(0, 256, size=(5, 5))
print("原始图像(5x5像素):")
print(image)

# 应用简单的滤波器(平均值模糊)
def apply_blur(image, kernel_size=3):
    height, width = image.shape
    blurred = np.zeros_like(image, dtype=np.float32)
    
    for i in range(height):
        for j in range(width):
            # 获取邻域像素
            start_i = max(0, i - kernel_size // 2)
            end_i = min(height, i + kernel_size // 2 + 1)
            start_j = max(0, j - kernel_size // 2)
            end_j = min(width, j + kernel_size // 2 + 1)
            
            # 计算邻域平均值
            neighborhood = image[start_i:end_i, start_j:end_j]
            blurred[i, j] = np.mean(neighborhood)
    
    return blurred.astype(np.uint8)

blurred_image = apply_blur(image)
print("\n模糊后的图像:")
print(blurred_image)

# 示例2: 学生成绩表
print("\n" + "="*50)
print("学生成绩表示例")

# 创建一个4名学生 x 3门课程的成绩表
students = ["小明", "小红", "小刚", "小丽"]
courses = ["数学", "语文", "英语"]

scores = np.array([
    [85, 90, 88],
    [92, 87, 93],
    [78, 85, 80],
    [95, 91, 89]
])

print(f"成绩表 ({len(students)}名学生 × {len(courses)}门课程):")
print(f"课程: {courses}")
for i, student in enumerate(students):
    print(f"{student}: {scores[i]}")

# 计算统计信息
print(f"\n每门课程的平均分: {scores.mean(axis=0)}")
print(f"每个学生的平均分: {scores.mean(axis=1)}")
print(f"最高总分: {scores.sum(axis=1).max()}")
print(f"最低总分: {scores.sum(axis=1).min()}")

# 示例3: 三维数据(RGB图像)
print("\n" + "="*50)
print("RGB图像示例")

# 创建一个3x3的RGB图像(高度×宽度×颜色通道)
rgb_image = np.array([
    [[255, 0, 0], [0, 255, 0], [0, 0, 255]],
    [[255, 255, 0], [255, 0, 255], [0, 255, 255]],
    [[128, 128, 128], [255, 255, 255], [0, 0, 0]]
])

print(f"RGB图像形状: {rgb_image.shape}")  # (3, 3, 3)
print(f"像素(0,0)的RGB值: {rgb_image[0, 0]}")
print(f"红色通道:\n{rgb_image[:, :, 0]}")

# 转换为灰度图像(使用加权平均)
weights = np.array([0.2989, 0.5870, 0.1140])
gray_image = np.dot(rgb_image, weights)
print(f"\n灰度图像:\n{gray_image.astype(np.uint8)}")

4. 性能比较:列表 vs NumPy数组

python 复制代码
import numpy as np
import time

# 创建大型数组
size = 1000

# 使用列表
start_time = time.time()
list_2d = [[i * size + j for j in range(size)] for i in range(size)]
list_sum = 0
for i in range(size):
    for j in range(size):
        list_sum += list_2d[i][j]
list_time = time.time() - start_time

# 使用NumPy数组
start_time = time.time()
np_array = np.arange(size * size).reshape(size, size)
np_sum = np_array.sum()
np_time = time.time() - start_time

print(f"列表方法:")
print(f"  总和: {list_sum}")
print(f"  时间: {list_time:.4f}秒")

print(f"\nNumPy方法:")
print(f"  总和: {np_sum}")
print(f"  时间: {np_time:.4f}秒")
print(f"\nNumPy比列表快 {list_time/np_time:.1f} 倍")

总结

  1. 原生列表:适合小型、不规则的多维数据
  2. NumPy数组:适合大型数值计算,提供高效的向量化操作
  3. 关键概念
    • 形状(shape):数组各维度的长度
    • 维度(ndim):数组的维度数量
    • 数据类型(dtype):数组中元素的数据类型
    • 轴(axis):数组操作的方向(0=行,1=列等)

练习建议

  1. 创建一个4×5的随机数组,计算每行的最大值和每列的最小值
  2. 实现矩阵乘法函数(不使用NumPy的dot函数)
  3. 创建一个三维数组表示一个3×3×3的魔方,并计算每个面的和
  4. 使用NumPy数组实现简单的卷积操作

NumPy是Python数据科学生态系统的基石,熟练掌握多维数组操作是进行数据分析、机器学习等高级应用的基础。

相关推荐
曲幽2 小时前
Flask项目一键打包实战:用PyInstaller生成独立可执行文件
python·flask·web·pyinstaller·exe·add-data
名誉寒冰2 小时前
AI大模型-Prompt工程参考学习
人工智能·学习·大模型·prompt
easyboot2 小时前
python获取C#WEBAPI的数据
开发语言·python·c#
梨落秋霜2 小时前
Python入门篇【字符串】
开发语言·python
咖啡の猫2 小时前
Python集合生成式
前端·javascript·python
我的xiaodoujiao2 小时前
使用 Python 语言 从 0 到 1 搭建完整 Web UI自动化测试学习系列 36--二次封装MySQL数据库连接操作
python·学习·测试工具·pytest
典孝赢麻崩乐急2 小时前
Redis复习----------Redis超高性能的原因
数据库·redis·学习·缓存
Pyeako2 小时前
深度学习--CUDA安装配置、pytorch库、torchvision库、torchaudio库安装
人工智能·pytorch·python·深度学习·gpu·cuda
liu****2 小时前
Python简单爬虫实践案例
开发语言·爬虫·python