SymPy 无法对产品进行羔羊化

2024-05-01

我正在使用 SymPy 1.0 和 Python 2.7。我想计算前 100 个整数的总和:

此代码运行成功

import sympy as sy
from sympy.tensor import IndexedBase, Idx
import numpy as np

x = sy.IndexedBase('x')
i = sy.symbols('i', cls=Idx)
s = sy.Sum(x[i], (i, 0, 100))
s_lambda = sy.lambdify(sy.DeferredVector('x'), s, 'numpy')
s_lambda(np.arange(101))

并给出5050正如预期的那样。但是当我尝试对 a 做同样的事情时Product代替Sum:

import sympy as sy
from sympy.tensor import IndexedBase, Idx
import numpy as np

x = sy.IndexedBase('x')
i = sy.symbols('i', cls=Idx)
s = sy.Product(x[i], (i, 0, 100))
s_lambda = sy.lambdify(sy.DeferredVector('x'), s, 'numpy')
s_lambda(np.arange(101))

I got a NameError: global name 'Product' is not defined我究竟做错了什么?有没有解决方法可以得到我想要的东西?

编辑1: 如果我事先不知道限制怎么办?Product。让我们说一些类似的话

import sympy as sy
from sympy.tensor import IndexedBase, Idx
import numpy as np

x = sy.IndexedBase('x')
i = sy.symbols('i', cls=Idx)
n = sy.symbols('n', integer=True, positive=True)
s = sy.Product(x[i], (i, 0, n))
s_lambda = sy.lambdify((sy.DeferredVector('x'), n) s.doit(), 'numpy')
s_lambda(np.arange(101), 5)

编辑2: 我正在尝试寻找解决方法。NameError: global name 'Product' is not defined由于这个原因给出了错误:

lambdastr((sy.DeferredVector('x'), n), p)

这给出:

lambda x,n: (Product(x[i], (i, 0, n)))

而对于Sum我们得到了一个有效的 lambda 函数:

lambda x,n: ((builtins.sum(x[i] for i in range(0, n+1))))

此时问题就围绕着Product功能。根据手册我可以通过注射dict我对函数的定义

def my_prod(a, b):
    # my implementation
    pass

my_fun = {"Product" : my_prod}
f = sy.lambdify((sy.DeferredVector('x'), n), p, modules=['numpy', my_fun])
f([1,2,3,4,5], 2)

问题是,list indices must be integers, not Symbol当我尝试使用lambda化函数时出现错误f。我想这是由于i这是一个符号,而它应该是一个整数。我不明白为什么它没有通过实际integer在尝试打电话之前my_prod因为它是为了Sum case.


当极限Product是预先知道的

您可以通过致电解决该问题.doit()扩大Product进入其组成部分:

In [104]: s = sy.Product(x[i], (i, 1, 10)); s
Out[104]: Product(x[i], (i, 1, 10))

In [105]: s.doit()
Out[105]: x[1]*x[2]*x[3]*x[4]*x[5]*x[6]*x[7]*x[8]*x[9]*x[10]

例如,

import sympy as sy
from sympy.tensor import IndexedBase, Idx
import numpy as np

x = sy.IndexedBase('x')
i = sy.symbols('i', cls=Idx)
s = sy.Product(x[i], (i, 1, 10))
s_lambda = sy.lambdify(sy.DeferredVector('x'), s.doit(), 'numpy')
print(s_lambda(np.arange(11)))

prints

3628800

但是,如果您使用.doit() with sy.Product(x[i], (i, 1, 100))那么你会得到算术溢出np.arange(101)有数据类型int32 or int64(取决于您的操作系统)和产品100!

In [109]: math.factorial(100)
Out[109]: 93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000

太大,无法存储在int32 or int64数组值。

In [118]: np.iinfo('int64').max
Out[118]: 9223372036854775807

In [119]: np.iinfo('int64').max < math.factorial(100)
Out[119]: True

Thus,

s = sy.Product(x[i], (i, 1, 100))
s_lambda = sy.lambdify(sy.DeferredVector('x'), s.doit(), 'numpy')
print(s_lambda(np.arange(101)))

提出一个

RuntimeWarning: overflow encountered in long_scalars

并错误地打印0.


如果更改 dtype 数组的输入int64到 Python 列表int然后 可以正确计算乘积:

import sympy as sy
from sympy.tensor import IndexedBase, Idx
import numpy as np

