gpt4 book ai didi

python - Matlab和Numpy与Python的 `round`函数的区别

转载 作者:太空狗 更新时间:2023-10-30 01:22:47 34 4
gpt4 key购买 nike

简化问题

我可以让 Numpy 同意 Matlab 和 Python 的 round 吗?

Matlab 2013a:

>> round(-0.5)
ans =
-1

Python(使用 Numpy 数组,或仅使用标量,结果相同):

>>> import numpy
>>> round(numpy.array(-0.5))
-1.0

Numpy,奇数出局:

>>> import numpy
>>> numpy.round(numpy.array(-0.5))
-0

这种差异是否取决于回合平台?

原始问题

Matlab 附带一个包含一些音频数据的文件“handel.mat”:

>> which handel.mat
C:\Program Files\MATLAB\R2013a\toolbox\matlab\audiovideo\handel.mat
>> load handel
>> soundsc(y) % play the short audio clip

我想在 Python 中处理这些数据,所以我使用 scipy.io.loadmat [1]。具体来说,我想缩放音频值以跨越整个 16 位有符号整数范围,即音频信号的最小值映射到 -2^15,最大的值映射到 2^15-1。当我在 Matlab 中执行此操作时得到与 Python 不同的结果时,我感到很惊讶:

Matlab:

>> load handel
>> int16(round(interp1([min(y), max(y)], [-2^15, 2^15-1], y(1:10))))
ans =
-1 %%% <-- Different from Python
-253
-3074
-1277
252
1560
772
-1025
-1277
-3074

python :

In [1]: import numpy as np

In [2]: import scipy.io as io

In [3]: mat = io.loadmat('handel.mat')

In [4]: np.int16(np.round(np.interp(mat['y'][:10], [mat['y'].min(), mat['y'].max()], [-2.0**15, 2.0**15-1.0])))
Out[4]:
array([[ 0], ### <-- Different from Matlab
[ -253],
[-3074],
[-1277],
[ 252],
[ 1560],
[ 772],
[-1025],
[-1277],
[-3074]], dtype=int16)

实际上有 1231 个样本(总共 73113 个样本)Python 和 Matlab 不同。我想我对我的类型很小心,但实际上,类型错误在这里蔓延的错误面非常小:loadmat 应该从 MAT 文件推断类型,而 int16 不能不同两个系统之间的差距。

新增 interp/interp1d 命令输出的第一个元素都是-0.5(打印到小数点后100位) Python 和 Matlab 都证实了这一点),但在 Numpy (np.round) 中四舍五入得到 0,而 Matlab 将其四舍五入为 -1。这是 Matlab 舍入语义的问题吗? 此外 Python 的内置非 Numpy round for -0.5 给了我 -1! Numpy 和 Python 的 round 函数之间的差异从何而来? Python 的 round 是否总是与 Matlab 的匹配?

Windows64、Matlab 8.1 (2013a)、Python 2.7.4。

[1] http://docs.scipy.org/doc/scipy/reference/generated/scipy.io.loadmat.html

最佳答案

我认为您可以利用 numpy.vectorize 使用标准 python round 函数创建自定义 numpy round 函数:

>>> import numpy as np
>>> myround = np.vectorize(lambda x: round(x))
>>> a = np.array([-0.5, 0.5, -1.5, 1.5, -2.5, 2.5, 3.5, -3.5])
>>> print myround(a)
[-1. 1. -2. 2. -3. 3. 4. -4.]

这与显示 Matlab 的结果相同:

>> a = [-1.  1. -2.  2. -3.  3.  4. -4.];
>> round(a)
ans =
-1 1 -2 2 -3 3 4 -4

关于python - Matlab和Numpy与Python的 `round`函数的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18982650/

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