- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我想将 3cm/µs² + 4e-4 sqmiles/km/h**2
这样的字符串拆分成它的 SI unit (在本例中,m/s**2
)及其大小(以该单位的倍数表示)。
因为 sympy 提供了 parsing module和 many physical units and SI prefixes ,我想使用 sympy 是个好主意。但是实现这一目标的好方法是什么?我会编写如下算法,但我想避免重新发明方轮:
4e-4
类语法除外)和空格(除非它紧挨着显式运算符)之间的转换视为乘法,然后标记化Magnitude * some SI units
(在单位不一致时给出有意义的错误消息,例如 Cannot add m**2 to s
)<这可以通过现有手段轻松实现吗?或者如何最好地实现?
最佳答案
一个解决方案是从 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 支持做出任何 promise 。
如果您实现新的 Unit
,请考虑在 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)
sympify
使用 eval
如果您打算将它用于面向网络的应用程序,则可以利用它!
关于python - 如何解析和简化像 '3cm/µs² + 4e-4 sqmiles/km/h**2' 这样正确处理物理单位的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15895819/
这是 mysql 数据库中的纬度和经度示例 ID | Lat | Lon 1 | 3.1412 | 101.6865 2 | 1.2897 | 103.8501 下面的公式计算两个 Lat(
我正在使用 survival 包进行 Kaplan Meier 分析,需要在 Kaplan Meier 图中显示特定时间段内幸存者的具体数量。 为了更好的可追溯性,我们使用示例包 KMsurv: li
使用 scipy.KDTree 进行一些快速的最近邻搜索。我正在使用 KDTree.query_ball_point(pnt, r=some_distance) 进行搜索。 因为我的点是纬度,所以要搜
当我使用 Maven 部署 openkm 应用程序时,我遇到了这个问题: [INFO] BUILD FAILURE [INFO] -----------------------------------
我正在尝试编写一个非常简单的程序,它以公里为单位打印到任何行星的当前距离。我正在使用天域。这是我的火星代码: from skyfield.api import earth, mars, now ra,
我用小数点得到了经纬度的点。该点以圆为中心,圆的半径为x公里。如何找到圆圈内的所有经纬度? 最佳答案 可能最简单的答案是使用毕达哥拉斯。 你得到一个点 (x,y),它是半径为 r 的圆的中心。 '如何
在我的健康应用程序中显示距离为 0.1 公里,但在我的应用程序中它给出的值为 0.106。我怎样才能把它改成十进制?这是我用来获取当前统计信息的代码: pedometer.queryPedometer
使用地理工具是否可以在定义的距离内从一条线(坐标[])生成多边形?例如。 (100,100)、(101,100)、(102,100),距离 1 公里。因此,它从每个点生成一个圆并成为某物。像: ---
我的数据库有各种兴趣点。我希望用户根据他们的位置看到他们。还有3个按钮,显示2km/5km/15km半径内的兴趣点。我无法对这些半径实现放大功能。所以我正在寻找缩放系数(从 2 到 21)和物理距离(
问候。 我看过一些关于这个主题的帖子和答案,但我认为给出的结果可能不太准确。 假设我在 MySQL 空间表中有具有不同经度和纬度点的行。我只想用一个简单的 SELECT 查询来检索它们之间的距离。我尝
定义: O(kM(n)):- modular exponentiation 的计算复杂度 其中k是指数位数,n是位数,M(n)是Newton's division algorithm的计算复杂度。 我
我是 Objective-C 的新手,希望在将 MPS 转换为 KPH 方面得到一些帮助。 以下是我当前的速度字符串。有人可以指出还需要什么吗? speed.text = newLocation.sp
我想实现两个 user-defined literals , _kmh 代表公里每小时,_ms 代表米每秒。我已经有两个结构和运算符“”函数: constexpr KMH operator "" _m
我尝试获取 mariaDB 中两点之间的近似距离。 我使用该 SQL: SELECT st_distance(POINT(50.6333,3.0667),p) from p 它输出的结果例如: 0 1
我需要帮助连接不同距离数字的 KM 范围内的两个表。范围不同,我需要将功能 1 与功能 2 和 3 结合使用。 所以我需要一个范围连接,但不知道如何解决这个问题。特征 2 和 3 可能存在于特征 1
MKMapView 显示以英里 (mi) 为单位的距离刻度(左上角)这有办法以公里 (km) 显示所有距离吗? 最佳答案 回答我自己的问题。 区域设置决定了要使用的度量。 我在我的模拟器上获得了里程,
我给出了带有经度和纬度的坐标列表。 [[-8.610876000000001, 41.14557], [-8.610858, 41.145579000000005], [-8.610903, 41.1
我目前有这个设置,我很想在计算距离时从 Km 更改为 Miles。这是我当前的代码: CLLocation *userloc = [[CLLocation alloc] initWithLatitud
我目前正在开发一个基于 map 的 iPhone 应用程序,希望向用户显示一些信息。对于我的应用程序,具有某种设置是有意义的,用户可以在其中选择英里或公里。是否有一种内置机制(可能类似于字符串本地化)
两周后,我将参加一项人们必须在荷兰乘坐火车旅行最多公里数的比赛。每个人都有 24 小时的旅行时间,旅行距离最长的人获胜。但是,您只能沿着每个“路段”旅行一次。例如,如果您从鹿特丹旅行到阿姆斯特丹,然后
我是一名优秀的程序员,十分优秀!