【发布时间】:2019-06-27 15:08:09
【问题描述】:
我有一个 2D numpy 数组(实际上是一个相似度矩阵),我需要在其上按块计算平均值。例如下面的矩阵:
sima = np.array([[1,0.8,0.7,0.3,0.1,0.5],
[0.8,1,0.1,0.5,0.2,0.5],
[0.7,0.1,1,0.1,0.3,0.9],
[0.3,0.5,0.1,1,0.8,0.5],
[0.1,0.2,0.3,0.8,1,0.5],
[0.5,0.5,0.9,0.5,0.5,1]])
和标签向量:
labels = np.array([1,1,1,2,2,3])
这意味着矩阵的前三行(以及列,因为相似度矩阵是对称的)对应于簇1,接下来的2对应于簇2,最后一个对应于集群3。
我需要计算sima 中对应于labels 中标签的块的平均值。产生以下输出:
0.69 0.25 0.63
0.25 0.90 0.50
0.63 0.50 1.00
到目前为止,我有一个在标签和掩码数组上使用双循环的可行解决方案:
labels_matrix = np.tile(np.array(labels), (len(labels), 1))
output = pd.DataFrame(np.zeros(shape = (3,3)))
for i in range(3):
for j in range(3):
mask = (labels_matrix != j+1) | (labels_matrix.T != i+1)
output.loc[i,j] = np.mean(np.mean(np.ma.array(sima, mask = mask)))
这段代码产生了正确的输出,但我的实际矩阵是 50kx50k,而且这段代码需要很长时间才能计算出来。我怎样才能让它更快?
注意:我需要不同数量级的速度,所以我希望使用相似矩阵的对称性这样的技巧是不够的。
【问题讨论】:
-
标签与数组的关系如何?
-
您的“工作”解决方案中有语法错误。请修复这些问题,以便我们查看您的尝试
-
我编辑了我的问题来解释这一点。标签与集群相关(您可以将它们视为在相似度矩阵中给出集群名称的索引)
-
我修正了错别字,包括所需输出中的下三角形。感谢您指出这些
标签: python arrays numpy similarity