首页 > 编程语言 >10 行 Python 代码,简洁优雅的搞定 10 种数学运算!

10 行 Python 代码,简洁优雅的搞定 10 种数学运算!

时间:2024-12-04 18:00:41浏览次数:7  
标签:10 搞定 return matrix zip Python vector def

Python这门语言,我深有感触的是,Python 的核心特性能让我们用极少的代码实现非常多的功能,尤其是在数学运算和线性代数领域。这篇文章,我就来聊聊如何用 Python 的一些特性写出简洁优雅的数学代码,同时也会修正一些常见误区,用更严谨的方式来实现这些功能。

先说一句:如今的 Python 生态已经非常强大,像 NumPy 和 SymPy 这样的库早已覆盖了大部分数学需求,但了解 Python 本身的强大之处依然是非常有意义的。

Python 的列表推导式是一个经典的例子,它简化了我们对集合数据的操作。举个例子,如果我们想将一个向量的每个元素乘以一个标量,在其他语言中,可能需要用循环来实现,比如:

def scaled(vector, scalar):
    result = []
    for element in vector:
        result.append(element * scalar)
    return result

在 Python 中,我们可以用列表推导式将这段代码缩短为一行:

def scaled(vector, scalar):
    return [x * scalar for x in vector]

更进一步,如果需要对两个向量进行逐元素相加,可以利用 zip 来迭代两个列表,并结合列表推导式:

def add_vectors(vector1, vector2):
    return [x + y for x, y in zip(vector1, vector2)]

zip 的作用是将多个可迭代对象“拉链式”配对成元组,例如:

>>> list(zip([1, 2, 3], [4, 5, 6]))
[(1, 4), (2, 5), (3, 6)]

在计算向量的点积时,我们可以结合 zipsum 函数,一行实现点积的计算:

def dot_product(vector1, vector2):
    return sum(x * y for x, y in zip(vector1, vector2))

Python 的条件表达式同样是非常强大的工具,可以让我们用非常紧凑的方式实现逻辑判断。例如,创建一个单位矩阵(Identity Matrix):

def identity_matrix(n):
    return [[1 if i == j else 0 for j in range(n)] for i in range(n)]

如果进一步了解 Python 的特性,你会发现布尔值 TrueFalse 可以直接与数字进行运算,True 会被当作 1False 会被当作 0。因此,上面的代码还可以简化为:

def identity_matrix(n):
    return [[int(i == j) for j in range(n)] for i in range(n)]

在矩阵操作中,转置是一个常见需求。如果我们将矩阵存储为嵌套列表,可以利用 zip 和星号解包操作实现转置:

def transpose(matrix):
    return [list(row) for row in zip(*matrix)]

在这里,*matrix 会将矩阵的每一行解包为单独的参数传递给 zip,从而实现列与行的交换。

接着来看矩阵与向量相乘的操作。矩阵存储为嵌套列表时,我们可以将每一行与向量做点积,再组合成一个新向量:

def matrix_vector_multiply(matrix, vector):
    return [dot_product(row, vector) for row in matrix]

如果需要计算两个点之间的欧几里得距离,公式很简单:向量差的自乘积开平方。实现上我们可以这样写:

import math

def euclidean_distance(point1, point2):
    return math.sqrt(sum((x - y) ** 2 for x, y in zip(point1, point2)))

再复杂一点,假如我们要解决线性方程组 Ax = B。尽管使用 NumPy 的 numpy.linalg.solve 是最推荐的方法,但如果需要自己实现一个简单的解算器,我们可以使用迭代方法:

def solve_linear_system(matrix, b, guess, tolerance=1e-5):
    def projection(x, a, b):
        scale = (b - dot_product(a, x)) / dot_product(a, a)
        return [xi + scale * ai for xi, ai in zip(x, a)]
    
    while True:
        errors = [dot_product(row, guess) - bi for row, bi in zip(matrix, b)]
        if max(abs(e) for e in errors) < tolerance:
            break
        guess = projection(guess, matrix[0], b[0])
        matrix = matrix[1:] + [matrix[0]]
        b = b[1:] + [b[0]]
    return guess

上面代码使用了简单的投影法,并且通过“旋转”矩阵和右端向量来循环迭代。尽管这种方法效率不高,但它展示了 Python 的灵活性。

最后,矩阵求逆可以看作是解多个线性方程组的组合。每次将单位矩阵的一列作为目标向量 b,求解相应的方程组:

