gpt4 book ai didi

python - numpy 或 python 中的等效 matlab 函数 mod

转载 作者:太空狗 更新时间:2023-10-30 02:06:55 24 4
gpt4 key购买 nike

我正在将一些代码从 Matlab 转换为 Python。

在 matlab 中有函数 mod 给出模运算。

例如,以下示例显示了 matlab mod 和等效的 numpy remainder 操作之间的不同结果:

Matlab:

>> mod(6, 0.05)

ans =

0

NumPy 的:

np.remainder(6, 0.05) 
0.04999999999999967

np.mod(6, 0.05)
0.04999999999999967

Python 模数运算符给出与 numpy 相同的结果。

6%0.05
0.04999999999999967

python 中是否有任何东西可以提供与 Matlab 中相同的模运算?最好可以在 numpy 2d/3d 数组上操作。

numpy documentation表示 numpy.mod 等同于 matlab mod

最佳答案

这就是问题的核心,在python中:

>>> 6/0.05 == 120
True

>>> 6//0.05 == 120 # this is 119 instead
False

6/0.05 的浮点结果足够接近 120(即在 double 分辨率内),因此四舍五入为 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 会四舍五入到最接近的 double 字,这是120. 可以很容易地证明这两个数字在 double 内确实相同:

>>> print(6/Decimal('0.05') - 6/Decimal(0.05))
6.6613381478E-15

>>> 120 - 6.6613381478E-15 == 120
True

现在这是来自 MATLAB 的 help mod:

    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 之类的东西,但这意味着您应该完全放弃原生 double ,包括文字)并重现 MATLAB 的 以这种方式修改,假设这对您的用例有意义。

关于python - numpy 或 python 中的等效 matlab 函数 mod,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57085118/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com