在python中为非常大的结构化数组定义数据类型的有效方法

时间:2015-02-17 22:34:08

标签: python numpy

我正在使用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其他不同唯一列的结构化数组? (请注意尺寸因固定尺寸而异)。

任何帮助都将受到高度赞赏,提前感谢...

0 个答案:

没有答案