Arff Loader: AttributeError: объект 'dict' не имеет атрибутов 'data'

Я пытаюсь загрузить файл .arff в массив numpy, используя библиотеку liac-arff. (https://github.com/renatopp/liac-arff)

Это мой код.

import arff, numpy as np
dataset = arff.load(open('mydataset.arff', 'rb'))
data = np.array(dataset.data)

при выполнении, я получаю сообщение об ошибке.

ArffLoader.py", line 8, in <module>
data = np.array(dataset.data)
AttributeError: 'dict' object has no attribute 'data'

Я видел похожие потоки, Smartsheet Data Tracker: объект AttributeError: 'dict' не имеет атрибута 'append'. Я новичок в Python и не могу решить эту проблему. Как я могу это исправить?

Ответы

Ответ 1

Краткая версия

dataset является dict. Для dict вы получаете доступ к значениям, используя нотацию индексации python, dataset[key], где key может быть строкой, целым числом, float, кортежем или любым другим неизменяемым типом данных (это немного сложнее, чем это, ниже, если вы заинтересованы).

В вашем случае ключ находится в форме строки. Чтобы получить доступ к нему, вам нужно указать строку, которую вы хотите как индекс, например:

import arff
import numpy as np
dataset = arff.load(open('mydataset.arff', 'rb'))
data = np.array(dataset['data'])

(вы также не должны помещать импорт в одну строку, хотя это просто проблема чтения)

Более подробное объяснение

dataset - это dict, который на некоторых языках называется map или hashtable. В dict вы получаете доступ к значениям аналогично тому, как вы индексируете в списке или массиве, за исключением того, что "индекс" может быть любым типом данных, который является "хешируемым" (который, в идеале, является уникальным идентификатором для каждого возможного стоимость). Этот "индекс" называется "ключом". На практике, по крайней мере, для встроенных типов и большинства основных пакетов используются только неизменные типы данных или хешируемые, но нет фактического правила, которое требует, чтобы это имело место.

Вы пришли из MATLAB? Если да, то вы, вероятно, пытаетесь использовать технику доступа MATLAB's struct. Вы могли бы подумать о dict как о гораздо более быстром и гибком struct, но синтаксис для доступа к значениям отличается.