【问题标题】:unable to call function due to generator error由于生成器错误而无法调用函数
【发布时间】:2022-01-02 12:45:13
【问题描述】:

我是 python 新手。 这是我试图调用的一些基本代码

X, Y = load_data('./examples/data/scene')

这是功能代码

import numpy as np
import gzip
import pickle
import itertools as it
import os
import arff    # liac-arff
import xml.etree.ElementTree as ET
import pandas as pd

def load_data(dataset_path: str):
"""Dataset loading function for dataset downloaded from mulan.
"""
arff_filename = dataset_path + ".arff"
xml_filename = dataset_path + ".xml"
X, Y = load_arff(arff_filename, xml_filename)
return X, Y

def load_arff(arff_filename: str, xml_filename: str):
# read arff file
with open(arff_filename, "r") as fp:
    data = arff.load(fp)

# read xml file
tree = ET.parse(xml_filename)
root = tree.getroot()
label_list = []
for child in root:
    label_list.append(child.attrib["name"])
#for attr in range(len(data["attributes"])):
#   column_list = attr[0]
column_list = [attr[0] for attr in data["attributes"]]
feature_list = list(set(column_list) - set(label_list))

# build converters to convert nominal data to numerical data
converters = {}
for attr in data["attributes"]:
    if attr[1] == 'NUMERIC':
        pass
    elif isinstance(attr[1], list):
        converter = {}
        for e, cls in enumerate(attr[1]):
            converter[cls] = e
        converters[attr[0]] = converter
    else:
        raise NotImplementedError("attribute {} is not supported.".format(att[1]))
#print(converters, column_list, feature_list)

# ipdb.set_trace()
df = pd.DataFrame(data['data'], columns=column_list)
df.replace(converters, inplace=True)
# print "Read as sparse format"
# n_instance = len(data["data"])
# dense_data = np.zeros( (n_instance, len(feature)+len(label)), dtype=float)
# for i,instance in enumerate(data["data"]):
#     for sf in instance:
#         idx, val = sf.split(' ')
#         dense_data[i][int(idx)] = val
# data = dense_data

X = df[feature_list].values
Y = df[label_list].values
if Y.dtype != np.int:
    raise ValueError("Y is not int.")

return X, Y

def pairwise_hamming(Z, Y):
"""
Z and Y should be the same size 2-d matrix
"""
return -np.abs(Z - Y).mean(axis=1)


def pairwise_f1(Z, Y):
"""
Z and Y should be the same size 2-d matrix
"""
# calculate F1 by sum(2*y_i*h_i) / (sum(y_i) + sum(h_i))
Z = Z.astype(int)
Y = Y.astype(int)
up = 2*np.sum(Z & Y, axis=1).astype(float)
down1 = np.sum(Z, axis=1)
down2 = np.sum(Y, axis=1)

down = (down1 + down2)
down[down==0] = 1.
up[down==0] = 1.

#return up / (down1 + down2)
#assert np.all(up / (down1 + down2) == up/down) == True
return up / down

这是我尝试运行代码时遇到的错误

Traceback (most recent call last):
File "C:\Users\sambhav\Desktop\RethinkNet\examples\classification.py", line 63, in 
<module>
main()
File "C:\Users\sambhav\Desktop\RethinkNet\examples\classification.py", line 57, in main
CSRPE_example()
File "C:\Users\sambhav\Desktop\RethinkNet\examples\classification.py", line 25, in 
CSRPE_example
X, Y = load_data('./examples/data/scene')
File "C:\Users\sambhav\Desktop\RethinkNet\mlearn\utils\__init__.py", line 18, in 
load_data
X, Y = load_arff(arff_filename, xml_filename)
File "C:\Users\sambhav\Desktop\RethinkNet\mlearn\utils\__init__.py", line 34, in 
load_arff
column_list = [attr[0] for attr in data['attributes']]
TypeError: 'generator' object is not subscriptable

我无法弄清楚这一点,在这方面有什么帮助吗?
该文件的链接: https://drive.google.com/file/d/128tOss08QpU0txq49fbt2dADrX4Yacl8/view?usp=sharing

【问题讨论】:

  • 您的代码没有正确缩进,但我可以从您共享的内容中看出,arff.load(fp) 返回一个行生成器,但您以data['attributes'] 的身份访问它,这不起作用作为生成器是不可下标的。
  • 那么我该如何改变呢?我应该使用 arff.load 以外的其他函数吗?
  • 这是我发现的类似的东西,但我无法在这方面修改此功能。 stackoverflow.com/a/6288032

标签: python generator


【解决方案1】:

您似乎需要将生成器对象转换为字典/列表。

你可以这样做而不是column_list = [attr[0] for attr in data["attributes"]]

data_list=[]
for i in data:
    data_list.append(i)

然后用print(data_list)看看你得到什么类型的数据

【讨论】:

  • 我试过了,data = arff.load(open(arff_filename))。不幸的是得到了同样的错误:- 文件“C:\Users\sambhav\Desktop\RethinkNet\mlearn\utils_init_.py”,第 35 行,在 load_arff column_list = [attr[0] for attr in data["attributes"]] TypeError: 'generator' object is not subscriptable
  • 这仍然使用数据作为生成器
  • 你的缩进修复了吗?
  • 我认为 cmets 正试图让您自己解决这个问题,但关键是您必须将名为 data 的生成器转换为 dict 以便您可以下标,这与arff.load 的工作方式有关。我认为您在某处遗漏了重要的一步。
  • @Regretful 是的,缩进在代码中是正确的。我发布了指向 py 脚本的链接
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-15
  • 1970-01-01
  • 2013-04-06
  • 2019-04-24
  • 2011-02-22
  • 2022-07-06
相关资源
最近更新 更多