Numpy преобразует научную запись в Nan при чтении CSV

1

Я столкнулся с проблемой при чтении CSV файла с помощью np.genfromtxt. Все записи в CSV находятся в научной нотации, но при чтении файла с np.genfromtxt каждый элемент в массиве - "nan".

Пример строки из CSV: 1.02E + 02; 1.64E + 00

In [1]: read = np.genfromtxt('13G-mapa-0001.CSV', delimiter=';')
In [2]: read
Out[2]:
array([[nan, nan],
   [nan, nan],
   [nan, nan],
   ...,
   [nan, nan],
   [nan, nan],
   [nan, nan]])

Полный файл:

1,204619e+002;1,639486e+000 
1,214262e+002;1,623145e+000 
1,223904e+002;1,607553e+000 
1,233547e+002;1,592153e+000 
1,243189e+002;1,576472e+000 
1,252832e+002;1,560220e+000 
1,262474e+002;1,543355e+000 
1,272117e+002;1,526069e+000 
1,281759e+002;1,508706e+000 
1,291402e+002;1,491635e+000 
1,301044e+002;1,475144e+000 
1,310686e+002;1,459387e+000 
1,320329e+002;1,444416e+000
  • 0
    Невозможно воспроизвести, используя csv только с вашей строкой примера, это работает (возвращает: array([102. , 1.64]) )
  • 1
    пожалуйста, вы можете добавить файл к вашему вопросу. Это поможет другим в будущем.
Теги:
numpy
scipy
nan

3 ответа

1

Современный, быстрый и универсальный способ сделать это обеспечивается пандами:

import pandas as pd
table=pd.read_csv('data.csv',sep=';',decimal=',',header=None)
arr=table.values

за

array([[ 120.4619  ,    1.639486],
       [ 121.4262  ,    1.623145],
       [ 122.3904  ,    1.607553],
       [ 123.3547  ,    1.592153],
       [ 124.3189  ,    1.576472],
       [ 125.2832  ,    1.56022 ],
       [ 126.2474  ,    1.543355],
       [ 127.2117  ,    1.526069],
       [ 128.1759  ,    1.508706],
       [ 129.1402  ,    1.491635],
       [ 130.1044  ,    1.475144],
       [ 131.0686  ,    1.459387],
       [ 132.0329  ,    1.444416]])

read_csv предлагает более высокие параметры, чем genfromtxt.

1

ваш разделитель должен быть запятой, а не точкой с запятой;

EDIT: Проблема в том, что есть также запятые, такие как 1,25e + 00, которые необходимо разобрать отдельно

def genfromtxt(file):
  from io import BytesIO
  with open(file, 'r') as f:
    lines = ' '.join([s.replace(',', '.') for s in f.readlines()])
  return np.genfromtxt(BytesIO(lines.encode('utf-8')), delimiter=';', dtype=np.float32)

Это мое решение

  • 0
    Я не думаю, что это правда. stackoverflow.com/questions/10140999/...
  • 0
    Да, я только что заметил, что это приводит меня к другой проблеме, есть ли способ преобразовать каждую кому в точку в чтениях, сделанных genfromtxt?
1

На основе этого ответа вы можете сделать следующее для преобразования десятичной запятой:

def conv(x):
    return x.replace(',', '.').encode()

read = np.genfromtxt((conv(x) for x in open("x.csv")), delimiter=';')

>>> read
array([[120.4619  ,   1.639486],
       [121.4262  ,   1.623145],
       [122.3904  ,   1.607553],
       [123.3547  ,   1.592153],
       [124.3189  ,   1.576472],
       [125.2832  ,   1.56022 ],
       [126.2474  ,   1.543355],
       [127.2117  ,   1.526069],
       [128.1759  ,   1.508706],
       [129.1402  ,   1.491635],
       [130.1044  ,   1.475144],
       [131.0686  ,   1.459387],
       [132.0329  ,   1.444416]])

Ещё вопросы

Сообщество Overcoder
Наверх
Меню