使用文本文件中的索引值将文本文件中的值读取到2D numpy数组中

时间:2016-12-12 19:02:06

标签: python-3.x numpy

我需要将包含逗号分隔值的文本文件读入2D numpy数组。每行的前2个值包含numpy数组的索引值,第三个值包含要存储在数组中的值。作为一个catch,索引值是从1开始的,需要转换为numpy使用的从0开始的索引值。我已经使用genfromtxt和loadtxt查看了文档和示例,但我仍然不清楚如何去做。我也试过以下代码但没有成功:

a = np.arange(6).reshape(2,3)

for line in infile:
    fields = line.split() #split fields inti list
    rindex = int(fields[0]) - 1
    cindex = int(fields[1]) - 1
    a[rindex,cindex] = float(fields[2])

以下是输入文件的示例:

1,1,10.1
1,2,11.2
1,3,12.3
2,3,13.4
2,2,14.5
2,3,15.6

这是我想要的输出数组。理想情况下,我希望它能够处理任何数组大小,而无需预定义数组的大小。

10.1 11.2 12.3
13.4 14.5 15.6

1 个答案:

答案 0 :(得分:0)

这是你可以做到的一种方式。 numpy.genfromtxt()用于将数据读入具有三个字段的结构化数组中。行和列索引从结构化数组中拉出并用于计算所需数组的形状,并使用numpy的“花式”索引将值分配给新数组:

In [46]: !cat test_data.csv
1,1,10.1
1,2,11.2
1,3,12.3
2,3,13.4
2,2,14.5
2,3,15.6

In [47]: data = np.genfromtxt('test_data.csv', dtype=None, delimiter=',', names=['i', 'j', 'value'])

In [48]: data
Out[48]: 
array([(1, 1, 10.1), (1, 2, 11.2), (1, 3, 12.3), (2, 3, 13.4),
       (2, 2, 14.5), (2, 3, 15.6)], 
      dtype=[('i', '<i8'), ('j', '<i8'), ('value', '<f8')])

In [49]: rows = data['i']

In [50]: cols = data['j']

In [51]: nrows = rows.max()

In [52]: ncols = cols.max()

In [53]: a = np.zeros((nrows, ncols))

In [54]: a[rows-1, cols-1] = data['value']

In [55]: a
Out[55]: 
array([[ 10.1,  11.2,  12.3],
       [  0. ,  14.5,  15.6]])