在Python中从字典构建scipy/numpy的成对矩阵
我有一个字典,这个字典的键是字符串,值是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]