在 Sympy 中部分分解表达式

2023-12-02

Suppose I have an expression of the form First Form. I know that I can simplify the expression like so: Second Form. However, sympy.simplify and sympy.factor both return the original expression.

为了解决这个问题,我一直在低级别上操作表达式:

factor_map = defaultdict(set)
additive_terms = expr.as_coeff_add()[-1]
for term1, term2 in combinations(additive_terms, 2):
    common_terms = (
        set(term1.as_coeff_mul()[-1])
        & set(term2.as_coeff_mul()[-1])
    )
    if common_terms:
        common_factor = sympy.Mul(*common_terms)
        factor_map[common_factor] |= {term1, term2}

factor_map现在看起来像这样:

{
    a: {a⋅x, -a⋅y}, 
    b: {b⋅x, -b⋅y}, 
    c: {-c⋅x, c⋅y}, 
    x: {a⋅x, b⋅x, -c⋅x}, 
    y: {-a⋅y, -b⋅y, c⋅y}
}

我按照术语所代表的操作数量对其进行排序:

factor_list = sorted(
    factor_map.items(),
    key = lambda i: (i[0].count_ops() + 1) * len(i[1])
)[::-1]

然后我重建表达式:

used = set()
new_expr = 0
for item in factor_list:
    factor = item[0]
    appearances = item[-1]
    terms = 0
    for instance in appearances:
        if instance not in used:
            terms += instance.as_coefficient(factor)
            used.add(instance)
    new_expr += factor * terms
for term in set(additive_terms) - used:
    new_expr += term

这给出了new_expr = d + x*(a + b - c) + y*(-a - b + c)。不是很好,但更好。

我还可以通过将加法项的每个组合彼此相除,检查结果是否为数字,并使用该信息进一步将输出减少到new_expr = d + (x - y)*(a + b - c).

我也尝试过申请sympy.factor到每一种可能的加法项组合,但显然对于任何相当大的表达式来说,它都会很快爆炸。


编辑:这是一个使用的实现sympy.factor在加性项集合的所有分区上(分区函数借用自这个答案):

def partition(collection):
    if len(collection) == 1:
        yield [ collection ]
        return

    first = collection[0]
    for smaller in partition(collection[1:]):
        # insert `first` in each of the subpartition's subsets
        for n, subset in enumerate(smaller):
            yield smaller[:n] + [[ first ] + subset]  + smaller[n+1:]
        # put `first` in its own subset 
        yield [ [ first ] ] + smaller


def partial_factor(expr):
    args = list(expr.as_coeff_add()[-1])
    # Groupings is just a cache to avoid duplicating factor operations
    groupings = {}

    unique = set()

    for p in partition(args):
        new_expr = 0
        for group in p:
            add_group = sympy.Add(*group)
            new_expr += groupings.setdefault(add_group, sympy.factor(add_group))
        unique.add(new_expr)
    return sorted(unique, key=sympy.count_ops)[0]

对于像这样的表达式a*x + b*y + c*z + d + e*x + f*y + h*z,在我的计算机上运行需要 7.8 秒,而另一种方法需要 378 微秒并给出相同的结果。看来应该有一种方法比第一种方法更严格,而且不用花两万倍的时间来解决。


我觉得得到我想要的东西不应该那么难。有没有更简单的方法来做到这一点?


这个类似的问题有一个答案涉及func参数为collect()。尽管您必须明确提及,但它似乎也适用于这种特殊情况d:

from sympy import *
a, b, c, d, x, y = symbols('a, b, c, d, x, y')
expr = a * x + b * x - c * x - a * y - b * y + c * y + d
collect(expr, d, func=factor)
=> d + (x - y)*(a + b - c)

这在这种特定情况下有所帮助,但是不存在更通用和自动的解决方案。

我也找不到这方面的任何文档func任何地方的参数,除了现有的参数。

