如何在类中运行numpy登录

时间:2019-02-13 13:03:10

标签: python python-3.x numpy

我对编写python类真的很陌生。基本上,我正在尝试编写一个将在sklearn管道中使用的类。该类需要通过修改一些现有属性来向现有数据框添加两个属性。

  1. 新属性将是现有列的对数转换,并且
  2. 其他两个属性的乘积相乘。这是我所拥有的:

代码:

import BaseEstimator and TransformerMixIn
from sklearn.base import BaseEstimator, TransformerMixin

population_ix, A_PM10_ix, A_PM25_ix = 15, 2, 3

class CombinedAttributes(BaseEstimator, TransformerMixin):
    def __init__(self):
        pass
    def fit(self, X, y=None):
        return self
    def transform(self, X, y=None):
        log_pop = np.log(X[:,population_ix])
        pm = X[:, A_PM10_ix] * X[:,A_PM25_ix]
        return np.c_[X, log_pop, pm]

attr_adder = CombinedAttributes()
env_extra_attribs = attr_adder.transform(environment.values)

这是我收到的错误消息:

AttributeError                            Traceback (most recent call last)
<ipython-input-66-e138b3c2e517> in <module>()
      1 attr_adder = CombinedAttributes()
----> 2 env_extra_attribs = attr_adder.transform(environment.values)

<ipython-input-65-e4aac1c1930b> in transform(self, X, y)
     11         return self
     12     def transform(self, X, y=None):
---> 13         log_pop = np.log(X[:,population_ix])
     14         pm = X[:, A_PM10_ix] * X[:,A_PM25_ix]
     15         return np.c_[X, log_pop, pm]

AttributeError: 'float' object has no attribute 'log'</code>

我的问题是如何使对数转换在其中起作用。

此外,我也不确定100%如何在init def中包含pass语句。再说一次,这是全新的,我很难找到我能理解的教程。

感谢您的任何帮助

3 个答案:

答案 0 :(得分:1)

该错误消息基本上表明您试图调用.log()方法是一个float对象。由于您仅在对象np上执行此操作,因此我认为您不小心在某个地方覆盖了导入的模块np。您并未提供所有代码,尤其是没有MCVE,因此我只能猜测您可能在执行代码之前已分配了np

我建议您扫描代码中的此类行,或者以其他方式在问题中提供您的代码,或者创建一个显示问题的MCVE,以便我们重现。

答案 1 :(得分:1)

似乎您用float值“覆盖”了导入的numpy模块。 在您的代码中搜索类似的内容:

np = 5.4

或任何其他类型的np =。 另外,请确保您使用import numpy as np正确导入了numpy,并且不包括来自未知/自写模块的任何已加星标的导入,例如from module_name import *。 如果该模块中包含任何名为np的变量,则可能会“覆盖”您的numpy模块导入。

通常,您应避免使用from module_name import *导入模块。这几乎总是会引起麻烦。

答案 2 :(得分:0)

我怀疑函数内的environment.valuesX是对象dtype数组。

In [195]: x = np.array([1.2, 2.3], object)
In [196]: np.sqrt(x)
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-196-0b43c7e80401> in <module>()
----> 1 np.sqrt(x)

AttributeError: 'float' object has no attribute 'sqrt'
In [197]: (x+x)/2
Out[197]: array([1.2, 2.3], dtype=object)
In [198]: np.log(x)
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-198-de666c833898> in <module>()
----> 1 np.log(x)

AttributeError: 'float' object has no attribute 'log'

我在另一个最近的答案AttributeError: 'Series' object has no attribute 'sqrt'

中对此进行了详细说明