Я столкнулся с проблемой при чтении 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
Современный, быстрый и универсальный способ сделать это обеспечивается пандами:
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
.
ваш разделитель должен быть запятой, а не точкой с запятой;
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)
Это мое решение
На основе этого ответа вы можете сделать следующее для преобразования десятичной запятой:
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]])
array([102. , 1.64])
)