2011-05-27 109 views
3

給定一個文件在下面的格式:在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 

第三列是在第一和第二列中的項之間的距離。如果我讀這樣的文件到pyton爲嵌套列表,如何將其轉化爲對稱矩陣,即

a b c 
a 0 1 1 
b 1 0 1 
b 1 1 0 

?我也希望包括列和行名稱。

我最好喜歡用numpy來完成這個任務。

有什麼建議嗎?

感謝, D.

回答

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的行和列,所以我剛剛作出了一個字典映射行標籤的行索引和另一個做同樣的列。如果你需要它,你可以製作一張反向地圖,如下圖所示,或者你可以製作一個行和一列bidict

rows_reverse = dict((v, k) for k, v in rows) 
cols_reverse = dict((v, k) for k, v in cols) 
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']