如何在Python(numpy)中填充数组?
给定一个格式如下的文件:
a a 0
a b 1
a c 1
b b 0
b a 1
b c 1
c c 0
c a 1
c b 1
第三列是第一列和第二列之间的距离。如果我把这样的文件读入Python,作为一个嵌套列表,我该如何将其转换为一个对称矩阵,也就是:
a b c
a 0 1 1
b 1 0 1
b 1 1 0
我还希望能包含行和列的名称。
我更希望使用numpy来完成这个任务。
有什么建议吗?
谢谢,D。
2 个回答
2
这里有一种稍微不同的方法:
import numpy as np
# Load "Row Col Value" text file
ar = np.loadtxt('file.txt', [('R','|S1'), ('C','|S1'), ('V','i')])
names = np.unique(np.row_stack((ar['R'], ar['C']))).tolist()
vf = np.vectorize(lambda x: names.index(x), otypes='i')
# load them in an output array
out = np.empty((len(names), len(names)), 'i')
out[vf(ar['R']), vf(ar['C'])] = ar['V']
4
import numpy as np
from itertools import count
data = [line.split() for line in inputfile.readlines()]
rows = dict(zip(sorted(set(line[0] for line in data)), count()))
cols = dict(zip(sorted(set(line[1] for line in data)), count()))
array = np.zeros((len(rows), len(cols)))
for row, col, val in data:
index = (rows[row], cols[col])
array[index] = val
我不知道怎么给numpy里的行和列加标签,所以我就做了一个字典,把行标签和行索引对应起来,另外又做了一个字典,把列标签和列索引对应起来。如果你需要的话,你可以像下面那样做一个反向映射,或者你可以把行和列做成一个双向字典。
rows_reverse = dict((v, k) for k, v in rows)
cols_reverse = dict((v, k) for k, v in cols)