基于Python实现矩阵数据的按列求和计算

下午在功能开发的时候遇上一个小功能点的实现过程中需要对矩阵数据按列求和计算,输出一维的列表数据,有点像是神经网络模型里面的Flatten一样,这里实现是很简单的,在实现的时候我突然涌现出来了一个有趣的想法,除了我自己的实现方式以外还有哪些实现方式呢?那种方式最简洁呢?

抱着这样的想法,我构想了一下然后一共想到了4种实现方式,这里一并给出来,如下:

#!usr/bin/env python
# encoding:utf-8
from __future__ import division




"""
功能:  矩阵按列求和
"""




import numpy as np




def generate_random_matrix(rows, cols, min_value, max_value, seed=None):
    """
    生成一个指定大小、最小值和最大值的随机矩阵。

    :param rows: 矩阵的行数
    :param cols: 矩阵的列数
    :param min_value: 随机数生成的最小值
    :param max_value: 随机数生成的最大值
    :param seed: 随机数生成的种子,如果提供,则每次生成相同的矩阵
    :return: 一个包含随机数的矩阵
    """
    if seed is not None:
        np.random.seed(seed)  # 设置随机数种子
    return np.random.randint(min_value, max_value + 1, size=(rows, cols))



def func1(matrix):
    """
    使用循环和列表解析
    """
    res_list = [sum(col) for col in zip(*matrix)]
    return res_list



def func2(matrix):
    """
    使用numpy库
    """
    res_list = np.sum(matrix, axis=0)
    return res_list.tolist()



def func3(matrix):
    """
    使用zip函数和列表解析
    """
    tmp_list = [matrix[i] for i in range(len(matrix))]
    res_list = [sum(col) for col in zip(*tmp_list)]
    return res_list



def func4(matrix):
    """
    column_stack
    """
    res_list = np.column_stack(matrix).sum(axis=1)
    return res_list.tolist()



if __name__ == "__main__":

  
    matrix = generate_random_matrix(5, 5, 1, 10, seed=1)
    print(matrix)

    print("================================func1================================")
    print(func1(matrix))

    print("================================func2================================")
    print(func2(matrix))

    print("================================func3================================")
    print(func3(matrix))

    print("================================func4================================")
    print(func4(matrix))

测试效果如下:

[[ 6  9 10  6  1]
 [ 1  2  8  7 10]
 [ 3  5  6  3  5]
 [ 3  5  8  8 10]
 [ 2  8  1  7 10]]
================================func1================================
[15, 29, 33, 31, 36]
================================func2================================
[15, 29, 33, 31, 36]
================================func3================================
[15, 29, 33, 31, 36]
================================func4================================
[15, 29, 33, 31, 36]
[Finished in 0.9s]

如果大家有更多的方法也欢迎评论区留言哈,我一并汇总进来。

上一篇:2024-03-20 作业


下一篇:项目中如何获取Java运行环境中的文件内容