def invert_matrix(matrix):
    identity = identity_matrix(len(matrix))
    return [solve_linear_system(matrix, col, [0] * len(matrix)) for col in identity]

这些代码展示了 Python 核心特性在数学领域的强大表达能力。从列表推导式到 zip,再到条件表达式和解包操作,每一个功能都让代码更加简洁且可读。

虽然现代库已经让我们不需要手动实现这些功能,但理解 Python 的这些基本特性仍然能够帮助我们写出更优雅的代码。

标签:10,搞定,return,matrix,zip,Python,vector,def
From: https://blog.csdn.net/2401_88796361/article/details/144194142

相关文章

  • 中国开源网络安全软件Top 10 (2024版)
    在信息化快速发展的今天,网络安全问题愈加突出。中国的开源社区在网络安全领域贡献了许多优秀的开源软件,它们在实际应用中表现出色,广受好评。本文将介绍2024年最受欢迎的十款中国开源网络安全软件,并附上GitHub地址,供参考。雷池WAF社区版雷池WAF社区版是一款由长亭科技开发的Web......
  • python批量将文件编码格式转换为 UTF8带标签的格式,解决linux环境下中文编码乱码的问题
    指定一个文件夹,遍历文件夹内的文件和子文件夹内的文件,然后识别文件后缀为cpp的文件,通过chardet取检测文件的编码格式,如果不是UTF-8-SIG,则转换为UTF-8-SIGpython脚本格式如下importosimportsysimportcodecsimportchardetdefconvert(filename,out_enc="UTF-8-SIG"):......
  • Python入门基础语法之一些内置函数及用法
    一些内置函数及用法在python开发中,我们需要利用python语言完成现实生活中的场景,python提供了许多内置的函数和模块给我们使用,主要讲解一些常用的函数。数学类函数abs()求绝对值sum()求和:字符串类型的元素不行divmod():传入两个数值,前一个除以后一个,得到两个值:一个......
  • YOLOv8-ultralytics-8.2.103部分代码阅读笔记-errors.py
    errors.pyultralytics\utils\errors.py目录errors.py1.所需的库和模块2.classHUBModelError(Exception): 1.所需的库和模块#UltralyticsYOLO......
  • hhdb数据库介绍(10-36)
    管理分片方案在线变更提供对业务表的表类型、分片规则、分片字段、分片所属数据节点四个维度进行在线变更的支持。业务表在变更期间不会锁表,业务可对表进行正常的IUD操作。分片方案在线变更记录页面显示已执行完成或正在执行的变更任务记录,正在变更的任务允许通过【取消执......
  • python +excel 根据品类求涨出和亏损的商品的前三和后三
    importpandasaspd#读取原始数据df=pd.read_excel('D:\\work\\2\\配料原始表.xlsx',sheet_name='Sheet1')#按品类分组并处理数据grouped=df.groupby('品类名称')result_dfs=[]forcategory,groupingrouped:#筛选亏损数据并整理格式loss_df=......
  • 代码随想录算法训练营第十六天(LeetCode513.找树左下角的值;LeetCode112.路径总和;LeetCo
    LeetCode513.找树左下角的值题目连接:找树左下角的值题目连接代码递归法/***Definitionforabinarytreenode.*publicclassTreeNode{*intval;*TreeNodeleft;*TreeNoderight;*TreeNode(){}*TreeNode(intval){this.......
  • 【教学类-43-25】20241203 数独3宫格的所有可能-使用模版替换(12套样式,空1格-空8格,每套
    前期做数独惨宫格的所有排列,共有12套样式,空1格-空8格,每套510张,共6120小图)【教学类-43-24】20241127数独3宫格的所有可能(12套样式,空1格-空8格,每套510张,共6120小图)-CSDN博客文章浏览阅读1.7k次,点赞41次,收藏30次。【教学类-43-24】20241127数独3宫格的所有可能(12套样式,空1格-......
  • 任务分解神器:10款优质项目管理工具推荐
    在现代项目管理中,任务分解是确保项目顺利进行的关键步骤。它不仅帮助团队明确目标,还能有效分配资源,提高工作效率。为了帮助项目经理和团队更好地进行任务分解,市场上涌现了许多优秀的项目管理工具。本文将为您推荐10款优质的任务分解工具,帮助您在项目管理中事半功倍。禅道项目管理......
  • Python扩展C/C++ 实现原理分析
    Python扩展C/C++实现原理分析https://blog.csdn.net/HaoBBNuanMM/article/details/112243129?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522ab2ac79057d38453c0328d6726560514%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request......