2016-04-23 24 views
0

我有以下返回不同的结构化数据:NumPy的的genfromtxt取决于D型参数

from numpy import genfromtxt  
seg_data1 = genfromtxt('./datasets/segmentation.all', delimiter=',', dtype="|S5") 
seg_data2 = genfromtxt('./datasets/segmentation.all', delimiter=',', dtype=["|S5"] + ["float" for n in range(19)]) 

print seg_data1 
print seg_data2 

print seg_data1[:,0:1] 
print seg_data2[:,0:1] 

事实证明,seg_data1seg_data2是不一样的一种结构。下面是打印:

[['BRICK' '140.0' '125.0' ..., '7.777' '0.545' '-1.12'] 
['BRICK' '188.0' '133.0' ..., '8.444' '0.538' '-0.92'] 
['BRICK' '105.0' '139.0' ..., '7.555' '0.532' '-0.96'] 
..., 
['CEMEN' '128.0' '161.0' ..., '10.88' '0.540' '-1.99'] 
['CEMEN' '150.0' '158.0' ..., '12.22' '0.503' '-1.94'] 
['CEMEN' '124.0' '162.0' ..., '14.55' '0.479' '-2.02']] 
[ ('BRICK', 140.0, 125.0, 9.0, 0.0, 0.0, 0.2777779, 0.06296301, 0.66666675, 0.31111118, 6.185185, 7.3333335, 7.6666665, 3.5555556, 3.4444444, 4.4444447, -7.888889, 7.7777777, 0.5456349, -1.1218182) 
('BRICK', 188.0, 133.0, 9.0, 0.0, 0.0, 0.33333334, 0.26666674, 0.5, 0.077777736, 6.6666665, 8.333334, 7.7777777, 3.8888888, 5.0, 3.3333333, -8.333333, 8.444445, 0.53858024, -0.92481726) 
('BRICK', 105.0, 139.0, 9.0, 0.0, 0.0, 0.27777782, 0.107407436, 0.83333325, 0.52222216, 6.111111, 7.5555553, 7.2222223, 3.5555556, 4.3333335, 3.3333333, -7.6666665, 7.5555553, 0.5326279, -0.96594584) 
..., 
('CEMEN', 128.0, 161.0, 9.0, 0.0, 0.0, 0.55555534, 0.25185192, 0.77777785, 0.16296278, 7.148148, 5.5555553, 10.888889, 5.0, -4.7777777, 11.222222, -6.4444447, 10.888889, 0.5409177, -1.9963073) 
('CEMEN', 150.0, 158.0, 9.0, 0.0, 0.0, 2.166667, 1.6333338, 1.388889, 0.41851807, 8.444445, 7.0, 12.222222, 6.111111, -4.3333335, 11.333333, -7.0, 12.222222, 0.50308645, -1.9434487) 
('CEMEN', 124.0, 162.0, 9.0, 0.11111111, 0.0, 1.3888888, 1.1296295, 2.0, 0.8888891, 10.037037, 8.0, 14.555555, 7.5555553, -6.111111, 13.555555, -7.4444447, 14.555555, 0.4799313, -2.0293121)] 
[['BRICK'] 
['BRICK'] 
['BRICK'] 
..., 
['CEMEN'] 
['CEMEN'] 
['CEMEN']] 
Traceback (most recent call last): 
    File "segmentationdata.py", line 14, in <module> 
    print seg_data2[:,0:1] 
IndexError: too many indices for array 

我宁愿在seg_data1形式genfromtxt返回数据,虽然我不知道任何内置的方式来强制seg_data2符合该类型。据我所知有没有简单的办法:

seg_target1 = seg_data1[:,0:1] 
seg_data1 = seg_data1[:,1:] 

seg_data2。现在我可以做data.astype(float)但重点是,是不是genfromtxt应该做的开始,当我给它dtype数组?

+0

到底是什么'[“| S5”] + [“浮动”对于范围内的n(19)]'假设代表dtype? –

+1

