Я хочу загрузить и обработать набор данных ионосферы UCI, доступный по этой ссылке.
Моя python программа загружает файл ionosphere.data, используя запрос get. Я храню данные в виде двоичного файла (поэтому я не уверен, что окончание .data все еще допустимо).
import requests
r = requests.get(url, stream=True)
chunkSize = 1024
with open("ionosphere.data", 'wb') as f:
for data in r.iter_content(chunkSize):
f.write(data)
Теперь, когда у меня есть данные, я хочу прочитать их и сохранить в массиве numpy:
with open(filePath, 'rb') as f:
data = f.read()
return np.frombuffer(data, dtype=np.uint8).reshape(351, 34)
На сайте UCI говорится, что данные хранятся действительные числа. Вот почему я даю dtype=np.uint8
. Кроме того, есть 351 экземпляр с 34 атрибутами в каждом. Однако, по-видимому, данные немного отличаются, так как при выполнении я получаю ошибку:
"ValueError: невозможно преобразовать массив размером 76467 в форму (351,35)"
Я действительно не понимаю Не знаю, почему мой массив имеет размер 76467. В файле 351 строка и 35 столбцов. Последний столбец содержит строку «g» для хороших и «b» для плохих данных. Интересно, что значения в столбцах с 1 по 34, однако, являются значениями от 0 до 1 (по крайней мере, когда я открываю ionosphere.data в notepad ++). Это говорит о том, что мой dtype не является целым числом. Я пытался изменить? dtype=np.float32
, но это выдает ошибку:
«ValueError: размер буфера должен быть кратным размеру элемента»
И, я думаю, я знаю, что не так: тип dtype является многомерным. Вероятно, плавающие в столбцах 1 - 34 и строка в столбце 35. Ну, это несколько проблематично c. Я могу хранить только значения одного и того же dtype в массиве numpy. Я мог бы хранить столбцы 1 - 34 в одном массиве и столбец 35 в другом. Но подходит ли для этого метод np.frombuffer
?