x = sy.IndexedBase('x')
i = sy.symbols('i', cls=Idx)
s = sy.Product(x[i], (i, 1, 100))
s_lambda = sy.lambdify(sy.DeferredVector('x'), s.doit(), 'numpy')
print(s_lambda(np.arange(101).tolist()))

prints

93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000

当极限Product are not预先知道

解决方法 (AFAICS)变得更加复杂。如果您使用调试器来跟踪代码路径 跟随当Sum用过你会发现LambdaPrinter._print_Sum https://github.com/sympy/sympy/blob/master/sympy/printing/lambdarepr.py#L44被调用来转换Sum(x[i], (i, 0, n))到表达式builtins.sum(x[i] for i in range(0, n+1)).

如果我们添加一个_print_Product方法NumPyPrinter(的子类LambdaPrinter), 那么我们可以得到lambdify成功转换Product转换为 NumPy 可以计算的表达式:

import sympy as sy
from sympy.tensor import IndexedBase, Idx
import numpy as np
import sympy.printing.lambdarepr as SPL

def _print_Product(self, expr):
    loops = (
        'for {i} in range({a}, {b}+1)'.format(
            i=self._print(i),
            a=self._print(a),
            b=self._print(b))
        for i, a, b in expr.limits)
    return '(prod([{function} {loops}]))'.format(
        function=self._print(expr.function),
        loops=' '.join(loops))
SPL.NumPyPrinter._print_Product = _print_Product

x = sy.IndexedBase('x')
i = sy.symbols('i', cls=Idx)
n = sy.symbols('n', integer=True, positive=True)
s = sy.Product(x[i], (i, 1, n))
s_lambda = sy.lambdify((sy.DeferredVector('x'), n), s, 'numpy')
print(s_lambda(np.arange(101), 5))

prints

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

