下午在功能开发的时候遇上一个小功能点的实现过程中需要对矩阵数据按列求和计算,输出一维的列表数据,有点像是神经网络模型里面的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]
如果大家有更多的方法也欢迎评论区留言哈,我一并汇总进来。