Избегайте экспоненциальных значений в loadtxt

У меня есть csv файл с такими заголовками, как:

Учитывая этот test.csv файл:

"A","B","C","D","E","F","timestamp"
611.88243,9089.5601,5133.0,864.07514,1715.37476,765.22777,1.291111964948
611.88243,9089.5601,5133.0,864.07514,1715.37476,765.22777,1.291113113366
611.88243,9089.5601,5133.0,864.07514,1715.37476,765.22777,1.291120650486

Если я использую load.txt, я получаю массив с 3 строками и 7 столбцами со значениями exponential.

r1 = numpy.loadtxt(open("test.csv","rb"),delimiter=",",skiprows=1)

я получил

 [[  6.11882430e+02   9.08956010e+03   5.13300000e+03   8.64075140e+02
     1.71537476e+03   7.65227770e+02   1.29111196e+12]
  [  6.11882430e+02   9.08956010e+03   5.13300000e+03   8.64075140e+02
     1.71537476e+03   7.65227770e+02   1.29111311e+12]
  [  6.11882430e+02   9.08956010e+03   5.13300000e+03   8.64075140e+02
     1.71537476e+03   7.65227770e+02   1.29112065e+12]]

Чтобы избежать exponential, я использовал следующий код, но он все равно дает те же экспоненциальные значения. Мой код, чтобы избежать экспоненты:

 r1 = np.loadtxt(open("test.csv","rb"),delimiter=",", dtype=np.float64, skiprows=1)

Есть ли способ удалить exponential при создании матрицы numpy? Я знаю, что могу удалить значения позже с помощью numpy.savetxt(sys.stdout, r1, '%5.2f'), но я хочу, чтобы это происходило при создании матрицы, а не после создания.


person user2481422    schedule 10.06.2014    source источник
comment
611.88243 равно 6.11882430e + 02, учитывая проблемы, связанные с арифметикой с плавающей запятой). Разве вы не хотите читать значения? В противном случае, какого результата вы ищете? Кроме того, что вы хотите сделать с последним столбцом ввода, который уже находится в экспоненциальной записи (1.291111964948E12)?   -  person Joshua Taylor    schedule 10.06.2014
comment
Почему это имеет значение? Есть ли разница, кроме как они отображаются?   -  person Rob Watts    schedule 10.06.2014
comment
@JoshuaTaylor Смотрите мою правку, в файле csv не будет экспоненциального значения.   -  person user2481422    schedule 10.06.2014
comment
@RobWatts Да, я хочу, чтобы моя матрица выглядела просто   -  person user2481422    schedule 10.06.2014
comment
@ user2481422 Тогда вопрос только в том, как вы это распечатываете - с содержимым вашей матрицы все в порядке. stackoverflow.com/questions/2891790/ ответов как это сделать.   -  person Rob Watts    schedule 10.06.2014
comment
@ user2481422 Я вижу ваше изменение, но не вижу примера нужного вам результата.   -  person Joshua Taylor    schedule 10.06.2014
comment
@JoshuaTaylor Я считаю, что OP говорит, что даже когда на входе нет показателей, он все равно получает их, когда распечатывает массив.   -  person Rob Watts    schedule 10.06.2014
comment
Я думаю, что это тоже так, но я не уверен. На самом деле не должно быть так сложно скопировать вывод, который получает OP , отредактировать его в Блокноте и сказать, что это то, чего я пытаюсь достичь. Это устранило бы много двусмысленности.   -  person Joshua Taylor    schedule 10.06.2014


Ответы (1)


Я надеюсь, что комментарии к этому вопросу прояснят, что это чисто вопрос форматирования. Также в комментариях указано, что хорошее объяснение некоторых параметров форматирования для массивов numpy дает @unutbu здесь: Как красиво напечатать numpy.array без экспоненциальной записи и с заданной точностью?

Вариант, не показанный в этом ответе, - это использование аргумента formatter для np.set_printoptions. Аргумент был добавлен в set_printoptions в numpy версии 1.7.0. С помощью аргумента formatter вы можете контролировать, как numpy печатает элементы массивов. Вот пример использования этого аргумента для управления форматом чисел с плавающей запятой.

Вот как печатается a с настройками по умолчанию:

In [30]: a
Out[30]: 
array([[  6.11882430e+02,   9.08956010e+03,   5.13300000e+03,
          8.64075140e+02,   1.71537476e+03,   7.65227770e+02,
          1.29111196e+12],
       [  6.11882430e+02,   9.08956010e+03,   5.13300000e+03,
          8.64075140e+02,   1.71537476e+03,   7.65227770e+02,
          1.29111311e+12],
       [  6.11882430e+02,   9.08956010e+03,   5.13300000e+03,
          8.64075140e+02,   1.71537476e+03,   7.65227770e+02,
          1.29112065e+12]])

Теперь переопределите значение по умолчанию и скажите numpy преобразовать значения с плавающей запятой в строки, используя формат "%.5f". В этом формате не используется научная нотация, и он всегда будет показывать пять цифр после десятичной точки.

In [31]: np.set_printoptions(formatter={'float': lambda x: "%.5f" % (x,)})

In [32]: a
Out[32]: 
array([[611.88243, 9089.56010, 5133.00000, 864.07514, 1715.37476,
        765.22777, 1291111964948.00000],
       [611.88243, 9089.56010, 5133.00000, 864.07514, 1715.37476,
        765.22777, 1291113113366.00000],
       [611.88243, 9089.56010, 5133.00000, 864.07514, 1715.37476,
        765.22777, 1291120650486.00000]])

Вы можете добавить вызов rstrip для удаления конечных нулей:

In [53]: np.set_printoptions(formatter={'float': lambda x: ("%.5f" % (x,)).rstrip('0')})

In [54]: a
Out[54]: 
array([[611.88243, 9089.5601, 5133., 864.07514, 1715.37476, 765.22777,
        1291111964948.],
       [611.88243, 9089.5601, 5133., 864.07514, 1715.37476, 765.22777,
        1291113113366.],
       [611.88243, 9089.5601, 5133., 864.07514, 1715.37476, 765.22777,
        1291120650486.]])

Обратите внимание, что в приведенном выше примере я ввел имя в ipython, и оно вернуло свое значение. При таком использовании печатается repr-представление объекта. Вы получите str-представление, если вы его явно распечатаете:

In [55]: print(a)
[[611.88243 9089.5601 5133. 864.07514 1715.37476 765.22777 1291111964948.]
 [611.88243 9089.5601 5133. 864.07514 1715.37476 765.22777 1291113113366.]
 [611.88243 9089.5601 5133. 864.07514 1715.37476 765.22777 1291120650486.]]
person Warren Weckesser    schedule 10.06.2014
comment
Ваш ответ дает эту ошибку TypeError: set_printoptions() got an unexpected keyword argument 'formatter'. - person user2481422; 11.06.2014
comment
@ user2481422: аргумент formatter был добавлен в numpy 1.7.0 (github.com/numpy/numpy/blob/master/doc/release/). Какую версию ты используешь? - person Warren Weckesser; 11.06.2014