我不太明白你想要做什么。你说你会*'而不是'genfromtxt'以'seg_data1'' *的形式返回数据,那么'seg_data1'有什么问题?看起来你可能会把结构化数组中的* fields *与多维数组中的* columns *混淆起来。字段可以有不同的dtype,但列不能。如果你想要一个数据结构,其中“列”可以有不同的dtypes,那么你可能想使用['pandas.DataFrame'](http://pandas.pydata.org/pandas-docs/stable/generated/pandas。 DataFrame.html)。 –

+0

'panda.DataFrame'是否使用结构化数组存储其数据?或者'dtype = object'数组?或者取决于什么方便? – hpaulj

回答

3

dtype="|S5"可以将所有列导入为字符串(5个字符)。其结果是一个二维数组具有行等

['BRICK' '140.0' '125.0' ..., '7.777' '0.545' '-1.12'] 

随着dtype=["|S5"] + ["float" for n in range(19)]指定为每列中的D型,其结果是结构化阵列。它是20个字段的1d。您按名称访问字段(请参阅set_data2.dtype),而不是按列号访问。

A元素,或记录,此数组的被显示为元组,和包括串和19个浮子:

('BRICK', 140.0, 125.0, 9.0, 0.0, 0.0, 0.2777779, 0.06296301, 0.66666675, 0.31111118, 6.185185, 7.3333335, 7.6666665, 3.5555556, 3.4444444, 4.4444447, -7.888889, 7.7777777, 0.5456349, -1.1218182) 

#初始字符列

print set_data2['f0'] 

指定dtype=None应产生同样的事情,可能有一些整数列而不是所有的浮点数。

还可以指定带有2个字段的dtype,其中一个字符串列,另一个字段列为19个浮点数。我必须检查文档并运行一些测试用例来确定格式。

我认为您已阅读足够多的genfromtxt文档以查看您可以指定复合dtype,但不足以理解结果。

=================

用文字和数字的CSV的例子:

In [139]: txt=b"""one 1 2 3 
    ...: two 4 5 6 
    ...: """ 

默认:所有彩车

In [140]: np.genfromtxt(txt.splitlines()) 
Out[140]: 
array([[ nan, 1., 2., 3.], 
     [ nan, 4., 5., 6.]]) 

自动D型细胞的选择 - 4个字段

In [141]: np.genfromtxt(txt.splitlines(),dtype=None) 
Out[141]: 
array([(b'one', 1, 2, 3), (b'two', 4, 5, 6)], 
     dtype=[('f0', 'S3'), ('f1', '<i4'), ('f2', '<i4'), ('f3', '<i4')]) 

个用户指定的字段dtypes

In [142]: np.genfromtxt(txt.splitlines(),dtype='str,int,float,int') 
Out[142]: 
array([('', 1, 2.0, 3), ('', 4, 5.0, 6)], 
     dtype=[('f0', '<U'), ('f1', '<i4'), ('f2', '<f8'), ('f3', '<i4')]) 

复合D型,与列数的数字字段(和校正字符串列)

In [145]: np.genfromtxt(txt.splitlines(),dtype='S5,(3)int') 
Out[145]: 
array([(b'one', [1, 2, 3]), (b'two', [4, 5, 6])], 
     dtype=[('f0', 'S5'), ('f1', '<i4', (3,))]) 

In [146]: _['f0'] 
Out[146]: 
array([b'one', b'two'], 
     dtype='|S5') 

In [149]: _['f1'] 
Out[149]: 
array([[1, 2, 3], 
     [4, 5, 6]]) 

如果你需要跨越数字字段做数学题,这最后一种情况(或更详细的说法)可能是最方便的。

为了产生更复杂的东西也可能是最好的开发dtype在一个单独的表达(D型语法可以是棘手的)

In [172]: dt=np.dtype([('f0','|S5'),('f1',[('f10',int),('f11',float,(2))])]) 

In [173]: np.genfromtxt(txt.splitlines(),dtype=dt) 
Out[173]: 
array([(b'one', (1, [2.0, 3.0])), (b'two', (4, [5.0, 6.0]))], 
     dtype=[('f0', 'S5'), ('f1', [('f10', '<i4'), ('f11', '<f8', (2,))])])