当使用genfromtxt指定dtype时,2D数组变为1D - 如何防止这种情况?

时间:2013-12-25 10:25:07

标签: python numpy

如下所示:

http://library.isr.ist.utl.pt/docs/numpy/user/basics.io.genfromtxt.html#choosing-the-data-type

  

“在所有情况下,除了第一个,输出将是带有结构化dtype的一维数组。此dtype具有与序列中的项目一样多的字段。字段名称使用names关键字定义。”

问题是如何解决这个问题?我想将genfromtxt与一个数据文件一起使用,该数据文件包含例如int,string,int。

如果我这样做:

dtype=(int, "|S5|", int)

然后整个形状从(x,y)变为仅仅(x,),当我尝试使用蒙版时,我得到'太多索引'错误。

当我使用dtype = None时,我会保留2D结构,但如果列的第一行看起来像是一个数字(这通常出现在我的数据集中),它通常会出错。

我如何最好地解决这个问题?

1 个答案:

答案 0 :(得分:1)

您不能拥有2D数组,这意味着每行都有一个混合dtype的1D数组,这是不可能的。

拥有一系列记录应该不是问题:

In [1]: import numpy as np

In [2]: !cat test.txt
42 foo 41
40 bar 39

In [3]: data = np.genfromtxt('test.txt',
    ..:     dtype=np.dtype([('f1', int), ('f2', np.str_, 5), ('f3', int)]))

In [4]: data
Out[4]:
array([(42, 'foo', 41), (40, 'bar', 39)],
      dtype=[('f1', '<i8'), ('f2', '<U5'), ('f3', '<i8')])

In [5]: data['f3']
Out[5]: array([41, 39])

In [6]: data['f3'][1]
Out[6]: 39

如果您需要蒙面数组,请查看此处:How can I mask elements of a record array in Numpy?

按第一列值屏蔽:

In [7]: data['f1'] == 40
Out[7]: array([False,  True], dtype=bool)

In [8]: data[data['f1'] == 40]
Out[8]:
array([(40, 'bar', 39)],
      dtype=[('f1', '<i8'), ('f2', '<U5'), ('f3', '<i8')])