Класс Python, вызывающий другой метод - PullRequest
0 голосов
/ 01 февраля 2019

Я не понимаю, почему этот код не работает:

import numpy as np 

class Normalizer:
    def __init__(self,x):
        self.x = x 
    def mean(self):
        return np.sum(self.x)/np.size(self.x)
    def mean_zero(self):
        return self.x - self.x.mean()
    def new_calc(self):
        return self.x.mean_zero()

    a = np.random.randint(150,200,(5,8))

    heights = Normalizer(a)


    print(a)
    print(heights.mean()) 
    print(heights.mean_zero())
    print(heights.mean_zero().mean())
    print(heights.new_calc())

Он выполняет heghts.mean_zero() правильно, но в методе def new_calc(self) он не выполняет его.Было бы здорово, если бы кто-то мог мне это объяснить.Спасибо!

Ответы [ 5 ]

0 голосов
/ 01 февраля 2019

Я не понимаю, почему этот код не работает:

, если вы запустите следующий код, он выдаст ошибку:

AttributeError: 'numpy.ndarray' object has no attribute 'mean_zero'
  • найдите проблему, единственное место, где был вызван mean_zero, это метод new_calc.Итак, первый шаг сделан.

  • проанализируйте, если вы посмотрите на класс Normalize, он имеет один атрибут x, который имеет тип numpy.ndarray.Если вы внимательно прочитали сообщение об ошибке, это говорит о том, что тип ndarray не имеет атрибута mean_zero.С другой стороны, у вас есть метод mean_zero, определенный в вашем классе, и это тот, который вы должны вызывать.

Эти два шага приводят к выводу, что проблема в методе new_calc:

def new_calc(self):
    return self.mean_zero() #(wrong)return self.x.mean_zero()
0 голосов
/ 01 февраля 2019

Преступник:

def new_calc(self):
        return self.x.mean_zero()

Причина:

self.x является атрибутом класса Normalizer.Так что если heights является экземпляром класса Normalizer, то heights.x является self.x.

Ответ:

def new_calc(self):
        return self.mean_zero()

Обоснование:

AttributeError: объект 'numpy.ndarray'не имеет атрибута "mean_zero"

ndarray не имеет такого метода.mean_zero - метод нормализатора

0 голосов
/ 01 февраля 2019

Я не уверен, что такое x из __init__, но очень вероятно, что вы действительно хотите вызвать mean_zero в new_calc в контексте переменной self (тот же объект):

def new_calc(self):
        return self.mean_zero()
0 голосов
/ 01 февраля 2019

Вы инициализируете Normalizer с помощью 'a', который является выводом np.random.randint, который возвращает объект numpy.ndarray.

В методе new_calc вы пытаетесь вызвать метод mean_zeroобъекта ndarray, но у ndarray нет такого метода.mean_zero - это метод в нормализаторе, но self.x не относится к типу Normalizer.

Я не уверен, что этот код new_calc должен делать.Если вы сможете сделать это более ясным, я смогу оказать дополнительную помощь.

0 голосов
/ 01 февраля 2019

Записано в self.x.mean_zero () и запишите self.mean_zero ()

import numpy as np 

class Normalizer:
   def __init__(self,x):
       self.x = x 
   def mean(self):
       return np.sum(self.x)/np.size(self.x)
   def mean_zero(self):
       return self.x - self.mean()
   def new_calc(self):
       return self.mean_zero()

a = np.random.randint(150,200,(5,8))

heights = Normalizer(a)


print(a)
print(heights.mean()) 
print(heights.mean_zero())
print(heights.mean_zero().mean())
print(heights.new_calc())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...