【问题标题】:Using a helper function with numpy.genfromtxt()使用带有 numpy.genfromtxt() 的辅助函数
【发布时间】:2014-01-07 09:30:42
【问题描述】:

我想从文件myfile 中将数据读入一个数组,该数组的开头包含一个我打算忽略的字符串。像这样的东西:-

"myfile", 1.0, 2.0, 3.0
,4.0, 5.0, 6.0

这是代码:-

def func(filename):
    with open(filename) as fp
    line = next(fp).split(',')
    yield ','.join(line[1:])
    for line in fin:
        yield line

arr = np.genfromtxt(func('myfile'), delimiter=',')

我得到一个例外:-

Line #2 (got 4 columns instead of 3)

我觉得奇怪的是,如果我的数据看起来像这样,

"myfile", 1.0, 2.0, 3.0, 4.0 
 ,5.0, 6.0, 7.0

我明白了

array([[  1.,   2.,   3.,   4.],
   [ nan,   4.,   5.,   6.]])

谁能解释这里发生了什么?

【问题讨论】:

  • 第二行是4.0, 5,0, 6,0还是4.0, 5.0, 6.0
  • 一个错字。我改正了
  • 第二行中仍有 4 个元素(4.05.060)——这解释了错误消息。 Numpy 期望每一行包含相同数量的元素。你的第一行有 3 个元素,你的第二行有 4 个。
  • 为什么要迭代fin而不是fp
  • @AdaXu -- 在你最后一次编辑之后,代码对我有用......至于第二个例子工作的原因 -- numpy 似乎在你的文件中期待 4 列数据,因为那是数字第一行中的元素。当它处理具有较少元素的第二行时,它使用nan 填充。换句话说,行需要与第一行具有相同数量或更少的列。如果小于,则会用nan 填充。

标签: python arrays numpy


【解决方案1】:

对我来说,在修正错别字后效果很好:

import numpy as np

def func(filename):
    with open(filename) as fp:
        line = next(fp).split(',')
        yield ','.join(line[1:])
        for line in fp:
            yield line[1:]

print np.genfromtxt(func('myfile'), delimiter=',')

myfile:

"myfile", 1.0, 2.0, 3.0
,4.0, 5.0, 6.0

【讨论】:

  • 第二行有一个前导“逗号”
  • 更改为 yield line[1:] 以去掉前面的逗号
【解决方案2】:

第二行的前导逗号是导致此行为的原因。 genfromtxt 期望那里有另一个值,如果没有,则替换 nan。所以第二行根据 genfromtxt 有 4 个值。如果这同样适用于您的第一行,那很好;但 genfromtxt 需要一个方形的输入块,采用行/列类型格式。您可以做的一件事是用额外的前导逗号替换要删除的字符串,将字符串呈现为 nan;如果这确实确实使您的数据始终如一。如果不是,那么最好的处理方式很大程度上取决于您的数据的实际情况。

【讨论】:

    猜你喜欢
    • 2016-01-08
    • 2015-08-13
    • 2018-03-23
    • 1970-01-01
    • 2022-01-08
    • 2023-03-27
    • 2015-03-14
    • 1970-01-01
    • 2011-04-13
    相关资源
    最近更新 更多