python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python多层级数组矩阵变换

手把手教你使用Python实现多层级数组矩阵变换

作者:IT小本本

在处理数据分析或算法开发时,我们经常会遇到复杂的数组重组需求,今天,将通过一个具体的案例,解析如何将一个简单的一维数组,按照特定的数学逻辑转换成带分隔符的复杂矩阵,感兴趣的小伙伴可以了解下

在处理数据分析或算法开发时,我们经常会遇到复杂的数组重组需求。今天,将通过一个具体的案例,解析如何将一个简单的一维数组,按照特定的数学逻辑转换成带分隔符的复杂矩阵。

任务目标

根据下面要求:

第一层: 每 3 个数字分为一组。

第二层: 每个大组 {a,b,c}\{a, b, c\}{a,b,c} 变形为 3×23 \times 23×2 的子矩阵。

第三层: 纵向堆叠所有矩阵,并在组间插入全 000 间隔行(末尾除外)

代码实现

使用 Python 基础语法来实现这一逻辑。这段代码清晰地展示了如何通过循环和条件判断来精准控制数据结构。

def transform_array(arr):
    # 1. 第一层分组:从左到右,每 3 个数字为 1 个大组
    groups = [arr[i:i+3] for i in range(0, len(arr), 3)]
    
    final_result = []
    
    for idx, group in enumerate(groups):
        # 提取大组内的三个元素 a, b, c
        a, b, c = group
        
        # 2. 第二层变形:生成 3 行 2 列子矩阵
        # 结构为:[a, a+b], [b, b+c], [c, c+a]
        sub_matrix = [
            [a, a + b],
            [b, b + c],
            [c, c + a]
        ]
        
        # 3. 第三层拼接:将子矩阵纵向堆叠
        final_result.extend(sub_matrix)
        
        # 额外规则:每拼接完一个大组,插入 1 行全 0 分隔行
        # 注意:最后一个大组拼接完成后,末尾不需要加分隔行
        if idx < len(groups) - 1:
            final_result.append([0, 0])
            
    return final_result

# 测试数据
arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
result = transform_array(arr)

# 打印结果
for row in result:
    print(row)

代码深度解析

1. 灵活的分组切片

代码第一步使用了列表推导式配合 range(0, len(arr), 3)。这是 Python 处理分块任务的标准姿势,既简洁又高效。

2. 矩阵构造逻辑

在第二层变形中,我们直接利用 Python 列表的解构赋值 a, b, c = group。这使得后续计算 a+ba+ba+bb+cb+cb+c 的逻辑与 image_87af13.png 中的数学公式完全对应,极大提高了代码的可读性。

3. 智能分隔符插入

最精妙的地方在于 if idx < len(groups) - 1 的判断。通过索引检查,我们确保了全 000 行只出现在大组之间,而不会画蛇添足地出现在整个矩阵的末尾。

运行结果展示

执行上述代码后,你将得到一个规整的矩阵结构,每组计算结果清晰可见,且被 000 完美分隔:

[1, 3]
[2, 5]
[3, 4]
[0, 0]  <-- 组间分隔
[4, 9]
...

这种处理方式不仅适用于本案例,在处理传感器数据流或生成报表结构时也非常实用。

知识扩展

“多层级数组矩阵”通常指多维嵌套列表(如列表的列表,类似矩阵)或更一般的高维数组。在 Python 中,处理这类数据有两种方式:

下面将分别介绍常见变换操作的实现。

1.纯 Python 实现常见矩阵变换

假设我们有一个二维矩阵(列表的列表):

matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]

1. 转置(行列互换)

def transpose(matrix):
    return [[matrix[j][i] for j in range(len(matrix))] for i in range(len(matrix[0]))]

print(transpose(matrix))
# [[1, 4, 7], [2, 5, 8], [3, 6, 9]]

2. 顺时针旋转 90 度

def rotate_90(matrix):
    return [list(row) for row in zip(*matrix[::-1])]   # 先上下翻转,再转置

3. 逆时针旋转 90 度

def rotate_90_counter(matrix):
    return [list(row) for row in zip(*matrix)][::-1]

4. 水平翻转(左右镜像)

def flip_horizontal(matrix):
    return [row[::-1] for row in matrix]

5. 垂直翻转(上下镜像)

def flip_vertical(matrix):
    return matrix[::-1]

6. 展平(将多维数组降为一维)

def flatten(matrix):
    return [item for row in matrix for item in row]

7. 改变形状(例如 3x3 → 1x9)

def reshape(matrix, new_rows, new_cols):
    flat = flatten(matrix)
    if len(flat) != new_rows * new_cols:
        raise ValueError("新形状的元素总数不匹配")
    return [flat[i*new_cols:(i+1)*new_cols] for i in range(new_rows)]

2.NumPy 实现高效矩阵变换(推荐)

NumPy 是 Python 科学计算的基石,其 ndarray 对象天然支持多维数组和丰富的变换方法。

import numpy as np

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

1. 转置

arr.T   # 或 np.transpose(arr)

2. 旋转

np.rot90(arr, k=1)      # 顺时针旋转 90 度 (k=1 顺时针,k=-1 逆时针)

3. 翻转

np.fliplr(arr)   # 水平翻转(左右)
np.flipud(arr)   # 垂直翻转(上下)

4. 展平

arr.flatten()    # 返回新数组
arr.ravel()      # 返回视图(更高效)

5. 改变形状(reshape)

arr_1x9 = arr.reshape(1, 9)   # 或 arr.reshape(1, -1)
arr_3x3 = arr_1x9.reshape(3, 3)

6. 合并多个矩阵

a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])

np.vstack((a, b))   # 垂直堆叠
np.hstack((a, b))   # 水平堆叠

7. 分割矩阵

# 按列分割成 3 个等宽部分
np.hsplit(arr, 3)
# 按行分割成 3 个等高部分
np.vsplit(arr, 3)

多层级(高维)数组变换

对于三维及以上数组(如 [层][行][列]),同样适用上述方法。

# 创建一个 2x3x4 的三维数组
tensor = np.arange(24).reshape(2, 3, 4)

# 转置轴顺序:将原来的轴 (0,1,2) 重排为 (2,1,0)
tensor.transpose(2, 1, 0)

# 交换两个轴
np.swapaxes(tensor, 0, 2)

# 展平到一维
tensor.flatten()

到此这篇关于手把手教你使用Python实现多层级数组矩阵变换的文章就介绍到这了,更多相关Python多层级数组矩阵变换内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文