SymPy 无法对产品进行羔羊化 的相关文章

  • Mac OS 上的诗歌安装失败,显示“should_use_symlinks”

    我正在尝试使用以下命令安装诗歌 curl sSL https install python poetry org python3 但它失败了 但有以下例外 例外 此版本的 python 无法在不使用符号链接的情况下创建 venvs 下面是详
  • Google App Engine queue.yaml 无法在开发服务器中工作

    我无法让 dev appserver py 识别我使用queue yaml 创建的自定义队列 他们没有出现在http localhost 8000 taskqueue http localhost 8000 taskqueue 当我尝试向其
  • 如何在Python中流式传输和操作大数据文件

    我有一个相对较大 1 GB 的文本文件 我想通过跨类别求和来减小其大小 Geography AgeGroup Gender Race Count County1 1 M 1 12 County1 2 M 1 3 County1 2 M 2
  • 如何在python 3.7中生成条形码

    我正在使用 python 3 7 为了生成条形码 我尝试使用安装 pyBarcode 库pip install pyBarcode 但它显示以下错误 找不到满足 pyBarcode 要求的版本 来自版本 找不到 pyBarcode 的匹配分
  • sklearn 中的 pca.inverse_transform

    将我的数据拟合后 X 我的数据 pca PCA n components 1 pca fit X X pca pca fit transform X 现在 X pca 具有一维 当我根据定义执行逆变换时 它不是应该返回原始数据 即 X 二维
  • Python3.0 - 标记化和取消标记化

    我正在使用类似于以下简化脚本的内容来解析较大文件中的 python 片段 import io import tokenize src foo bar src bytes src encode src io BytesIO src src l
  • 如果未引发异常,则通过 Python 单元测试

    在Python中unittest框架 是否有一种方法可以在未引发异常的情况下通过单元测试 否则会因 AssertRaise 而失败 如果我正确理解你的问题 你could做这样的事情 def test does not raise on va
  • Pandas:如果单元格包含特定文本则删除行

    pandas 中的这段代码不起作用 如果该列包含提供的任何文本 数字 我希望它删除该行 目前 我只能在单元格与我的代码中传递的确切文本匹配时才能使其工作 因为它只删除显示 Fin 的单元格不是金融或金融 df2 df df Team Fin
  • 搜索多个字段

    我想我没有正确理解 django haystack 我有一个包含多个字段的数据模型 我希望搜索其中两个字段 class UserProfile models Model user models ForeignKey User unique
  • 一段时间后终止线程的最 Pythonic 方法

    我想在线程中运行一个进程 它正在迭代一个大型数据库表 当线程运行时 我只想让程序等待 如果该线程花费的时间超过 30 秒 我想终止该线程并执行其他操作 通过终止线程 我的意思是我希望它停止活动并优雅地释放资源 我认为最好的方法是通过Thre
  • 结构差异 sudo() run('sudo 命令')

    我想知道函数之间有什么区别sudo 和函数run sudo u user smth 文档上有 sudo 在所有运行方式上都是相同的 除了它总是换行 调用 sudo 程序中的给定命令以提供超级用户 特权 但有几次 sudo cmd 提示我输入
  • 通过索引访问Python字典的元素

    考虑一个像这样的字典 mydict Apple American 16 Mexican 10 Chinese 5 Grapes Arabian 25 Indian 20 例如 我如何访问该字典的特定元素 例如 我想在对 Apple 的第一个
  • SMTP_SSL SSLError: [SSL: UNKNOWN_PROTOCOL] 未知协议 (_ssl.c:590)

    此问题与 smtplib 的 SMTP SSL 连接有关 当与 SMTP 无 ssl 连接时 它正在工作 在 SMTP SSL 中尝试相同的主机和端口时 出现错误 该错误仅基于主机 gmail 设置也工作正常 请检查下面的示例 如果 Out
  • Mac OSX 10.6 上的 Python mysqldb 不工作

    我正在使用 Python 2 7 并尝试让 Django 项目在 MySQL 后端运行 我已经下载了 mysqldb 并按照此处的指南进行操作 http cd34 com blog programming python mysql pyth
  • 在系统托盘中隐藏 tkinter 窗口 [重复]

    这个问题在这里已经有答案了 我正在制作一个程序来提醒我朋友的生日 这样我就不会忘记祝福他们 为此 我制作了两个 tkinter 窗口 1 First one is for entering name and birth date 2 Sec
  • 从 NumPy 数组到 Mat 的 C++ 转换 (OpenCV)

    我正在围绕 ArUco 增强现实库 基于 OpenCV 编写一个薄包装器 我试图构建的界面非常简单 Python 将图像传递给 C 代码 C 代码检测标记并将其位置和其他信息作为字典元组返回给 Python 但是 我不知道如何在 Pytho
  • 动态过滤 pandas 数据框

    我正在尝试使用三列的阈值来过滤 pandas 数据框 import pandas as pd df pd DataFrame A 6 2 10 5 3 B 2 5 3 2 6 C 5 2 1 8 2 df df loc df A gt 0
  • 从 pandas DataFrame 中删除少于 K 个连续 NaN

    我正在处理时间序列数据 我在从数据帧列中删除小于或等于阈值的连续 NaN 时遇到问题 我尝试查看一些链接 例如 标识连续 NaN 出现的位置以及计数 Pandas NaN 孔的游程长度 https stackoverflow com que
  • 使用ssl和socket的python客户端身份验证

    我有一个 python 服务器 需要客户端使用证书进行身份验证 我如何制作一个客户端脚本 使用客户端证书由 python 中的服务器使用 ssl 和套接字模块进行身份验证 有没有仅使用套接字和 ssl 而不扭曲的示例 from OpenSS
  • Apache Beam Pipeline 写表后查询表

    我有一个 Apache Beam Dataflow 管道 它将结果写入 BigQuery 表 然后我想查询该表以获取管道的单独部分 但是 我似乎无法弄清楚如何正确设置此管道依赖性 我编写的新表 然后想要查询 与一个单独的表连接以进行某些过滤

