Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 优化超大距离矩阵处理工作流_Python_Matrix - Fatal编程技术网

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

Python 优化超大距离矩阵处理工作流,python,matrix,Python,Matrix,我正在处理由clustal omega应用程序生成的超大距离矩阵,该应用程序涉及我正在开发的一些生物信息学管道,我遇到了以下问题: 距离矩阵处理在某个时间点自身重复,其中由某一行索引对应的列的索引表示的元素在每个文件中出现两次,例如:位置行(1)-列(2)等于(21.944035),该值与位置行(2)-列(1)中的值完全相同,以此类推 如果我设法避免对文件中的每个元素重复两次处理工作流,我可以提高脚本的速度并减少存储结果所需的内存需求 这是我的9725 x 9725空间分隔距离矩阵中的一个非常小

我正在处理由clustal omega应用程序生成的超大距离矩阵,该应用程序涉及我正在开发的一些生物信息学管道,我遇到了以下问题:

距离矩阵处理在某个时间点自身重复,其中由某一行索引对应的列的索引表示的元素在每个文件中出现两次,例如:位置行(1)-列(2)等于(21.944035),该值与位置行(2)-列(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()

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

此循环跳过对角线

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

你只是想处理对角线上方的值(而不是对角线本身,因为它只是反射出来的,所以下面什么都不处理)还是我遗漏了什么?@NickT。。。我真的不确定它是否是一个镜面反射矩阵,因为它的尺寸非常大,我无法抓住它的边界来决定:\所以这个小小的符号可以完成这个任务!!!事情变得很明显,当有人指出它们时,我会尝试一下,非常感谢:)那个小小的调整
行_idx@Bara“a我翻转了不等式,但不确定您所说的空文件是什么意思……索引是否错误,例如,是否应该是
数据[row\u idx,col\u idx]
?@NickT……不,索引是否正确,我的意思是:该条件将跳过对角线和上面的所有内容,除了使输出文件为空的任何两个相同的值之外@bara如果它在
的一侧失败,它将跳过跳过处理的if语句(使用
继续
)。它必须位于对角线的一侧(以假定不重要的为准),并且该值必须等于它的镜像。。。还是我读错了逻辑?
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