【问题标题】:Can python normalize array of objects?python可以规范化对象数组吗?
【发布时间】:2021-01-20 07:55:13
【问题描述】:

我正在为 Python 中的机器学习课程做作业。我昨天才开始学习python,所以我不知道python中使用的实践。

我的部分任务是从 csv(2D 数组)加载数据,我们称之为 arr_2d 并对其进行规范化。

我在网上找到了sklearnnumpy 解决方案,但他们希望输入二维数组。

我在加载 arr_2d 后的方法是将它们解析为对象数组 (data: [HealthRecord])。

我的解决方案是类似这样的代码(注意:有点伪代码)

result = [] # 2D array of property values
for key in ['age','height','weight',...]:
    tmp = list(map(lambda item: getattr(key, item), data))
    result.append(tmp)

结果现在包含 3 * data.length 项目,我将使用 sklearn 规范化我的 result 数组中的单行,然后将其旋转回来并解析规范化为 HealthRecord

我认为这过于复杂,我希望看到一个更简单的方法,例如将[HealthRecord] 发送到sklearn.normalize


下面的代码显示了我的(简化的)加载和解析:

class Person: 
    age: int
    height: int
    weight: int
    

def arr_2_obj(data: [[]]) -> Person:
    person = Person()
    person.age = data[0]
    person.height = data[1]
    person.weight = data[2]

    return person


# age (days), height (cm), weight (kg)
input = [
    [60*365, 125, 65],
    [30*365, 195, 125],
    [13*365, 116, 53],
    [16*365, 164, 84],
    [12*365, 125, 96],
    [10*365, 90, 46],    
]

parsed = []

for row in input:
    parsed.append(arr_2_obj(row))  

注意:Person 类是 HealthRecord

感谢您的任何意见或见解。

编辑:错字 sci-learn -> sklearn

【问题讨论】:

  • 我想补充一点,解析后的 CSV 的实际长度是 70000*13。此外,我正在将数据解析为类以便于操作。加载数据集后,我根据不正确或超出范围的值清理行并将文本值编码为数字。
  • 这能回答你的问题吗? How to normalize an array in NumPy?
  • @Joe 不,它没有。我知道您提到的线程,正如我在问题中所说,我正在寻找另一种方法。所述线程将二维数组视为输入,而我想传递对象数组进行规范化。

标签: python python-3.x


【解决方案1】:

你不能。在实践中,您正在处理表格数据。 python 中用于处理表格数据的标准(如在最流行的而非标准库中)包是pandas,因此您可以执行以下操作:

import pandas as pd
df = pd.DataFrame([d.__dict__ for d in data])
normalized_df = (df-df.mean())/df.std() # example normalization 

如果您坚持处理对象数组而不是表,您可以编写一个类来进行所需的转换以缩短符号,例如像

class ObjectList: 
    def __init__(self, object_type, records): 
        self.objects = [object_type(**record) for record in records]

    def to_data_frame(self): 
        return pd.DataFrame([d.__dict__ for d in self.objects])

class PersonList(ObjectList): 
    def __init__(self, records): 
        super().__init__(Person, records)

以上假设class Person 有一个__init__ 函数接受参数heightageweight

您还可以尝试通过重载运算符来进一步缩短符号,但除非您正在编写库代码,否则我不明白您为什么要这样做。

【讨论】:

  • 感谢您的帮助。我将“你不能”标记为正确答案。我已经将带有熊猫的 CSV 加载为DataFrame,但在我的 4MB csv(70000 行,13cols)上使用它需要更长的时间。你建议什么方法和结构?编辑:更长的时间我的意思是使用 DataFrame.values 而不是整个 DataFrame 更快
  • pandas.read_csv 是我知道在 python 中读取 csv 的最快方法(与 numpy 函数相反),之后它具体取决于您使用它进行的计算 - 通常用于机器学习您需要数字形式的数据,即作为 numpy ndarrays 或张量,您可能需要将分类字段转换为 1-hot 向量,消除您可能不会直接使用的字段,例如字符串等。无论如何,您需要一个最终用于计算的一堆矩阵。
猜你喜欢
  • 2019-10-03
  • 2018-01-27
  • 2019-01-05
  • 2017-06-15
  • 2021-05-31
  • 2020-05-04
  • 1970-01-01
  • 2018-11-26
  • 2013-04-22
相关资源
最近更新 更多