随机推荐

  • 在 fork() 之后寻求有关“文件描述符”的简单描述

    Unix 环境中的高级编程 第二版 作者 W Richard Stevens 第 8 3 节 fork 函数 描述如下 父级和子级共享相同的文件偏移量非常重要 考虑一个分叉子进程 然后等待子进程完成的进程 假设两个进程都写入标准输出作为其正
  • 使用选择器获取最接近的父元素(不包括当前元素)

    我正在尝试获取元素的最接近的父元素 看着 closest https developer mozilla org en US docs Web API Element closest 如果选择器与元素匹配 它似乎会返回元素本身 Closes
  • WEBHID API:条形码扫描仪未触发输入报告

    我几乎使用 Nintendo Switch Joy Con 控制器演示 我对其进行了一些修改以使其与我的条形码扫描仪一起使用 它就是行不通 如果行得通 则每 100 次站点刷新就会工作一次 console log text gt log t
  • 如何将 Mercurial 存储库克隆到已存在的目录中?

    我有一个客户的 Django 项目 正在本地开发 使用 Mercurial 进行版本控制 我将本地存储库推送到我的个人远程服务器 我保存所有项目的地方 然后当我部署它时 在任何 Web 服务器上 我从我的个人服务器克隆该存储库 这在大多数服
  • 作为颜色表示的值

    将值转换为颜色是众所周知的 我确实理解以下两种方法 在改变 RGB 颜色值来表示一个值 https stackoverflow com questions 1423925 changing rgb color values to repre
  • 如何从控制器 Symfony2 内部访问不同的控制器

    我需要从另一个控制器内的不同控制器访问方法 我该怎么做 我可以用吗this gt get method 我可以将控制器包含在当前控制器中并创建它的对象并通过该对象访问该方法吗 这样做 可以 吗 我想调用另一个控制器的表单方法 newActi
  • 找不到 build.xml (Android)

    我一直在寻找这个问题的答案有一段时间了 但我似乎找不到它 我通过 perfoce 移动了 NeBeans Android 项目 现在出现以下错误 ZYAndroidAPP build xml 81 Cannot find F Program
  • 我应该如何处理 Android 应用程序中 http post 的服务器超时和错误代码响应?

    我的 Android 应用程序会向 URL 发送 http 帖子 例如http example com 电子邮件受保护 http example com abc php email abc xyz com因此 Android 应用程序基本上
  • 在哪里可以找到所有 HQL 关键字的列表?

    在哪里可以找到所有 HQL 关键字的列表 在完整的 Hibernate 源代码下载中 有一个grammar hql g文件 这是ANTLR http www antlr org 语言定义 您可以从官方GitHub源码仓库查看该文件的最新版本
  • ImageDataGenerator 预测类 - 为什么预测未正确从概率转换为预测类?

    我有一个这样设置的目录 images val class1 class2 test all classes train class1 class2 每个目录中都有一组图像 我想预测测试中的每个图像是否属于 1 类或 2 类 我写这个是为了读
  • 如何在firebase云函数中添加时间戳

    我正在尝试添加Timestamp在有关 Firebase Cloud 功能的 Firestore 文档中 我曾尝试过firestore Timestamp fromDate new Date 但它不起作用 const functions r
  • 使用 zsh 在终端中启动 Sublime Text 3

    我最近购买了一台新 MacBook 我正在尝试重新配置我的系统 该应用程序位于应用程序文件夹内 名称为 Sublime Text app 我已经通过我在网上找到的其他建议编辑了 sublime plugin zsh 文件到 Sublime
  • 使用 django-import-export 通过 url 将外键 id 传递到导入的 csv 文件

    我尝试使用 django import export 和外键 位置 将一些数据从 csv 文件导入到 django 数据库 我想要实现的是 location id 由请求网址传递 value datetime location 4 46 2
  • 使用 NSTimer 传递原始参数的正确方法

    我正在使用一个调用此方法的基本计时器 void refresh id obj if obj YES doSomething 我想从代码的某些区域以及计时器调用此方法 NSTimer scheduledTimerWithTimeInterva
  • Rust Json 序列化重叠职责

    我正在学习 Rust 中的 Json 序列化 特别是如何将 Rust 对象序列化为 Json 目前我看到 3 种将结构体实例转换为 Json 的方法 派生可编码特征 手动实现 ToJson 特征 手动实现可编码特征 下面的代码说明了所有 3
  • 从集合类型 Oracle 12c 插入表 - ORA-00902: 无效数据类型

    我正在使用 Oracle 12 1 我以为我可以查询 12c 中的表类型 当我尝试执行此包时 我收到错误 ORA 00902 无效数据类型 我什至尝试使用强制转换多重集 但仍然出现同样的错误 我知道我们可以在数据库级别创建对象然后查询 但我
  • 工具提示出现在 intro.js 移动视图中的元素上方

    我正在使用 intro js 初步浏览我网站上的页面 该游览在桌面上看起来不错 但在移动设备上 工具提示出现在它所描述的元素的正上方 用户无法在移动视图中看到该元素 因为工具提示出现在该元素的正上方 见下图 我尝试自定义工具提示的位置 但输
  • CSS淡入淡出动画延迟计时

    我正在尝试使用 css3 创建幻灯片效果 我有三张图像 我需要将它们相互淡入淡出 每次转换需要持续 3 秒 第一张图像显示 3 秒 然后淡入第二张图像 第三张图像同样显示 我不确定如何计算关键帧的百分比 Codepen http codep
  • 每 x 秒对 SVG 元素进行动画处理

    介绍 我了解一些基本的动画技术SVG两者同时使用Javascript和 DOM
  • SymPy 无法对产品进行羔羊化

    我正在使用 SymPy 1 0 和 Python 2 7 我想计算前 100 个整数的总和 此代码运行成功 import sympy as sy from sympy tensor import IndexedBase Idx import