【问题标题】:numpy genfromtxt reading first value of csv as missing?numpy genfromtxt 读取 csv 的第一个值是否丢失?
【发布时间】:2019-09-27 16:06:10
【问题描述】:

我正在尝试使用 numpy 的 genfromtxt 将 csv 的键长和能量读取到数组中(用于生成势能表面和反应路径,因此我将使用 scipy.interpolate——因此需要每个值...)。

问题是 genfromtxt 将每个 csv 输入的第一个值读取为 NaN。我该如何解决这个问题?

例如,我在 dcm_oh_lengths.csv 中有以下数据:

1.0763,1.1263,1.1763,1.2263,1.2763,1.3263,1.3763,1.4263,1.4763,1.5263,1.5763

我用它来称呼它

oh_all = np.genfromtxt(solv+'_oh_lengths.csv',dtype=float,delimiter=',')

然后 oh_all 返回

array([   nan, 1.1263, 1.1763, 1.2263, 1.2763, 1.3263, 1.3763, 1.4263,
       1.4763, 1.5263, 1.5763])

所以第一个数据点被读取为缺失。如果我将数据更改为

,1.0763,1.1263,1.1763,1.2263,1.2763,1.3263,1.3763,1.4263,1.4763,1.5263,1.5763

然后做同样的事情返回

array([   nan, 1.0763, 1.1263, 1.1763, 1.2263, 1.2763, 1.3263, 1.3763,
       1.4263, 1.4763, 1.5263, 1.5763])

作为一个更长的例子,能量 (dcm_energies.csv) 的前几行是:

-7162979.201,-7163010.482,-7163033.634,-7163043.279,-7163060.113,-7163068.894,-7163076.255,-7163078.541,-7163080.908,-7163056.179,-7163081.743
-7163005.74,-7163031.808,-7163050.794,-7163056.603,-7163064.619,-7163070.65,-7163080.606,-7163080.682,-7163081.125,-7163052.444,-7163078.824
-7163024.746,-7163046.199,-7163061.278,-7163063.603,-7163068.336,-7163071.692,-7163079.11,-7163077.25,-7163075.861,-7163043.325,-7163070.561 (...)

然后通过上面的 genfromtxt 调用它:

array([[         nan, -7163010.482, -7163033.634, -7163043.279,
        -7163060.113, -7163068.894, -7163076.255, -7163078.541,
        -7163080.908, -7163056.179, -7163081.743],
       [-7163005.74 , -7163031.808, -7163050.794, -7163056.603,
        -7163064.619, -7163070.65 , -7163080.606, -7163080.682,
        -7163081.125, -7163052.444, -7163078.824],
       [-7163024.746, -7163046.199, -7163061.278, -7163063.603,
        -7163068.336, -7163071.692, -7163079.11 , -7163077.25 ,
        -7163075.861, -7163043.325, -7163070.561], (...)

【问题讨论】:

  • 请发布代码示例和一些示例数据。否则,这是任何人的猜测。
  • 您可能需要提供某种形式的示例数据和代码来重现此行为,否则只能提供推测。如果它只是一个 csv,你可能只分享问题的前 10 行左右。
  • 默认数据类型是浮点数。当列字符串不是有效的浮点数时,它返回 nan。使用usecols 跳过问题列。或自定义 dtype、名称和/或标题。仔细阅读文档。

标签: python numpy genfromtxt


【解决方案1】:

正如 Warren 所指出的,这是一个 BOM 问题。

我在网上找到的一个可能更简单的解决方案是在 notepad++ 中打开您的 CSV 文件。 如果您有 UTF-8 BOM 文件,您可以在右下角看到。

如果您这样做,您只需单击编码并选择 UTF-8,然后保存您的文件。 这种方式无需添加更多代码。

【讨论】:

    【解决方案2】:

    我的猜测是该文件以"byte order mark" (BOM) 开头。文件是如何创建的?

    试试这个:

    with open('dcm_oh_lengths.csv', 'r', encoding='utf-8-sig') as f: 
        oh_all = np.genfromtxt(f, dtype=float, delimiter=',')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-04
      • 2011-04-15
      • 2011-08-05
      • 2021-03-06
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      相关资源
      最近更新 更多