在Python中从字典构建scipy/numpy的成对矩阵

0 投票
2 回答
2976 浏览
提问于 2025-04-15 22:52

我有一个字典,这个字典的键是字符串,值是numpy数组,比如说:

data = {'a': array([1,2,3]), 'b': array([4,5,6]), 'c': array([7,8,9])}

我想计算'data'中所有值之间的某种统计数据,并建立一个n行x列的矩阵来存储结果。假设我知道这些键的顺序,也就是说,我有一个“标签”的列表:

labels = ['a', 'b', 'c']

有什么高效的方法来计算这个矩阵吗?

我可以这样计算所有值对之间的统计数据:

result = []
for elt1, elt2 in itertools.product(labels, labels):
  result.append(compute_statistic(data[elt1], data[elt2]))

但是我想要的结果是一个n行n列的矩阵,行和列都对应“标签”。我该如何把结果记录成这个矩阵呢?谢谢。

2 个回答

2

把结果列表转换成一个矩阵,然后调整它的形状。

myMatrix = array(result) # or use matrix(result)
myMatrix.shape = (len(labels), len(labels))

如果你想用标签来索引这个矩阵,你可以这样做:

myMatrix[labels.index('a'), labels.index('b')]

这样可以得到 a*b 的值。如果你是这个意思,最好把索引存储在一个字典里。

labelsIndex = {'a' : 0, 'b' : 1, 'c' : 2 }
myMatrix[labelsIndex['a'], labelsIndex['b']]

希望这对你有帮助。

2

你可以使用一个嵌套循环,或者像下面这样用列表推导式:

result = [[compute_stat(data[row], data[col]) for col in labels]
          for row in labels]

撰写回答