首页 > 解决方案 > 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操作吗?最好可以在numpy2d/3d 阵列上操作。

numpy 文档说这numpy.mod相当于 matlab mod

标签: pythonmatlabnumpyfloating-point

解决方案


这是问题的核心,在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,假设这对您的用例有意义。


推荐阅读