2017-10-24 5 views
0

scipyとimread()を使用してRGBとしてイメージをインポートしました。 "R"コンポーネントを切り離して、メモリ内の新しいオブジェクトにコピーしたいとします。以下のコードは動作します:スライス表記でメモリに新しいコピーが作成されない

import scipy as sp 
import scipy.misc as misc 
import matplotlib.pyplot as plt 
%matplotlib inline 
pic = misc.imread("ARBITRARY IMAGE.png"); 

r = pic[:,:,0].copy() 
r[0,0] = 0 
print(r[0,0]) 
print(pic[0,0,0]) 

出力を期待:

0 
255 

は、しかし、私は次のパスでそこに着いた、と彼らは動作しない理由を私は知らない。

r = pic[:,:,0] 
r[0,0] = 0 
print(r[0,0]) 
print(pic[0,0,0]) 

出力:

0 
0 

フェアENOうわー、私はhereから構文キューを取り出し、それは単一の層の代わりにb = a[:]のようなスライスを使用することを伴います。どの程度:

r = pic[:] 
r[0,0,0] = 0 
print(r[0,0,0]) 
print(pic[0,0,0]) 

や余分なステップを追加する:

r = pic[:] 
r= r[:,:,0] 
r[0,0] = 0 
print(r[0,0]) 
print(pic[0,0,0]) 

はまだ出力:

0 
0 

それが配列でないリストが、配列のためthis answerは、この構文を暗示します大丈夫です。基本的に、私の例でスライス表記法を使用すると、新しいオブジェクトがメモリ内に作成されないのはどうですか?私は何か他のものが欠けていると仮定し、私のグーグルでは構文がうまくいくはずです。助けてくれてありがとう!

+0

変数 'pic'はおそらく通常の配列ではありませんが、コピーを作成しないオーバーロードされたスライス演算子を持つオブジェクトではなく、同じデータを参照するビューです。例えば。 numpyは、私が正しく覚えていれば、コピーの作成も好きではありません。 –

答えて

3

other question you linkedは誤った用語を使用します。 Python のリストはですが、あなたはNumpy配列を使用しています。リストをスライスすると、選択した範囲のコピーが得られますが、代わりにslicing an array gives you a viewとなります。ビューに加えた変更は、オリジナルに反映されます。

Numpyアレイでは、オリジナルに影響を与えずに変更できる別のコピーを取得するには、copy()を使用する必要があります。 Numpy配列は非常に大きく、誤ってコピーしたくないため、これは設計上の選択です。

+0

32ビットのPythonを使用している場合には注意してください。np.array.copyは高価な操作です。numpyは連続したメモリが必要です。 –

+0

@David Duh間違った用語を使用していると思わないと思います。 ジョラン、ここで私にとって必要なことではありませんが、代わりがありますか?または、私はそのような配列でコピーを作成しないようにしようとするべきですか – Mudbeard

関連する問題