#arrays #string #python-3.x #numpy #type-conversion
#массивы #строка #python-3.x #numpy #преобразование типов
Вопрос:
Я уже некоторое время использую Python 2.7 и недавно перешел на Python 3. Я уже обновил свой код по некоторым пунктам, но проблема, с которой я сталкиваюсь в настоящее время, вводит меня в заблуждение. Что я пытаюсь сделать, так это загрузить набор данных с помощью np.loadtxt. Поскольку эти данные также содержат строки, я импортирую полный массив в виде строки. Я хочу выполнить преобразования типов после, чтобы преобразовать некоторые записи в float. Это с треском проваливается, и я не понимаю, почему. Все, что я вижу, это то, что в Python 3 все строки получают префикс ‘b’, и у меня такое чувство, что это как-то связано с этим, но я не могу найти краткий ответ. Приведенный ниже код и ошибка.
filename = 'train.csv'
raw_data = open(filename, 'rb')
data = np.loadtxt(raw_data, delimiter=",", dtype = 'str')
dataset = data[1:,1:]
print(dataset)
original_data = dataset
test = float(dataset[0,0])
print(test)
Результат
[["b'60'" "b'RL'" "b'65'" ..., "b'WD'" "b'Normal'" "b'208500'"]
["b'20'" "b'RL'" "b'80'" ..., "b'WD'" "b'Normal'" "b'181500'"]
["b'60'" "b'RL'" "b'68'" ..., "b'WD'" "b'Normal'" "b'223500'"]
...,
["b'70'" "b'RL'" "b'66'" ..., "b'WD'" "b'Normal'" "b'266500'"]
["b'20'" "b'RL'" "b'68'" ..., "b'WD'" "b'Normal'" "b'142125'"]
["b'20'" "b'RL'" "b'75'" ..., "b'WD'" "b'Normal'" "b'147500'"]]
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-38-c154945cd6f1> in <module>()
5 print(dataset)
6 original_data = dataset
----> 7 test = float(dataset[0,0])
8 print(test)
ValueError: could not convert string to float: "b'60'"
Комментарии:
1. Привет, Sem, вам, вероятно, не обязательно открывать файл в первую очередь, но вы можете передать имя файла в loadtxt. Также вы можете попробовать numpy.genfromtxt, который более эффективен для синтаксического анализа данных. Помимо этого, можете ли вы предоставить пример строки из вашего файла данных?
2. Привет, dnalow, использование genfromtxt уже исправляет это. Спасибо за ваш комментарий! Ответ будет опубликован ниже. С уважением, Sem
Ответ №1:
Как было предложено dnalow, что-то идет не так при преобразовании типов, потому что я сначала открываю файл, а затем считываю из него. Решение состоит в том, чтобы не использовать open open(filename, ‘rb’) и np.loadtxt, а использовать np.genfromtxt. Код ниже.
filename = 'train.csv'
data = np.genfromtxt(filename, delimiter=",", dtype = 'str')
dataset = data[1:,1:]
print(dataset)
original_data = dataset
test = float(dataset[0,0])
print(test)
filename = 'train.csv'
data = np.genfromtxt(filename, delimiter=",", dtype = 'str')
dataset = data[1:,1:]
print(dataset)
original_data = dataset
test = float(dataset[0,0])
print(test)
Результат
[['60' 'RL' '65' ..., 'WD' 'Normal' '208500']
['20' 'RL' '80' ..., 'WD' 'Normal' '181500']
['60' 'RL' '68' ..., 'WD' 'Normal' '223500']
...,
['70' 'RL' '66' ..., 'WD' 'Normal' '266500']
['20' 'RL' '68' ..., 'WD' 'Normal' '142125']
['20' 'RL' '75' ..., 'WD' 'Normal' '147500']]
60.0
Комментарии:
1. кстати. вы также можете попробовать не указывать dtype. Я думаю, genfromtext попробует автоматическое преобразование типов и вернет структурированный массив. Однако использование структурированных массивов немного отличается от использования ndarrays, поэтому это может быть не то, что вы хотите.
2. Поэкспериментируйте с
dtype=None
; и прочитайте о структурированных массивах.