2011-12-16 4 views
0

Я написал эту функцию (которая используется позже для выбора элитных видов в генетическом алгоритме), чтобы выбрать k лучших значений из n, где не все n значений уникальны. Прежде всего, я бы очень оценил любые комментарии к коду, но в первую очередь меня беспокоит тот факт, что по какой-либо причине значения во втором векторе (var2) также равны 0. Если вместо массива я использую список, это не происходит, но, конечно, я хочу использовать массивы, а не списки! Поэтому любые комментарии приветствуютсязначения массива, установленного на 0

import numpy 

import tkMessageBox 


'v1 is the vector of values from which k best must be selected for maximization problems' 

class kbest(): 

    def val_report(self,k,v1): 
     n=len(v1); 
     v1=numpy.asarray(v1) 
     v2=numpy.zeros(k) 
     v2=numpy.asarray(v2,int) 
     if k>n: 
      self.trigger1() 
     else: 
      l=0; 
      while (l<k): 
       best_now=numpy.asarray(numpy.where(v1==max(v1)),int)[0,0] 
       v2[l]=best_now; 
       v1[best_now]=0 
       'v1=numpy.delete(v1, best_now)' 
       'print l,v2;' 
       l=l+1; 
     return v2 

    def trigger1(self): 
     tkMessageBox.showwarning('Wrong value','Select the correct value') 



var1=numpy.asarray(numpy.random.randint(0,100,10)); 

var2=var1 

var3=numpy.asarray([1,2,3,3,3,3,3,4,5,6,7,8,9]) 

elite=kbest().val_report(3, var1); 

print elite 

print var2 
+1

Формат вашего кода. –

+0

Здесь много ненужного материала. Я надеюсь, что кто-то еще ответит на ваш вопрос, но многие люди (например, я) не собираются читать что-то, что имеет ненужную сложность, такую ​​как код GUI, который не имеет никакого отношения к вашему вопросу или прокомментировал строки. Кодирование в соответствии с обычными стандартами Python также сделает это более полезным. См. [PEP 8] (http://www.python.org/dev/peps/pep-0008/). –

+0

sorted (v1) [- k:] – yurib

ответ

4

Вы просто давая var1 псевдоним var2. Оба они указывают на один и тот же контент.

Необходимо скопировать содержимое на новый объект.

In [1]: x = numpy.arange(5) 

In [2]: x 
Out[2]: array([0, 1, 2, 3, 4]) 

In [3]: y = x.copy() 

In [4]: x[:] = 0 

In [5]: x 
Out[5]: array([0, 0, 0, 0, 0]) 

In [6]: y 
Out[6]: array([0, 1, 2, 3, 4]) 
+0

Терминология здесь немного воинственная, но это точно проблема. –

Смежные вопросы