2017-01-31 3 views
0

У меня есть этот код:массив обновления вызывая различные методы в классе

class MyClass(): 

    def __init__(self, the_name, the_method): 
     self.the_name = the_name 
     self.the_method = the_method 

    def evaluation(self, the_name): 
     the_name = self.the_name 
     the_method = self.the_method 

     if the_method == 'A': 
      the_name = np.where(
        np.logical_or(
         the_name < themin, 
         the_name > themax), 
        the_name, self.replace(the_name) 
       ) 
     return the_name 

    def replace(self, the_name): 
     the_name = self.the_name 
     the_method = self.the_method 

     the_name[:] = 3333 
     return the_name 


the_method = 'A' 
themin = 30 
themax = 100 
the_name = np.array([1, 22, 36, 34, 49, 60, 79, 101, 124, 147]) 
theobj = MyClass(the_name, the_method).evaluation(the_name) 

print(the_name) 

Результат: [3333 3333 3333 3333 3333 3333 3333 3333 3333 3333]

Я первый проверки в методе оценки, если метод, который я хочу, это один (в данном примере метод A).

Затем, я хочу применить некоторые критерии. Если значение the_name is < themin or > themax, то оставьте конкретные элементы the_name такими, какие они есть.

Если это не так, позвоните по методу replace.

Но, я хочу, чтобы метод замены работал с обновленным the_name.

Прямо сейчас, результат неправильный.

Я хочу [1 22 3333 3333 3333 3333 3333 101 124 147] как результат.

---- Другое Senario -----------

Если у меня есть что-то вроде этого:

def evaluation(self, array): 

     if self.the_method == 'A': 

      if np.any(array < themin): 

       self.replace(array) 

     return array 

def replace(self, array): 
     return np.average(array) 

Итак, я хочу, чтобы вычислить среднее значение в целом массив.

ответ

1

Почему вы хотите использовать np.where? Вы можете просто заменить все элементы массива, которые подчиняются определенным условием, используя boolean indexing:

mask = np.logical_and(the_name >= themin, the_name <= themax) 
the_name[mask] = the_name.mean() # or 3333 

Если сделать трюк. Таким образом, полный код будет выглядеть следующим образом:

import numpy as np 

class MyClass(): 

    def __init__(self, the_name, the_method): 
     self.the_name = the_name 
     self.the_method = the_method 

    def evaluation(self, the_name): 
     the_name = self.the_name 
     the_method = self.the_method 

     if the_method == 'A': 
      mask = np.logical_and(the_name >= themin, the_name <= themax) 
      the_name[mask] = self.replace(the_name) 
      return the_name 

    def replace(self, the_name): 
     return the_name.mean() # or 3333? 


the_method = 'A' 
themin = 30 
themax = 100 
the_name = np.array([1, 22, 36, 34, 49, 60, 79, 101, 124, 147]) 
theobj = MyClass(the_name, the_method).evaluation(the_name) 

print(the_name) 

Результаты:

Для версии mean: [ 1 22 65 65 65 65 65 101 124 147]

Для версии 3333: [ 1 22 3333 3333 3333 3333 3333 101 124 147]

Я не уверен, является ли the_name = self.the_name в начало evaluation на самом деле делает то, что вы думаете о нем.

+0

. Если я хочу иметь значение для всего массива? Итак, имя_файла будет содержать среднее значение – George

+0

I'm не уверен, понимаю ли я то, что вы хотите. Я думал, что вы хотите заменить конкретные значения массива (между 'themin' и' themax') либо с 3333, либо с массивом, означающим '65.3', округляя до' 65', потому что у вас есть целочисленный массив. – jotasi

+0

Во втором senario в моем сообщении у меня просто есть условие. Если какое-либо значение в массиве George

2
class MyClass(): 

    def __init__(self, the_name, the_method): 
     self.the_name = the_name 
     self.the_method = the_method 

    def replace(self, item): 

     item = 3333 
     return item 

    def evaluation(self, array): 

     if self.the_method == 'A': 

      array = [self.replace(x) if ((x>themin)&(x<themax)) else x for x in array] 

     return array 

the_method = 'A' 
themin = 30 
themax = 100 
the_name = np.array([1, 22, 36, 34, 49, 60, 79, 101, 124, 147]) 
theobj = MyClass(the_name, the_method).evaluation(the_name) 

print(theobj) 

из:

[1, 22, 3333, 3333, 3333, 3333, 3333, 101, 124, 147] 

Надеется, что это помогает

+0

Спасибо за ответ.Но метод 'replace', который я хочу использовать, - это действие на' the_name'. (Я хочу обновить 'the_name', чтобы использовать его для других действий) – George

+0

, которые все еще выполняются с этим базовым кодом. просто получил несколько прав на редактирование. одна из проблем, как указал каскадер, заключалась в том, что вы заменили полный массив на 3333's – epattaro

+0

И что, если в функции replace я хочу вычислить среднее значение всего массива? Итак, замените массив его средним (numpy.average) ? Проверьте [здесь] (http://pastebin.com/k6kkmke5), например – George

0

Вопрос здесь в вашем методе замены. Линия the_name[:] = 3333 заменяла self.the_name на массив 3333. Если вы замените replace, чтобы вернуть массив той же длины, заполненный 3333, тогда ваш код теперь будет работать.

np.where будет выбрать 3333-х из этого массива, когда он выходит из строя логического или, как показано здесь в документации: https://docs.scipy.org/doc/numpy/reference/generated/numpy.where.html

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