Преобразование 2-Д массив строк, чтобы плавать в Python удаление научной нотации
Как я могу конвертировать научные обозначения в исходный формат, когда я использую numpy.тип в массиве X? Вот мой код:
with open ('outfile.csv', 'r') as infile:
reader = csv.reader(infile)
reader_list = list(reader)
reader_array = array(reader_list)
x = reader_array[:,5].astype(np.float)
#original array:
print reader_array[:,5]
#converted to float
print x
#original array:
['-0.00041955436132607246' '-0.00036612800229292086' '0.00022313364860991641' ..., '73.418371245304215' '73.417384428365267' '73.416718169781149']
#converted to float
[ -4.19554361e-04 -3.66128002e-04 2.23133649e-04 ..., 7.34183712e+01 7.34173844e+01 7.34167182e+01]
Чтобы быть более конкретным, я хочу преобразовать массив строк в floats, но сохранить тот же формат, что и исходный массив, и сделать некоторый анализ на нем:
#find row number of max value in column 1: (This piece works fine)
max_index = where(reader_array[:,1] == max(reader_array[:,1]))
#take last element in column 5: (This one is also fine)
total_ = (reader_array[(len(reader_array[:,5])-1),5])
#find row number where element in column 5 is equal to 0.1*total_: (here's the problem!)
0.1_index = where((reader_array[:,5]) == (total_)*0.1)
Поэтому я думаю, что изменение строк на floats, но с тем же форматом, что и исходный массив, позволяет умножать элементы массива на другой float (0.1 здесь).
Обратите внимание, что значение (0.1 * total_) может не совпадать ни с одним из значений строк в столбце 5, которые я должен решить. Но я не могу прогрессировать, не имея возможности сравнивать строки с (0.1*total_).
Я ценю, если кто-то может дать подсказку, как подойти, пожалуйста.
1 ответ:
Вы внутренне ограничены тем фактом, что числа с плавающей запятой хранятся с использованиемIEEE 754 . Вы не можете иметь произвольную точность плавающих точек, поэтому в вашем случае вы не можете ожидать, что они обязательно будут точно такими же, как и строковое представление.
Однако в вашем случае более насущной проблемой является то, что вы хотите сравнить строку с плавающей точкой, поэтому, конечно, они будут отличаться. Python динамически, носильно типизирован.Учитывая оба вышеизложенное указывает на то, что вам нужно лучше определить свою проблему. Зачем нужно сравнивать с массивом строк? (что это вообще значит!?)
Можете ли вы проверить близость, а не равенство, как только ваши типы данных отсортированы (например, с помощью
numpy.close
)?