Я не понимаю, почему этот код не работает:
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) не выполняет его. Было бы здорово, если бы кто-нибудь объяснил мне это. Спасибо!
Используйте self.mean_zero() вместо self.x.mean_zero()






Вместо 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())
Я не уверен, что такое x из __init__, но очень вероятно, что вы действительно хотите вызвать mean_zero в new_calc в контексте переменной self (тот же объект):
def new_calc(self):
return self.mean_zero()
Вы инициализируете Normalizer с помощью «a», что является результатом np.random.randint, который возвращает объект numpy.ndarray.
В методе new_calc вы пытаетесь вызвать метод mean_zero объекта ndarray, но в ndarray такого метода нет. mean_zero является метод нормализатора, но self.x не относится к типу нормализатора.
Я не уверен, что должен делать этот код new_calc. Если вы можете сделать это яснее, я могу оказать больше помощи.
new_calc был просто упрощением для отладки того, что я на самом деле пытаюсь выполнить. Фактический код будет выглядеть так: def variance(self): return (np.sum((self.x.mean_zero()**2)))/ np.size(self.x)
Виновник:
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' object has no attribute 'mean_zero'
ndarray не имеет такого метода. mean_zero - это метод нормализатора
I don't understand why this code doesn't work:
если вы запустите следующий код, он выдаст ошибку:
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()
mean_zero - это метод класса. Вы не можете вызвать его с помощью переменной вашего класса.