python - numpy或python中的等效matlab函数mod
问题描述
我正在将一些代码从 Matlab 转换为 Python。
在matlab中有一个函数mod
可以进行模运算。
例如,以下示例显示了 matlabmod
和等效 numpyremainder
操作之间的不同结果:
MATLAB:
>> mod(6, 0.05)
ans =
0
麻木:
np.remainder(6, 0.05)
0.04999999999999967
np.mod(6, 0.05)
0.04999999999999967
Python 模运算符给出与 numpy 相同的结果。
6%0.05
0.04999999999999967
python中有什么东西可以提供与Matlab中相同的mod操作吗?最好可以在numpy
2d/3d 阵列上操作。
numpy
文档说这numpy.mod
相当于 matlab mod
。
解决方案
这是问题的核心,在python中:
>>> 6/0.05 == 120
True
>>> 6//0.05 == 120 # this is 119 instead
False
的浮点结果6/0.05
足够接近 120(即在双精度分辨率范围内),它被舍入到 120.0。但是,它比 120 略小,因此显式地板除法会将该数字截断为 119,然后才能将其标准化为 120.0。
一些证明:
>>> from decimal import Decimal
... print(6/Decimal(0.05)) # exactly approximate
... print(6/Decimal('0.05')) # exact
119.9999999999999933386618522
1.2E+2
第一个数字是您首先得到6/0.05
的数字,但该数字119.9999999999999933386618522
会四舍五入到可以用双精度表示的最接近的数字,即 120。可以很容易地证明这两个数字在双精度范围内确实是相同的:
>>> print(6/Decimal('0.05') - 6/Decimal(0.05))
6.6613381478E-15
>>> 120 - 6.6613381478E-15 == 120
True
现在help mod
来自 MATLAB:
MOD(x,y) returns x - floor(x./y).*y if y ~= 0, carefully computed to
avoid rounding error. If y is not an integer and the quotient x./y is
within roundoff error of an integer, then n is that integer.
这表明当x/y
接近整数时,首先对其进行四舍五入,而不是像在 python 中那样被截断。所以 MATLAB 不遗余力地对浮点结果做一些魔术。
最简单的解决方案是自己对数字进行四舍五入(除非您可以使用类似的东西decimal.Decimal
,但这意味着您应该完全放弃本机双精度数,包括文字)并以mod
这种方式重现 MATLAB,假设这对您的用例有意义。
推荐阅读
- python - nfcpy python脚本打印UID
- sonarqube - 无法新建 sonarqube 用户
- ruby - 此模块方法优先级/查找顺序是否正确?
- random - 将拟合混合模型应用于新数据但没有随机效应数据
- javascript - 渲染后有没有办法用新数据更新径向(或圆形)条形图?
- mysql - MySQL Workbench -> 没有足够的权限查看客户端连接
- mysql - 具有相同数据库的 MySQL 多用户
- python - 合并两个不重叠的熊猫数据框列
- tensorflow - 在 Keras 层中重新采样时间序列
- html - Flexbox 布局问题 - Flipcard