如何解析和简化像“3cm/μs² + 4e-4 sqmiles/km/h**2”这样的字符串,正确处理物理单位?

2024-01-09

我想像这样分割一个字符串3cm/µs² + 4e-4 sqmiles/km/h**2进入其SI unit https://en.wikipedia.org/wiki/International_System_of_Units(在这种情况下,m/s**2)及其大小(以该单位的倍数表示)。

由于 sympy 提供了解析模块 http://docs.sympy.org/dev/modules/parsing.html and 许多物理单位和 SI 前缀 http://docs.sympy.org/dev/modules/physics/units.html,我想使用 sympy 是个好主意。但实现这一目标的好方法是什么?我会编写如下所示的算法,但我想避免重新发明方形轮子:

  • 处理数字和字母之间的转换(除了4e-4像语法)和空格(除非它紧邻显式运算符)作为乘法,然后标记化
  • 将每个非数字标记替换为其 SI 表示形式(同时检查 SI 前缀)
  • 将新表达式简化为Magnitude * some SI units(对不一致的单位给出有意义的错误消息,例如Cannot add m**2 to s)

通过现有手段可以轻松实现这一目标吗?或者如何最好地实施这一点?


Units

解决方案是从 SymPy 收集所有单位units模块并使用它们来替换由sympify

>>> import sympy.physics.units as u 
... subs = {} 
... for k, v in u.__dict__.items(): 
...     if isinstance(v, Expr) and v.has(u.Unit): 
...         subs[Symbol(k)] = v # Map the `Symbol` for a unit to the unit

>>> # sympify returns `Symbol`s, `subs` maps them to `Unit`s
>>> print sympify('yard*millimeter/ly').subs(subs)
127*m/1313990343414000000000

如果该符号不在units它只会被打印为未知符号(例如barn)

>>> print sympify('barn/meter**2').subs(subs)
barn/m**2 

但你总是可以添加东西到subs字典。

>>> subs[Symbol('almost_meter')] = 0.9*u.meter
... sympify('almost_meter').subs(subs)
0.9*m

SI 前缀并不完全按照您想要的方式工作。您需要添加一个乘号(或者希望它是一个常见单位,例如km这是明确实施的)。此外,由于它们不是Unit而是实例Integer您必须将它们添加到实例subs:

>>> import sympy.physics.units as u
... subs = {} 
... for k, v in u.__dict__.items(): 
...     if (isinstance(v, Expr) and v.has(u.Unit)) or isinstance(v, Integer): 
...         subs[Symbol(k)] = v 

>>> print sympify('mega*m').subs(subs)
1000000*m 

对于 unicode,您可能需要一些预处理。我认为 SymPy 没有对 unicode 支持做出任何承诺。

如果你实施新的Units,请考虑在 github 上向他们提出拉取请求。要编辑的文件应该是sympy/physics/units.py.

空格和隐式乘法

在 SymPy 的开发版本中,您可以找到用于假设隐式乘法的代码,其中写入了适当的空格:

>>> from sympy.parsing.sympy_parser import (parse_expr,
... standard_transformations, implicit_multiplication_application)

>>> parse_expr("10sin**2 x**2 + 3xyz + tan theta",
...            transformations=(standard_transformations + 
...                             (implicit_multiplication_application,)))
3*x*y*z + 10*sin(x**2)**2 + tan(theta) 

Security

sympify uses eval如果您打算将其用于面向网络的应用程序,则可以利用它!

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

