读取包含混合数据的二维数组

时间:2016-04-14 12:47:48

标签: python numpy

我的文件中的数据看起来像这样

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]

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

根据定义,Numpy数组不会混合,这意味着d [i,j]中的每个元素都必须属于该类型。所以没有办法做你想做的事。有关详情,请查看文档http://docs.scipy.org/doc/numpy/reference/arrays.html

答案 1 :(得分: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')参数。

而不是二维数组的行和列,它有记录和字段。

 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返回的内容的困惑非常普遍;如果这还不够,还有更多的答案。

从技术上讲,每条线都是&#39;不是元组,而是numpy.void,复合dtype元素。它显示为元组,以便更好地将其与nd数组的维度区分开来。有关详细信息,请参阅我最近的其他答案:https://stackoverflow.com/a/36606421/901925