优化超大距离矩阵处理工作流程

时间:2015-02-16 23:04:32

标签: python matrix

我正在使用clustal omega应用程序生成的极大距离矩阵,这些应用程序涉及我正在开发的一些生物信息学管道,并且我遇到了以下问题:

距离矩阵处理在某个时间点重复它自身,其中由对应于某个行索引的列的索引表示的元素在每个文件中出现两次,例如, :position row(1)-column(2)等于(21.944035),其值与位置row(2)-column(1)完全相同,依此类推。

如果我设法避免对文件中的每个元素重复两次处理工作流程,我可以提高脚本的速度并降低存储结果所需的内存要求。

这是我的一个9725 x 9725空间分隔距离矩阵的一个非常小的样本,你可以看到元素如何匹配每个独特的位置 - 没有尊重订单 - 索引。

100.000000 21.944035 22.133939 23.723042 19.750284 20.431328 20.885358 21.679909
21.944035 100.000000 22.827688 21.796760 22.974963 20.324006 21.944035 24.889543
22.133939 22.827688 100.000000 21.152030 22.474032 17.387033 19.830028 20.963173
23.723042 21.796760 21.152030 100.000000 20.437018 24.361493 19.059107 19.436957
19.750284 22.974963 22.474032 20.437018 100.000000 21.414538 20.094259 21.765210
20.431328 20.324006 17.387033 24.361493 21.414538 100.000000 20.432220 20.432220
20.885358 21.944035 19.830028 19.059107 20.094259 20.432220 100.000000 19.018898
21.679909 24.889543 20.963173 19.436957 21.765210 20.432220 19.018898 100.000000

这是我用python写的脚本片段,以避免对角线明智的值,因为它们代表了一个反对自己的索引:

for i in range(len(files)):
    name=files[i][files[i].find("-")+1:files[i].find(".")]
    retrieved=open("Rtrv-"+name+".csv",'w',newline='')
    retrieved.write(str('{0:^14}\t{1:^8}\t{2:^10}\n'.format(str("Similarity (%)"),str("Query ID"),str("Subject ID"))))
    data=np.genfromtxt(files[i])
    for row_idx, row in enumerate(data):
        for col_idx, element in enumerate(row):
            if row_idx==col_idx :
                continue
            elif ("Left" in name and element>=90.000000):
                retrieved.write(str('{0:10.6f}\t{1:0d}\t{2:0d}\n'.format(element,row_idx,col_idx)))
            elif ("Right" in name and (100-element)>=50.000000) :
                retrieved.write(str('{0:10.6f}\t{1:0d}\t{2:0d}\n'.format(element,row_idx,col_idx)))
    retrieved.close()

我的问题是:如何更改我的代码以避免在文件的后面出现相同位置的重新处理?!

1 个答案:

答案 0 :(得分:0)

此循环跳过对角线。

for row_idx, row in enumerate(data):
    for col_idx, element in enumerate(row):
        if row_idx == col_idx:
            continue

这个小调整会跳过对角线以及下面的所有内容(==>=

for row_idx, row in enumerate(data):
    for col_idx, element in enumerate(row):
        if row_idx >= col_idx:
            continue

如果你不确定矩阵是否对称,你可以添加一张支票:

for row_idx, row in enumerate(data):
    for col_idx, element in enumerate(row):
        if row_idx >= col_idx and data[row_idx][col_idx] == data[col_idx][row_idx]:
            continue