如何解析和简化像“3cm/μs² + 4e-4 sqmiles/km/h**2”这样的字符串,正确处理物理单位? 的相关文章

  • 从正在运行的 python 脚本检测优化标志是否为 -O 或 -OO

    有时我想生成一个子进程 其优化标志与启动父进程时使用的优 化标志相同 我可以使用类似的东西 optimize not debug 但这样我就可以匹配两者 O and OO flags 是否有一些 python 内部状态包含该信息 经过一番深
  • 行未从树视图复制

    该行未在树视图中复制 我在按行并复制并粘贴到未粘贴的任何地方后制作了弹出复制 The code popup tk Menu tree opportunity tearoff 0 def row copy item tree opportun
  • 在Python3.6中调用C#代码

    由于完全不了解 C 编码 我希望在我的 python 代码中调用 C 函数 我知道有很多关于同一问题的问答 但由于一些奇怪的原因 我无法从示例 python 模块导入简单的 c 类库 以下是我所做的事情 C 类库设置 我使用的是 VS 20
  • 如何从 PyCharm 项目中获取我的“exe”[重复]

    这个问题在这里已经有答案了 通过 PyCharm 在 Python 上编写一些项目 我想从中获取一个exe文件 我尝试过 另存为 gt XXX exe 但是 当我尝试执行它时出现错误 此类操作系统不支持该文件 附注 我有win7 x64 它
  • Python BeautifulSoup XML 解析

    我编写了一个简单的脚本来使用 BeautifulSoup 模块解析 XML 聊天日志 标准 soup prettify 工作正常 只是聊天日志中有很多绒毛 您可以在下面看到我正在使用的脚本代码和一些 XML 输入文件 Code import
  • 可以在 TensorFlow 中使用排名相关作为成本函数吗?

    我正在处理偶尔充满异常值的极其嘈杂的数据 因此我主要依靠相关性来衡量我的神经网络的准确性 是否可以明确使用诸如等级相关性 斯皮尔曼相关系数 之类的东西作为我的成本函数 到目前为止 我主要依赖 MSE 作为相关性的代理 我现在面临三个主要障碍
  • Pandas重置索引未生效[重复]

    这个问题在这里已经有答案了 我不确定我在哪里误入歧途 但我似乎无法重置数据帧上的索引 当我跑步时test head 我得到以下输出 正如您所看到的 数据帧是一个切片 因此索引超出范围 我想做的是重置该数据帧的索引 所以我跑test rese
  • 错误:permission_manager_qt.cpp(82) 不支持的权限类型:13

    我正在开发具有内置浏览器功能的 python 代码 PyQt 5 13 import sys from PyQt5 QtCore import from PyQt5 QtGui import from PyQt5 QtWidgets imp
  • Python igraph:从图中删除顶点

    我正在使用安然电子邮件数据集 并尝试删除没有 enron com 的电子邮件地址 即我只想拥有安然电子邮件 当我尝试删除那些没有 enron com 的地址时 一些电子邮件由于某些原因被跳过 下面显示了一个小图 其中顶点是电子邮件地址 这是
  • 如何使用 python urllib 在 HTTP/1.1 中保持活力

    现在我正在这样做 Python3 urllib url someurl headers HOST somehost Connection keep alive Accept Encoding gzip deflate opener urll
  • Python Kivy - 在本机网络浏览器中打开 url 的应用程序

    我尝试制作一个简单的应用程序 在单击 Screen One 上的按钮后 在 Kivy 中打开一个网页 我使用了这个主题 Python 在应用程序中直接显示网络浏览器 iframe https stackoverflow com questi
  • 更改 pandas 中多个日期时间列的时区信息

    有没有一种简单的方法可以将数据帧中的所有时间戳列转换为本地 任何时区 不是逐列进行吗 您可以有选择地将转换应用于所有日期时间列 首先 选择它们select dtypes https pandas pydata org pandas docs
  • 具有多个元素的数组的真值是二义性错误吗? Python

    from numpy import from pylab import from math import def TentMap a x if x gt 0 and x lt 0 5 return 2 a x elif x gt 0 5 a
  • 为什么我用 beautifulSoup 刮的时候有桌子,但没有 pandas

    尝试抓取条目页面转换为制表符分隔格式 主要拉出序列和 UniProt 登录号 当我跑步时 url www signalpeptide de index php sess m listspdb bacteria s details id 10
  • 将 Pandas 列中的列表拆分为单独的列

    这是我在 pandas 数据框中的 特征 列 Feature Cricket 82379 Kabaddi 255 Reality 4751 Cricket 15640 Wildlife 730 LiveTV 13 Football 4129
  • 导入错误:没有名为 google.auth 的模块

    当我尝试导入时firebase admin in python 2 7我收到错误 导入错误 没有名为 google auth 的模块 这是Docker文件 https github com ammaratef45 Attendance bl
  • 查找给定节点的最高权重边

    我在 NetworkX 中有一个有向图 边缘的权重从 0 到 1 表示它们发生的概率 网络连通性非常高 所以我想修剪每个节点的边缘 只保留最高概率的节点 我不确定如何迭代每个节点并仅保留最高权重in edges在图中 有没有一个networ
  • 为什么实现 __iter__ 的对象不被识别为可迭代的?

    假设您使用包装对象 class IterOrNotIter def init self self f open tmp toto txt def getattr self item try return self getattribute
  • Scipy 稀疏 Cumsum

    假设我有一个scipy sparse csr matrix代表下面的值 0 0 1 2 0 3 0 4 1 0 0 2 0 3 4 0 我想就地计算非零值的累积和 这会将数组更改为 0 0 1 3 0 6 0 10 1 0 0 3 0 6
  • 如何在sphinx中启用数学?

    我在用sphinx http sphinx pocoo org index html与pngmath http sphinx pocoo org ext math html module sphinx ext pngmath扩展来记录我的代

