簡単な質問
Numpy を Matlab および Python のものと一致させることはできますround
か?
マトラブ 2013a:
>> round(-0.5)
ans =
-1
Python (Numpy 配列、またはスカラーのみを使用、同じ結果):
>>> import numpy
>>> round(numpy.array(-0.5))
-1.0
でこぼこ、奇妙なもの:
>>> 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 とは異なる結果が得られたことに驚きました。
マトラブ:
>> 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
パイソン:
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)
実際には、Python と Matlab が異なる 1231 のサンプル (合計 73113 のうち) があります。私は自分の型に注意を払っていると思いますが、実際には、ここに忍び寄る型バグのエラー面はほとんどありません: loadmat
MAT ファイルから型を推測する必要があり、int16 は 2 つのシステム間でそれほど異なることはありません。
追加interp
/コマンドの出力の最初の要素interp1d
は両方とも -0.5 (Python と Matlab の両方で小数点以下 100 位まで出力するとこれが確認されます) ですが、Numpy ( np.round
) で丸めると 0 になり、Matlab は -1 に丸めます。これはMatlabの丸めセマンティクスの問題ですか? さらにround
、-0.5 に対するPython の組み込みの非 Numpyは、-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