numpy genfromtxt-如果未提供标题,则推断列标题

问题描述

我知道使用genfromtxt时,可以使用defaultfmt参数来推断认的列名,如果列名不在输入数据中,这将很有用。并且defaultfmt(如果未提供)认为f%i。例如

>>> data = StringIO("1 2 3\n 4 5 6")
>>> np.genfromtxt(data,dtype=(int,float,int))
array([(1,2.0,3),(4,5.0,6)],dtype=[('f0','<i8'),('f1','<f8'),('f2','<i8')])

因此,在这里,我们具有自动生成的列名f0f1f2

但是如果我想让numpy推断两者标题和数据类型怎么办?我以为您可以使用dtype=None来做到这一点。像这样

>>> data3 = StringIO("1 2 3\n 4 5 6")
>>> np.genfromtxt(data3,dtype=None,???)  # some parameter combo
array([(1,2,5,'<i8')])  

我仍然希望自动生成f0f1 ...等列名称。而且我希望numpy根据数据自动确定数据类型,我认为这是进行dtype=None的全部要点。

编辑 但不幸的是,这永远都行不通。

当我同时具有浮点数和整数时,这种情况有效。

>>> data3b = StringIO("1 2 3.0\n 4 5 6.0")
>>> np.genfromtxt(data3b,dtype=None)
array([(1,3.),6.)],'<f8')])

因此numpy正确地推断出前两列为i8的数据类型,而最后列为f8。

但是,如果我提供所有整数,则推断出的列名称将消失。

>>> data3c = StringIO("1 2 3\n 4 5 6")
>>> np.genfromtxt(data3c,dtype=None)
array([[1,3],[4,6]])

根据输入数据,我相同的代码可能有效还是无效?听起来不对。

是的,我知道有熊猫。但是我不是故意使用熊猫。所以请忍受我。

解决方法

In [2]: txt = '''1,2,3
   ...: 4,5,6'''.splitlines()

Defaylt 2d笛阵列:

In [6]: np.genfromtxt(txt,delimiter=',',encoding=None)
Out[6]: 
array([[1.,2.,3.],[4.,5.,6.]])

int的2d:

In [7]: np.genfromtxt(txt,dtype=None,encoding=None)
Out[7]: 
array([[1,3],[4,6]])

指定的字段dtypes

In [8]: np.genfromtxt(txt,dtype='i,i,i',encoding=None)
Out[8]: 
array([(1,3),(4,6)],dtype=[('f0','<i4'),('f1',('f2','<i4')])

指定的字段名称:

In [9]: np.genfromtxt(txt,encoding=None,names=['a','b','c'])
Out[9]: 
array([(1,dtype=[('a','<i8'),('b',('c','<i8')])

可以通过以下方式将非结构化数组转换为结构化

In [10]: import numpy.lib.recfunctions as rf
In [11]: rf.unstructured_to_structured(Out[7])
Out[11]: 
array([(1,'<i8')])

numpy中,默认的首选数组是多维数字。这就是为什么它会产生Out7]的原因。