我需要将包含逗号分隔值的文本文件读入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
答案 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]])