2015-11-04 3 views
45

numpyオブジェクトがビューであるかどうかを確実に識別する方法を探します。numpy:numpy配列がビューの場合は、信頼できる(非保守的)インジケータ

関連の質問は(hereherehere)の前に何度も出ている、と人々は、いくつかのソリューションを提供してきましたが、すべての問題を持っているように見える:

  • pandasで使用されるテストは、何かを呼び出すことですビューの場合はmy_array.base is not Noneです。これはいつもビューを捕まえるように見えるだけでなく、誤ったポジティブなものもたくさんあります。
  • numpy.may_share_memory()は(?@RobertKurnは2012年のように最適なツールだったと言い - すべての変更)の2つの特定の配列をチェックしますが、一般的に
    • に答えています
  • flags['OWNDATA'])をして失敗するreported (third comment first answer)ですある場合。あなたの用法に応じて、

(私の興味の理由は、私はパンダのためのコピー・オン・ライトの実装に取り​​組んでいる、と保守的な指標は過コピーにつながっているということです。)

+4

numpy github trackerに関する適切なディスカッション:https://github.com/numpy/numpy/issues/5604 –

+3

偽陽性として記述された状況は、「コピーを作成する」操作が実際にコピー。これを "ビューではない"と見なす場合は、配列の 'base'の参照数をチェックして他の参照があるかどうかを調べることもできますが、完全ではありません。私はこの種のものを確実に検出することは可能ではないと思う。 – user2357112

+6

また、この最近のSOの質問、http://stackoverflow.com/questions/33467477/how-to-find-all-variables-with-identical-idを参照してください。新しい関数 'np.shares_memory'が書かれています。しかし、私は2つの既知の変数を比較することが1つあり、配列はデータバッファを他の配列と共有していることを尋ねることがあります。 – hpaulj

答えて

1

flags['OWNDATA']仕事をするだろう。 実際、あなたのリンクに問題はありません。 場合によっては失敗しません。それはいつもやるべきことをするでしょう。

http://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.require.htmlによると、フラグは「独自のデータを所有する配列を確保する」というフラグです。それは第二の場合に真であることが正常な動作です、

print (b.flags['OWNDATA']) #False -- apparently this is a view 
e = np.ravel(b[:, 2]) 
print (e.flags['OWNDATA']) #True -- Apparently this is a new numpy object. 

しかし:あなたの「反例」で

は、彼らがコードを使用しています。

ravelhttp://docs.scipy.org/doc/numpy-1.10.1/reference/generated/numpy.ravel.html)の定義に由来します。

連続したフラットな配列を返します。 入力の要素を含む1次元配列が返されます。コピーは必要な場合にのみ作成されます。

ここではコピーが必要です。コピーが作成されます。したがって、変数eは実際には独自のデータを所有しています。それは "bのビュー"、 "bへの参照"、 "bの一部へのエイリアス"ではありません。それはbのいくつかの要素のコピーを含む本当の新しい配列です。

だから、その種の動作を検出するためにデータの起源全体を追跡することは不可能だと私は思う。。私はあなたがその旗であなたのプログラムを構築できるはずだと信じています。

関連する問題