【问题标题】:genfromtxt dtype=None returns wrong shapegenfromtxt dtype=None 返回错误的形状
【发布时间】:2011-11-29 03:20:37
【问题描述】:

我是 numpy 的新手,我很难使用 genfromtxt 将 CSV 读取到 numpy 数组中。

我在网上找到了一个 CSV 文件,我将其用作示例。它是浮点数和字符串的混合体。在这里:http://pastebin.com/fMdRjRMv

我通过 pylab 使用 numpy(通过:ipython -pylab 在 Ubuntu 系统上初始化)。 numpy.version.version 是 1.3.0。

这是我的工作:

示例 #1:

data = genfromtxt("fMdRjRMv.txt", delimiter=',', dtype=None)

data.shape

(374, 15)


data[10,10] ## Take a look at an example element

'30'

type(data[10,10])

type 'numpy.string_'

CSV 文件中没有错误的引号,所以我不知道为什么它应该认为数字是一个字符串。有谁知道为什么会这样?

示例 #2(跳过第一行):

data = genfromtxt("fMdRjRMv.txt", delimiter=',', dtype=None, skiprows=1)

数据形状

(373,)

有谁知道它为什么不将所有这些读入一维数组?

非常感谢!

【问题讨论】:

    标签: csv numpy genfromtxt


    【解决方案1】:

    在您的示例 #1 中,问题在于单个列中的所有值必须共享相同的数据类型。由于数据文件的第一行有列名,这意味着每列的数据类型都是字符串。

    您在示例#2 中跳过第一行的想法是正确的。但是请注意,1.3.0 是一个相当旧的版本(我有 1.6.1)。在较新的版本中,skiprows 已弃用,您应该改用skip_header

    数组的形状之所以为(373,),是因为它是一个结构化数组(见http://docs.scipy.org/doc/numpy/user/basics.rec.html),这是numpy用来表示非同质数据的。所以data[10] 为您提供整行表格。您还可以按名称访问数据列,例如data['f10']。您可以在data.dtype.names 中找到列的名称。也可以使用数据文件第一行中定义的原始列名:

     data = genfromtxt("fMdRjRMv.txt", dtype=None, delimiter=',', names=True)
    

    然后您可以访问像data['Age'] 这样的列。

    【讨论】:

    • 非常感谢,这非常有用。我希望您不介意回答这两个后续问题:(1)如何访问结构化数组中的特定值[比如第 10 行中的第 3 个条目]? (2) 有没有办法重塑阵列以将其变成 373x15 形状?再次非常感谢。
    • 好的,我自己回答了问题(1)。只需 data['Age'][10] 就可以了。
    • @DanEvans:至于你的第二次跟进,恐怕你不能强制它成为一个常规的numpy数组,只要列有不同的数据类型。所以如果你想要整个表,那么一切都必须是一个字符串,就像你原来的例子 #1 一样,这对你来说可能不是很有用。或者,您可以仅选择数字列并将它们全部强制为浮点数。附言如果您觉得我的回答有用,请考虑接受和/或投票。
    • 非常感谢!我真的很感谢你的时间。我已通过单击对勾“接受”您的答案。不幸的是,我的状态还不够高,无法投票,但希望其他用户能提供帮助!
    猜你喜欢
    • 2014-11-07
    • 2014-04-08
    • 2014-02-26
    • 1970-01-01
    • 1970-01-01
    • 2015-01-19
    • 1970-01-01
    • 2023-01-19
    • 1970-01-01
    相关资源
    最近更新 更多