2016-04-14 27 views
-1

我有一个文件,它看起来像这样读取二维数组与混合数据

864 | 85 | '[150, 145, 110, 99, 95, -10] | .... 

我可以读取这些数据作为

np.genfromtxt(neighbors_file, delimiter = '|', dtype=(int, int, '|S66'), usecols=(0, 1, 2)) 

这给了我与每一个line数组作为一个元组数据

d = array([(864, 85, '[150, 145, 110, 99, 95, -10]'), 
     (864, 92, '[160, 147, 97, -22]'), 
     (864, 94, '[186, 146, 144, 114, 106]'), ..., 
     (3376, 734, '[733, 532, 531, 528, 524, 521]'), 
     (3376, 735, '[742, 673, 611, 529, 514, 513]'), 
     (3376, 742, '[735, 611, 533, 514, -15, -16]')], 
     dtype=[('f0', '<i8'), ('f1', '<i8'), ('f2', 'S66')]) 

现在我必须迭代使用索引d[i]代替你的行第一列为
d[:, 0],第二列为d[:, 1]

有什么想法?

+1

预期的输出是什么? –

+0

您可以使用列名访问结构化数组,例如>>> d ['f0']#array([864,864,864],dtype = int64)... >>> d ['f1'] #array( [85,92,94],dtype = int64)>>> d ['f2']#array([b'[150,145,110,99,95,-10]',snip ... b'[ ',dtype ='| S66') >>> – 2016-04-14 13:40:02

回答

0
d = array([(864, 85, '[150, 145, 110, 99, 95, -10]'), 
     (864, 92, '[160, 147, 97, -22]'), 
     (864, 94, '[186, 146, 144, 114, 106]'), ..., 
     ...], 
     dtype=[('f0', '<i8'), ('f1', '<i8'), ('f2', 'S66')]) 

是一个结构化数组。请注意,化合物dtype来自您的dtype=(int, int, '|S66')参数。

取代2d数组的行和列,它具有记录和字段。

d[0] # one record, same dtype 
d['f0'] # an array in ints, the first field 
d['f2'] # an array of strings, the 3rd field 
d[1]['f1'] # 92 
d['f1'][1] # same thing 

困惑在什么genfromtxt回报是很常见的;如果这还不够,还有更多的答案。

从技术上讲,每个'行'不是一个元组,而是一个numpy.void,一个复合dtype元素。它显示为一个元组,以更好地将其与第nd数组的维度区分开来。请参阅我最近的其他答案以获取更多详细信息:https://stackoverflow.com/a/36606421/901925