为了账号安全,请及时绑定邮箱和手机立即绑定

Numpy 在读取 CSV 时将科学记数法转换为 nan

Numpy 在读取 CSV 时将科学记数法转换为 nan

慕哥6287543 2021-06-09 17:46:24
我在使用 np.genfromtxt 读取 CSV 文件时遇到问题。CSV 中的所有记录都采用科学计数法,但在使用 np.genfromtxt 读取文件时,数组中的每个项目都是“nan”。来自 CSV 的示例行:1.02E+02;1.64E+00In [1]: read = np.genfromtxt('13G-mapa-0001.CSV', delimiter=';')In [2]: readOut[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 回答

?
HUWWW

TA贡献1874条经验 获得超12个赞

您的分隔符必须是逗号 ',' 而不是分号 ';'


编辑:问题是也有逗号,例如 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)

这是我的解决方案


查看完整回答
反对 回复 2021-06-22
?
忽然笑

TA贡献1806条经验 获得超5个赞

您可以执行以下操作来转换逗号小数:


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]])


查看完整回答
反对 回复 2021-06-22
  • 3 回答
  • 0 关注
  • 216 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号