Numpy преобразует научную запись в Nan при чтении CSV - PullRequest
0 голосов
/ 20 сентября 2018

Я столкнулся с проблемой при чтении файла 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

Ответы [ 3 ]

0 голосов
/ 20 сентября 2018

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

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]])
0 голосов
/ 20 сентября 2018

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

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.

0 голосов
/ 20 сентября 2018

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

РЕДАКТИРОВАТЬ: Проблема в том, что есть и запятые, такие как 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)

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

...