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数据科学生态系统的基石,熟练掌握多维数组操作是进行数据分析、机器学习等高级应用的基础。

相关推荐
橙露13 小时前
时间序列分析实战:用 Python 实现股票价格预测与风险评估
人工智能·python·机器学习
神云瑟瑟13 小时前
看langchain理解python中的链式调用
python·langchain·链式调用
栈与堆13 小时前
LeetCode 21 - 合并两个有序链表
java·数据结构·python·算法·leetcode·链表·rust
CCPC不拿奖不改名14 小时前
循环神经网络RNN:整数索引→稠密向量(嵌入层 / Embedding)详解
人工智能·python·rnn·深度学习·神经网络·自然语言处理·embedding
鹤入云霄14 小时前
基于Python的空气质量监测系统
python
何以不说话14 小时前
mysql 的主从复制
运维·数据库·学习·mysql
wm104314 小时前
大模型学习day01 python基础
学习
Hello_Embed14 小时前
RS485 双串口通信 + LCD 实时显示(DMA+IDLE 空闲中断版)
笔记·单片机·学习·操作系统·嵌入式·freertos
徐子元竟然被占了!!14 小时前
常用端口学习
运维·网络·学习
XH华15 小时前
数据结构第九章:树的学习(上)
数据结构·学习