2017-04-14 11 views
0

と、Iは、周波数とベクトルの集合の和(numpyのベクター)は+ = numpy.arrayオブジェクト変更次のコードでは、元のオブジェクト

def calculate_means_on(the_labels, the_data): 
    freq = dict(); 
    sums = dict(); 
    means = dict(); 
    total = 0; 
    for index, a_label in enumerate(the_labels): 
     this_data = the_data[index]; 
     if a_label not in freq: 
      freq[a_label] = 1; 
      sums[a_label] = this_data; 
     else: 
      freq[a_label] += 1; 
      sums[a_label] += this_data; 

と仮定the_data(numpyの 'の両方を計算しようとしていマトリックス ')は、元々ある:上記のコードを実行した後

[[ 1. 2. 4.] 
[ 1. 2. 4.] 
[ 2. 1. 1.] 
[ 2. 1. 1.] 
[ 1. 1. 1.]] 

the_dataになる:

[[ 3. 6. 12.] 
[ 1. 2. 4.] 
[ 7. 4. 4.] 
[ 2. 1. 1.] 
[ 1. 1. 1.]] 

これはなぜですか?私はそれをsums[a_label] = sums[a_label] + this_data;に変更すると、それが予想どおりに動作するように、sums[a_label] += this_data;という行に推測しました。すなわちthe_dataは変更されません。

+1

[こちら](http://stackoverflow.com/questions/12905338/python-difference-between-x-x1-and-x-1)を参照してください。 –

答えて

4

この行は:

this_data = the_data[index] 

the_dataの行のビューではなく、コピーを取ります。ビューは元の配列に裏打ちされ、ビューを変更すると元の配列に書き込まれます。

この行:操作により行うこと+=要求ので

sums[a_label] += this_data 

ビューを介して元の配列を変異させる、:sums辞書に表示

sums[a_label] = this_data 

挿入、このラインオブジェクトが変更可能な場合は、新しいオブジェクトを作成する代わりに、突然変異を使用します。

+0

驚くばかりです。 'sum [a_label] = np.copy(this_data)'です。それができるようになるとすぐに受け入れます。 –

関連する問題