随机推荐

  • 在哪里可以查看 Google Analytics iOS 崩溃日志?

    在 Google Analytics Native SDK for iOS v2 Beta 中 我在文档中找到了以下行 Optional automatically track uncaught exceptions with Google
  • Github GraphQL 搜索与过滤

    根据我有限的搜索 GraphQL 似乎只能支持等值过滤 所以 是否可以使用以下过滤条件进行Github GraphQL搜索 星星 gt 10 货叉 gt 3 总提交 gt 5 总问题 gt 1 未决问题 尺寸 gt 2k 分数 gt 5 上
  • Android DatePicker 没有星期日

    我正在使用日期选择器来选择特定日期 日期选择器不应允许选择星期日 到目前为止 我正在检测选择后的星期日并显示一条消息 但如果日期选择器不允许星期日 那就更好了 有没有办法做到这一点 检测星期日的代码 private static class
  • 使用 angular2-jwt 的 Angular 6

    将我的应用程序从 Angular 4 迁移到 Angular 6 最新版本 后 我的 Auth 服务中出现了一个非常奇怪的错误 具体来说 当我尝试执行以下操作时 angular2 jwt 包会导致致命错误 serve or build 该应
  • 使用 C 中的位掩码和位运算符检查字符是否为 ASCII

    我需要编写程序来检查标准输入中的每个单独的字符 看看它是否是 ASCII 字符 我知道它需要检查的是第 8 位 代码中的第 7 位 如果我没记错的话 是否为 0 因为 ASCII 只使用 7 位 但我很难弄清楚如何准确地让它检查具体位 这就
  • git-diff 中有类似 diff --show-c-function 的东西吗?

    我一直在处理 git 存储库中的一个文件 如果我有该文件的原始 git 版本的副本 我可以运行 diff show c function 来比较这两个文件 其中 理论上 它显示了已被调用的任何函数的全部内容改变了 这对于弄清楚我专门对文件做
  • 增加 Sublime Text 2 中最近项目的数量?

    是否可以增加 Sublime Text 2 中 项目 gt 最近的项目 菜单中显示的最近项目的数量 我搜索了设置 但没有找到任何内容 编辑这个文件 Library Application Support Sublime Text 2 Pac
  • RectF使用dp还是px?

    在Canvas中 用RectF画一个矩形 需要将top和left设置为dp还是px Integer padding 10 Integer width 100 It is dp or px Integer height 50 RectF po
  • Hadoop:如何将减速器输出合并到单个文件? [复制]

    这个问题在这里已经有答案了 我知道 shell 中的 getmerge 命令可以完成这项工作 但是 如果我想在作业结束后通过 HDFS API for java 合并这些输出 我该怎么办 我真正想要的是 HDFS 上的单个合并文件 我唯一能
  • C# 通用字符串解析为任何对象

    我将对象值存储在字符串中 例如 string values new string 213 4 10 hello MyValue 有什么方法可以通用地初始化适当的对象类型吗 例如 类似的东西 double foo1 AwesomeFuncti
  • Clojure 从指定位置的 Vector 中删除项目

    有没有办法根据索引从向量中删除项目 目前我正在使用 subvec 来分割向量并再次重新创建它 我正在寻找向量的 assoc 的反面 subvec可能是最好的方法 Clojure 文档说subvec is O 1 并且非常快 因为生成的向量与
  • 如何创建自定义列表累加器,即 List[(Int, Int)]?

    我正在尝试使用 Apache Spark 中的自定义累加器来累积列表中的对 结果应该有List Int Int 类型 为此 我创建了自定义累加器 import org apache spark AccumulatorParam class
  • 是什么导致了错误“返回类型‘TableRow’不是‘Widget’,如方法‘build’所定义”

    我正在 Flutter Dart 创建一个应用程序 目前正在研究该应用程序的布局 我正在尝试创建一个标准的表格布局 它工作得很好 直到我想将代码外包到不同的文件中 此时 我创建了一个扩展 StatelessWidget 的类 它重写返回 T
  • Linux 上的系统调用实际上是如何发生的?

    受到这个问题的启发 如何强制GDB反汇编 https stackoverflow com questions 1237489 how can i force gdb to disassemble 和这个相关的 什么是 INT 21 小时 h
  • TFS 2010 构建质量更改后发布到 FTP

    当我更改 TFS 2010 中构建的质量 更改为生产质量 时 我希望将构建上传到远程服务器上的 FTP 站点 您知道有什么工具可以实现此目的吗 如果没有 对我自己如何做到这一点有什么建议吗 TFSDeployer 可能很有用 构建质量更改事
  • Activity 恢复时不恢复 ViewPager

    我的项目的设置如下 Activity has Fragment它有ViewPager提供的页面FragmentStatePagerAdapter 显示的数据由ViewPager是从网络获取的 When Activity被破坏并恢复 它试图恢
  • Visual Studio Code,pylint 抱怨“无法导入 XXX”

    我在用视觉工作室代码处理一个包含许多模块的大型 python 项目 My settings json看起来像这样 python linting pylintEnabled true python linting enabled true p
  • Webpack - NodeJS - 找不到模块:错误:无法解析“fs”

    使用 webpack 构建 nodejs 项目时出现以下错误 ERROR in node modules mime mime js Module not found Error Can t resolve fs in C Sample no
  • 平均值的最大值

    我应该得到每个部门的平均工资 并且只显示平均工资最高的部门 我想出了这个查询 但它不起作用 有人有一些想法吗 SELECT department max avg wage FROM employees GROUP BY department
  • 如何解析和简化像“3cm/μs² + 4e-4 sqmiles/km/h**2”这样的字符串,正确处理物理单位?

    我想像这样分割一个字符串3cm s 4e 4 sqmiles km h 2进入其SI unit https en wikipedia org wiki International System of Units 在这种情况下 m s 2 及