2015-11-12 4 views
8

したがって、numpy 1.8.2(Python 2.7.6)では配列の分割に問題があるようです。十分に大きな配列(少なくとも8192要素、複数の次元、データ型は無関係)をその一部でインプレース分割するとき、動作は異なる表記法では一貫しません。配列を分割するときにnumpyで予期しない動作が発生する

import numpy as np 
arr = np.random.rand(2, 5000) 
arr_copy = arr.copy() 
arr_copy = arr_copy/arr_copy[0] 
arr /= arr[0] 
print np.sum(arr != arr_copy), arr.size - np.sum(np.isclose(arr, arr_copy)) 

出力は2つの部門が一貫していなければならないとして、0であることが予想、それは1808で、これはバグですか?他のnumpyバージョンでも起こっていますか?

+2

この現象は、arr [0]がarrのビューに過ぎず、そのためインプレース操作中に変更されたという理由による可能性があると指摘しました。 – Dschoni

答えて

7

あなたが質問で示唆するように、それは実際にはバグではありません。

>>> np.setbufsize(8192*4) # sets new buffer size, returns current size 
8192 
>>> # same set up as in the question 
>>> np.sum(arr != arr_copy), arr.size - np.sum(np.isclose(arr, arr_copy)) 
(0, 0) 

をそして、あなたはコメントで状態として、これはもともとうまくいかない場合は、インプレース部門arr /= arr[0]は次のとおりです。(...今のところ)問題を取り除くバッファサイズを大きく設定します。 arrの最初の8192個の要素のみがバッファされ、arr[0]は単にarrの最初の行のビューです。

これは、最初の行のすべての値が正しく分割され、2番目の行もインデックス3192まで正しくなることを意味します。次に残りの1808の値がインプレース分割のバッファに入れられますが、最初の行はすでに変更されています:arr[0]は今や単に1行のビューであるため、後の列の値はちょうど1で除算されます。

関連する問題