如何在Python(numpy)中填充数组?

3 投票
2 回答
2341 浏览
提问于 2025-04-16 18:27

给定一个格式如下的文件:

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)

撰写回答