【问题标题】:Why is `to_numpy()` recognized as an attribute rather than a method of dataframe?为什么 `to_numpy()` 被识别为属性而不是数据框的方法?
【发布时间】:2021-02-01 03:54:14
【问题描述】:
import pandas as pd
import numpy as np

class CLF:
    Weights = 0
    
    def fit(DF_input, DF_output, eta=0.1, drop=1000):
        X, y = DF_input.to_numpy(copy=True), DF_output.to_numpy(copy=True)
        N,d = X.shape
        m = len(np.unique(y))   
        self.Weights = np.random.normal(0,1, size=(d,m))


INPUT = pd.read_csv(path_input)
OUTPUT = pd.read_csv(path_output)
clf = CLF()
clf.fit(INPUT, OUTPUT)

我为我编写的类定义了一个方法.fit()。第一步是将两个数据帧转换为 numpy 数组。但是,当我尝试使用该方法时出现以下错误,尽管 INPUT.to_numpy(copy=True)OUTPUT.to_numpy(copy=True) 都可以正常工作。有人可以帮我吗?为什么to_numpy 被识别为属性而不是数据帧方法

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-22-a3d455104534> in <module>
      1 clf = CLF()
----> 2 clf.fit(INPUT, OUTPUT)

<ipython-input-16-57babd738b2d> in fit(DF_input, DF_output, eta, drop)
      4 
      5     def fit(DF_input, DF_output, eta=0.1,drop=1000):
----> 6         X, y = DF_input.to_numpy(copy=True), DF_output.to_numpy(copy=True)
      7         N,d = X.shape
      8         m = len(np.unique(y))   # number of classes

AttributeError: 'CLF' object has no attribute 'to_numpy'

【问题讨论】:

  • 你的类方法fitCLF 不应该接收self 作为它的第一个参数吗?我认为python期望是一个接收自我的类方法,因此CLF认为DF_input它是自我,而CLF没有名为to_numpy的方法/属性(因为它是一个DataFrame方法)

标签: python pandas methods attributes numpy-ndarray


【解决方案1】:

实例方法是一种属性;这是一个更一般的错误消息,它键入 .(点)运算符,而不是解析到左括号来区分您的用法。

问题是您定义了一个实例方法fit,但将您的实例命名为DF_input。我认为您只是忘记了隐式实例参数的常用 self 命名。

【讨论】:

    【解决方案2】:

    您的问题是对象方法的第一个输入通常保留给self。正确的语法应该是:

    class CLF:
        Weights = 0
        
        # notice the `self`
        def fit(self, DF_input, DF_output, eta=0.1, drop=1000):
            X, y = DF_input.to_numpy(copy=True), DF_output.to_numpy(copy=True)
            N,d = X.shape
            m = len(np.unique(y))   
            self.Weights = np.random.normal(0,1, size=(d,m))
    
    
    INPUT = pd.read_csv(path_input)
    OUTPUT = pd.read_csv(path_output)
    clf = CLF()
    clf.fit(INPUT, OUTPUT)
    

    【讨论】:

    • 天哪,我不敢相信我错过了...谢谢!
    猜你喜欢
    • 2019-04-02
    • 2016-06-22
    • 2011-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-11
    相关资源
    最近更新 更多