2017-04-14 172 views
0

在下面的代码=,我试图计算的频率和一组向量总和(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] += this_data;,因为当我将其更改为sums[a_label] = 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[a_label] = this_data 

插入该查看到sums字典,并且该线突变,而不是通过创建一个新的对象,当对象是可变的。

+0

太棒了。 '总和[a_label] = np.copy(this_data)'它是。只要它让我接受,就会接受。 –