Github问题跟踪这个问题

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Sympy 中部分分解表达式 的相关文章

  • 如何查看Databricks中的所有数据库和表

    我想列出 Azure Databricks 中每个数据库中的所有表 所以我希望输出看起来像这样 Database Table name Database1 Table 1 Database1 Table 2 Database1 Table
  • 无法“安装”plpython3u - postgresql

    我正在尝试在 postgresql 中使用 python 语言 像这样的事情 create or replace function test a integer returns integer as if a 2 0 return even
  • Python 中的 Lanczos 插值与 2D 图像

    我尝试重新缩放 2D 图像 灰度 图像大小为 256x256 所需输出为 224x224 像素值范围从 0 到 1300 我尝试了两种使用 Lanczos 插值来重新调整它们的方法 首先使用PIL图像 import numpy as np
  • Python - StatsModels、OLS 置信区间

    在 Statsmodels 中 我可以使用以下方法拟合我的模型 import statsmodels api as sm X np array 22000 13400 47600 7400 12000 32000 28000 31000 6
  • 从字符串中删除识别的日期

    作为输入 我有几个包含不同格式日期的字符串 例如 彼得在16 45 我的生日是1990年7月8日 On 7 月 11 日星期六我会回家 I use dateutil parser parse识别字符串中的日期 在下一步中 我想从字符串中删除
  • 如何替换 pandas 数据框列中的重音符号

    我有一个数据框dataSwiss其中包含瑞士城市的信息 我想用普通字母替换带有重音符号的字母 这就是我正在做的 dataSwiss Municipality dataSwiss Municipality str encode utf 8 d
  • 如何加速Python中的N维区间树?

    考虑以下问题 给定一组n间隔和一组m浮点数 对于每个浮点数 确定包含该浮点数的区间子集 这个问题已经通过构建一个解决区间树 https en wikipedia org wiki Interval tree 或称为范围树或线段树 已经针对一
  • 如何使用 OpencV 从 Firebase 读取图像?

    有没有使用 OpenCV 从 Firebase 读取图像的想法 或者我必须先下载图片 然后从本地文件夹执行 cv imread 功能 有什么办法我可以使用cv imread link of picture from firebase 您可以
  • Flask如何获取请求的HTTP_ORIGIN

    我想用我自己设置的 Access Control Allow Origin 标头做出响应 而弄清楚请求中的 HTTP ORIGIN 参数在哪里似乎很混乱 我在用着烧瓶 0 10 1 以及HTTP ORIGIN似乎是这个的特点之一object
  • 在Python中获取文件描述符的位置

    比如说 我有一个原始数字文件描述符 我需要根据它获取文件中的当前位置 import os psutil some code that works with file lp lib open path to file p psutil Pro
  • 如何使用Python创建历史时间线

    So I ve seen a few answers on here that helped a bit but my dataset is larger than the ones that have been answered prev
  • 对年龄列进行分组/分类

    我有一个数据框说df有一个柱子 Ages gt gt gt df Age 0 22 1 38 2 26 3 35 4 35 5 1 6 54 我想对这个年龄段进行分组并创建一个像这样的新专栏 If age gt 0 age lt 2 the
  • 为字典中的一个键附加多个值[重复]

    这个问题在这里已经有答案了 我是 python 新手 我有每年的年份和值列表 我想要做的是检查字典中是否已存在该年份 如果存在 则将该值附加到特定键的值列表中 例如 我有一个年份列表 并且每年都有一个值 2010 2 2009 4 1989
  • 有人用过 Dabo 做过中型项目吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我们正处于一个新的 ERP 风格的客户端 服务器应用程序的开始阶段 该应用程序是作为 Python 富客户端开发的 我们目前正在评估 Dabo
  • 使用 Python 的 matplotlib 选择在屏幕上显示哪些图形以及将哪些图形保存到文件中

    我想用Python创建不同的图形matplotlib pyplot 然后 我想将其中一些保存到文件中 而另一些则应使用show 命令 然而 show 显示all创建的数字 我可以通过调用来避免这种情况close 创建我不想在屏幕上显示的绘图
  • Rocket UniData/UniVerse:ODBC 无法分配足够的内存

    每当我尝试使用pyodbc连接到 Rocket UniData UniVerse 数据时我不断遇到错误 pyodbc Error 00000 00000 Rocket U2 U2ODBC 0302810 Unable to allocate
  • 导入错误:没有名为 site 的模块 - mac

    我已经有这个问题几个月了 每次我想获取一个新的 python 包并使用它时 我都会在终端中收到此错误 ImportError No module named site 我不知道为什么会出现这个错误 实际上 我无法使用任何新软件包 因为每次我
  • 如何将输入读取为数字?

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 Why are x and y下面的代码中使用字符串而不是整数 注意 在Python 2
  • NotImplementedError:无法将符号张量 (lstm_2/strided_slice:0) 转换为 numpy 数组。时间

    张量流版本 2 3 1 numpy 版本 1 20 在代码下面 define model model Sequential model add LSTM 50 activation relu input shape n steps n fe
  • Statsmodels.formula.api OLS不显示截距的统计值

    我正在运行以下源代码 import statsmodels formula api as sm Add one column of ones for the intercept term X np append arr np ones 50

