5

簡単な質問

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 のうち) があります。私は自分の型に注意を払っていると思いますが、実際には、ここに忍び寄る型バグのエラー面はほとんどありません: loadmatMAT ファイルから型を推測する必要があり、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

4

2 に答える 2