【问题标题】:genfromtxt only imports first column, after changing dtypegenfromtxt 仅在更改 dtype 后导入第一列
【发布时间】:2018-07-19 20:25:04
【问题描述】:

我正在使用 genfromtxt 导入包含各种类型数据的庞大数据集。
我的原始代码运行良好(ucols 是我要加载的列的列表):

data = np.genfromtxt(fname,comments = '#', skip_header=1, usecols=(ucols))

我的一些值是字符串,所以为了避免输入 NaN,我尝试设置 dtype = None

        data = np.genfromtxt(fname, dtype = None,comments = '#', skip_header=1, usecols=(ucols)) 

现在由于某种原因,我只得到一列数据,即第一列。有人可以解释我做错了什么吗?

编辑:我现在明白我应该获得一个可以引用以获取整行值的一维结构化数组。但是我希望将我的数据作为一个 numpy 数组,是否可以将 genfromtxt 与 dtype = None 一起使用,并且仍然获得一个 numpy 数组而不是结构化数组,或者是否有一种快速的方法可以在两者之间进行转换。虽然第二种方法不是可取的,除非它可以快速有效,因为我移动的值通常比当前实例大得多。

【问题讨论】:

  • 其实可以为dtype定义一个类型列表,其长度必须等于使用的列数,例如dtype = (float, str, int, float)为4列。
  • 我不一定知道输入数据的数据类型
  • 使用dtype=None 它应该创建一个结构化数组,1d,但具有与usecols 指定的一样多的字段。您对one column of data... 的描述不清楚。更明确。
  • 所以在我的例子中 usecols 是一个大小为 289 的值的列表,这正是我想要的。数据的大小为 (1989,289),输入的数据只有大小 (1989,)。这就是我说只输入一列数据(数据集的第一列)时的意思。
  • 一个numpy数组总是有一个dtype。通常,dtype 是数字是字符串。该化合物是一种概括。 object 是另一个,使数组更像list

标签: python python-3.x numpy


【解决方案1】:

制作结构化数组并将其写入csv:

In [131]: arr=np.ones((3,), dtype='i,f,U10,i,f')
In [132]: arr['f2']=['a','bc','def']
In [133]: arr
Out[133]: 
array([(1, 1., 'a', 1, 1.), (1, 1., 'bc', 1, 1.), (1, 1., 'def', 1, 1.)],
      dtype=[('f0', '<i4'), ('f1', '<f4'), ('f2', '<U10'), ('f3', '<i4'), ('f4', '<f4')])
In [134]: np.savetxt('test',arr,fmt='%d,%e,%s,%d,%f')
In [135]: cat test
1,1.000000e+00,a,1,1.000000
1,1.000000e+00,bc,1,1.000000
1,1.000000e+00,def,1,1.000000

使用 dtype=None 加载所有列:

In [137]: np.genfromtxt('test',delimiter=',',dtype=None,encoding=None)
Out[137]: 
array([(1, 1., 'a', 1, 1.), (1, 1., 'bc', 1, 1.), (1, 1., 'def', 1, 1.)],
      dtype=[('f0', '<i8'), ('f1', '<f8'), ('f2', '<U3'), ('f3', '<i8'), ('f4', '<f8')])

加载列的子集:

In [138]: np.genfromtxt('test',delimiter=',',dtype=None,encoding=None,usecols=
     ...: (1,2,4))
Out[138]: 
array([(1., 'a', 1.), (1., 'bc', 1.), (1., 'def', 1.)],
      dtype=[('f0', '<f8'), ('f1', '<U3'), ('f2', '<f8')])

【讨论】:

  • 虽然我已经尝试过这段代码,并且它确实在 Ipython 控制台中工作,但对于我的脚本,它并没有告诉我我做错了什么或为什么我得到我的错误。你能澄清一下吗
  • 您是否收到了错误消息,或者只是一些您不期望的信息?请注意,我的 Out[137] 的形状为 (3,),而不是 (3,5)。
  • 不是我所期望的错误消息,所以我希望所有 289 列都在输入中,但我总是只得到我输入的所有数据集的第一列。
猜你喜欢
  • 2018-10-14
  • 1970-01-01
  • 2014-02-26
  • 2020-04-17
  • 1970-01-01
  • 1970-01-01
  • 2014-05-10
  • 1970-01-01
  • 2011-11-29
相关资源
最近更新 更多