随机推荐

  • 指向接口/重载过程的过程指针

    我使用过程重载和接口来在 Fortran 程序中实现某种通用性 为此 我有一个包含许多过程的模块 所有过程都是重复的 以便能够更改变量类型 我还在模块的开头提供了一系列以下类型的接口 interface norm module proced
  • Geodjango 的 Beanstalk 迁移失败

    我想在 aws beanstalk 中部署 geodjango 我已经尝试过这个解决方案 以前有用过 commands 01 yum update command sudo yum y update 02 epel repo command
  • 当向视图控制器添加展开函数时,链接器命令失败,退出代码为 1

    我正在使用 Storyboard 开发一款 iPad 应用程序 在我的应用程序中 我有一个弹出窗口和一个视图控制器 如果我添加一个像这样的函数 IBAction unwindCouponPaymentToOrderdetailsView U
  • python 中的复制构造函数?

    python中有复制构造函数吗 如果不是 我会做什么来实现类似的目标 情况是 我正在使用一个库 并且我已经用额外的功能扩展了其中一个类 并且我希望能够将从库中获取的对象转换为我自己的类的实例 我想你想要复制模块 import copy x
  • 如何将词云放入grob中?

    我创建了一个简单的词云 require wordcloud words lt c affectionate ambitious anxious articulate artistic caring contented creative cy
  • 使用 BeautifulSoup 的 Python 进行网页抓取 429 错误

    首先 我不得不说我对使用 Python 进行 Web 抓取还很陌生 我正在尝试使用这些代码行来抓取数据 import requests from bs4 import BeautifulSoup baseurl https name of
  • Angular 2路由到同一路由

    I have Ride组件 并在骑行结束时Ride Summary显示 右侧的摘要有一个 开始另一次骑行 按钮 该按钮会重定向到同一组件 Ride routerLink Ride 自从Ride组件已经是我所在的组件 它没有刷新并且Ride
  • 使用 C 结构成员的连续内存

    在将其标记为重复之前 请先阅读问题 所以这可能是一个潜在的非常愚蠢的问题 但它困扰着我 我从阅读以及许多其他问题中知道 由于编译器添加的填充 C 结构中的字段不能保证是连续的 例如 根据C标准 13 在结构体对象中 非位域成员和位域所在的单
  • Javascript 在重新加载或重定向之前删除 cookie

    我需要删除一个cookie并且then进行重定向 然而 在处理重定向之前 cookie 不会被删除 问题是 如果执行重定向时 cookie 仍然存在 则重定向会被拦截并发送到预期页面以外的页面 很奇怪 我知道 说来话长 是否有可能欺骗浏览器
  • 如何使用其他Facebook帐户登录?

    我关注了本教程制作一个小应用程序来登录并打招呼 用户名 问题是 我只能使用我的帐户登录 但无法使用其他帐户登录 此问题发生在一些需要登录的示例代码 例如 HelloFacebookSample 或 Scrumptious 中 Logcat
  • 如何在Python中合并2列

    假设我使用 numpy 定义了一个 2x2 矩阵 array 1 2 2 3 现在另一个 2x1 矩阵 array 3 4 如何按列连接这两个矩阵 使其变为 array 1 2 3 2 3 4 我怎样才能删除指定列 这样它就会变成 arra
  • 使用正确的网格在 R 中绘制 netcdf

    我的目标是在世界地图上绘制硝酸盐 no3 数据 使用这些数据的正确经度和纬度 有两个 netcdf 文件 1 与数据 2 与网格信息 数据摘要信息 no3 是长度为 x y sigma 的数组 no3 df 是 x y 观测值 3 个变量
  • 在 IE7 中使用 Prawn 生成 Rails PDF

    我正在使用 Prawn 和 Prawnto 在 Ruby on Rails 应用程序 Rails 版本 2 2 2 中生成 PDF 该应用程序运行良好 可以愉快地生成 PDF 并将其发送给用户以在 Firefox 中下载 问题出在IE7上
  • 使用 PHP 在 Windows 中获取文件所有者

    在 Windows 上提供文件路径并获取其所有者用户名 当然 fileowner在这里是没用的 有什么 PECL 扩展可以提供帮助吗 编辑 也可以使用的替代方案 从 DOC 文件中读取摘要数据 以检索作者 编辑2 使用找到了解决方案COM
  • 在中心找不到工件 javax.sql:jdbc-stdext:jar:2.0 (https://repo.maven.apache.org/maven2)

    我正在尝试构建为我的项目创建的 Web 服务的 REST API 我的网络服务运行没有问题 现在 我想在远程服务器上部署我的服务 并且我需要生成war file 我使用 Java Eclipse 和 Maven 作为依赖项 我试着做一个全新
  • 如何使“%bp.hap.run-until name = X86_HLT_Instr”工作?

    从命令行模拟执行二进制文件 建议使用 bp hap run until name X86 HLT Instr 这是我的完整脚本 run command file targets qsp x86 firststeps no network s
  • 在android中解析11MB的大json[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我在使用 GSON 和 J
  • wakeLock 不等待网络连接

    我使用唤醒锁作为警报来定期更新应用程序状态 三星手机上的 WiFi 需要一段时间才能连接 还有 Wifi 上的 保持唤醒 选项does not在三星手机上工作 他们也没有兴趣解决这个问题 因此 当唤醒锁确实发生时 它应该等待 wifi 连接
  • 为什么maven依赖中的版本号有时会被跳过?

    我对 Maven 的功能还很陌生 我发现在 pom xml 中放置依赖项的地方 有时只提到 groupID 和artifact id 而跳过 version 为什么是这样 例如以下依赖项来自 springsource 网站http spri
  • 在 Sympy 中部分分解表达式

    Suppose I have an expression of the form I know that I can simplify the expression like so However sympy simplify and sy