我正在使用python上的Numpy数组来处理由clustal omega应用程序生成的距离矩阵,我很难阅读和创建具有不同数据类型的非常大的结构化numpy数组。
我设法解决了这个问题,但是我在这里要求采用正确的方法。
主要问题是难以在9726 x 9726维度的矩阵中声明每个列的数据类型。
这是我编写的代码片段,用于强制输出矩阵进一步操作所需的格式:
for i in range(len(fasta_files)):
global No
inFile = open(fasta_files[i],'r')
headerCount = 0
for line in inFile:
if line[0] == ">":
headerCount +=1
No = headerCount
name=fasta_files[i][:fasta_files[i].find(".")]
output_handle = open("$"+fasta_files[i],"w")
new_IDs=[]
for idx,record in enumerate(SeqIO.parse(fasta_files[i],"fasta",IUPAC.unambiguous_dna)):
record.id=record.id+"_"+str(idx+1)
new_IDs.append(record.id)
SeqIO.write(record,output_handle,"fasta")
output_handle.close()
new_IDs=np.array(new_IDs)
data=np.genfromtxt(name+'.dst')
data=np.array(data,dtype=object)
data[:,0]=new_IDs
np.savetxt(name+".dst",data,delimiter=" ",fmt='%s '+'%f '*No)
我尝试做的是从以下格式的空格分隔距离矩阵中读取数据,根据new_IDs
内容更新ID(通过在文件中添加序列号以避免重复)提前)并用相同的文件名覆盖它。
Traes_2BL_B2871DAAB.1 100.000000 21.944035 22.133939 23.723042 19.750284 20.431328 20.885358 21.679909
Traes_7BL_26A3CC41D.1 21.944035 100.000000 22.827688 21.796760 22.974963 20.324006 21.944035 24.889543
Traes_5AL_DE0E4DC71.1 22.133939 22.827688 100.000000 21.152030 22.474032 17.387033 19.830028 20.963173
Traes_2BS_D7A73A455.2 23.723042 21.796760 21.152030 100.000000 20.437018 24.361493 19.059107 19.436957
OS01T0101800-01 19.750284 22.974963 22.474032 20.437018 100.000000 21.414538 20.094259 21.765210
OS01T0103000-01 20.431328 20.324006 17.387033 24.361493 21.414538 100.000000 20.432220 20.432220
OS01T0103050-01 20.885358 21.944035 19.830028 19.059107 20.094259 20.432220 100.000000 19.018898
OS01T0103600-01 21.679909 24.889543 20.963173 19.436957 21.765210 20.432220 19.018898 100.000000
预计输出如下:
Traes_2BL_B2871DAAB.1_1 100.000000 21.944035 22.133939 23.723042 19.750284 20.431328 20.885358 21.679909
Traes_7BL_26A3CC41D.1_2 21.944035 100.000000 22.827688 21.796760 22.974963 20.324006 21.944035 24.889543
Traes_5AL_DE0E4DC71.1_3 22.133939 22.827688 100.000000 21.152030 22.474032 17.387033 19.830028 20.963173
Traes_2BS_D7A73A455.2_4 23.723042 21.796760 21.152030 100.000000 20.437018 24.361493 19.059107 19.436957
OS01T0101800-01_5 19.750284 22.974963 22.474032 20.437018 100.000000 21.414538 20.094259 21.765210
OS01T0103000-01_6 20.431328 20.324006 17.387033 24.361493 21.414538 100.000000 20.432220 20.432220
OS01T0103050-01_7 20.885358 21.944035 19.830028 19.059107 20.094259 20.432220 100.000000 19.018898
OS01T0103600-01_8 21.679909 24.889543 20.963173 19.436957 21.765210 20.432220 19.018898 100.000000
从上面的代码中可以看出,我重复了格式说明符号次,表示每个单个矩阵在运行时的维数,显然我不能手动定义浮点类型的9726格式说明符!!
使用的方法效率不高,因为它强制循环计算每个fasta文件中的序列数,因此可以在以后用于结构化numpy数组格式说明符,但这会降低算法的效率和速度。 / p>
我花了很多时间在互联网上寻找一个好的解决方案,我找到了一些有用的线程,但没有一个符合我的确切情况:(
This是我之前使用的工作的灵感来源,this在许多others旁边也很有用......但我需要以正确的方式做到似乎解决了我的具体问题。
所以,我的问题是:如何定义一个带字符串类型第一列和浮点类型9726其他不同唯一列的结构化数组? (请注意尺寸因固定尺寸而异)。
任何帮助都将受到高度赞赏,提前感谢...