问题描述
我知道使用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')])
但是如果我想让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')])
我仍然希望自动生成f0
,f1
...等列名称。而且我希望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]
的原因。