2016-12-18 4 views
2

以下の例は私にとって奇妙です。配列acは異なりますが、aの最初の要素を変更すると、cの最初の要素も同様に変更されます。なぜnumpyアレイはこのように実装されていますか? aがリストとして割り当てられている場合、aの最初の要素を変更しても、cの最初の要素は変更されません。 numpy配列の振る舞いが望まれる例は考えられません。numpy配列の変わったコピー構成

import numpy as np 

a = np.arange(3,5) 
#a = [3, 4] 
b = a 
c = a[:] 
d = a.copy() 

print(a is b) # True 
print(a is c) # False 
print(a is d) # False 

print(a, b, c, d) #[3 4] [3 4] [3 4] [3 4] 

a[0] = -11. 

print(a, b, c, d) #[-11 4] [-11 4] [-11 4] [3 4] HUH?! 
+0

'a [:]'はリストと配列では異なります。 '__getitem__'インデックス方法は異なっています。 – hpaulj

答えて

3

シンプルnumpyのスライスは、ビュー、ないコピーを返します。名前が示すように、ビューは異なるデータで表される同じデータによってバックアップされます。これは、スライスするたびにデータのコピーを作成する必要がないため、Numpyを非常に高速にする機能の一部です。

the docsを参照してください。

c=a[:]が役に立つと思われる理由は考えられませんが、c=a[::2]が役に立ちます。私は他のすべての要素の平均を取得し、その平均でそれらを増加させるとしましょう。

a=np.random.random(10) 
b=a[::2] 
b+=b.mean() 
print a 

ビューの代わりにコピーを返す特別なケースはありません。実際、Numpyスライスの仕組みに精通している人にとっては、直感的ではないでしょう。

+0

'c = a [:]'タイプの割り当てが望まれる例を思いつくことができますか? – Chiel

+0

@Chielすべてのelemsを何かに変更したい場所は、 'a [:] = something'です。この形式を取ると、 'c = a [:]'の後に 'c = something'となるでしょう。 – Divakar

+0

@Divakarこれは逆の例です。 – Chiel

関連する問題