Преобразование 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 2

1 ответ:

Вы внутренне ограничены тем фактом, что числа с плавающей запятой хранятся с использованиемIEEE 754 . Вы не можете иметь произвольную точность плавающих точек, поэтому в вашем случае вы не можете ожидать, что они обязательно будут точно такими же, как и строковое представление.

Однако в вашем случае более насущной проблемой является то, что вы хотите сравнить строку с плавающей точкой, поэтому, конечно, они будут отличаться. Python динамически, носильно типизирован.

Учитывая оба вышеизложенное указывает на то, что вам нужно лучше определить свою проблему. Зачем нужно сравнивать с массивом строк? (что это вообще значит!?)

Можете ли вы проверить близость, а не равенство, как только ваши типы данных отсортированы (например, с помощью numpy.close)?