在python 3.5中生成位字符串时出错:数据类型被设置为U32,而没有我的控制

在python 3.5中生成位字符串时出错:数据类型被设置为U32,而没有我的控制,python,string,numpy,type-conversion,Python,String,Numpy,Type Conversion,我正在使用一个函数来构建一个字符串数组(恰好只有0和1),它们非常大。当我构建较小的字符串时,该函数可以工作,但不知何故,数据类型似乎将字符串的大小限制为32个字符长(U32),而我没有要求它。我错过了一些简单的东西吗 在构建字符串时,我首先将它们转换为列表,以便在再次将它们合并到字符串之前更容易地操作单个字符。我的方法是否限制了我使用“较大”数据类型的能力?在本例中,np.max(CM1)的值大约为300(最近的一次运行产生了253个字符),但字符串的长度只有32个字符 ''' Functio

我正在使用一个函数来构建一个字符串数组(恰好只有0和1),它们非常大。当我构建较小的字符串时,该函数可以工作,但不知何故,数据类型似乎将字符串的大小限制为32个字符长(U32),而我没有要求它。我错过了一些简单的东西吗

在构建字符串时,我首先将它们转换为列表,以便在再次将它们合并到字符串之前更容易地操作单个字符。我的方法是否限制了我使用“较大”数据类型的能力?在本例中,np.max(CM1)的值大约为300(最近的一次运行产生了253个字符),但字符串的长度只有32个字符

''' Function to derive genome and count mutations in provided list of cells ''' 
def derive_genome_biopsy(biopsy_list, family_dict, CM1):
    derived_genomes_inBx = np.zeros(len(biopsy_list)).astype(str)
    for position, cell in np.ndenumerate(biopsy_list):
        if cell == 0: continue
        temp_parent = 2
        bitstring = list('1')
        bitstring += (np.max(CM1)-1)*'0'
        if cell == 1:
            derived_genomes_inBx[position] = ''.join(bitstring)
            continue 
        else:
            while temp_parent > 1:
                temp_parent = family_dict[cell]
                bitstring[cell-1] = '1'
                if temp_parent == 1: break
                cell = family_dict[cell]
            derived_genomes_inBx[position] = ''.join(bitstring)
    return derived_genomes_inBx
我得到的具体错误消息是:

Traceback (most recent call last):
  File "biopsyCA.py", line 77, in <module>
    if genome[site] == '1': 
IndexError: string index out of range
回溯(最近一次呼叫最后一次):
文件“biopsyCA.py”,第77行,在
如果基因组[位点]=“1”:
索引器错误:字符串索引超出范围

family_dict是一本字典,其中包含了父母和孩子的列表,上面的算法通过这些列表从分支家谱中重建个体的“基因组”。它基本上将位字符串中的位置设置为“1”,如果你的父母有,那么如果你的祖父母等。。。在到达第一位(始终为“1”)之前,应该执行此操作。

此行中的float64数组到字符串数组的转换限制为32个字符:

derived_genomes_inBx = np.zeros(len(biopsy_list)).astype(str)
结果数组包含数据类型S32值,该值将内容限制为32个字符

若要更改此限制,请使用“S300”或更大值而不是str


您也可以使用
map(str,np.zeros(len(bioping_list))
来获得更灵活的字符串列表,并在填充后使用
numpy.array()
将其转换回numpy数组。

多亏了这里和本地许多人的帮助,我终于完成了这项工作,工作功能是:

''' Function to derive genome and count mutations in provided list of cells ''' 
def derive_genome_biopsy(biopsy_list, family_dict, CM1):
    derived_genomes_inBx = list(map(str, np.zeros(len(biopsy_list))))
    for biopsy in range(0,len(biopsy_list)):
        if biopsy_list[biopsy] == 0:
            bitstring = (np.max(CM1))*'0'
            derived_genomes_inBx[biopsy] = ''.join(bitstring)
            continue
        bitstring = list('1')
        bitstring += (np.max(CM1)-1)*'0'
        if biopsy_list[biopsy] == 1:
            derived_genomes_inBx[biopsy] = ''.join(bitstring)
            continue 
        else:
            temp_parent = family_dict[biopsy_list[biopsy]]
            bitstring[biopsy_list[biopsy]-1] = '1'
            while temp_parent > 1:
                temp_parent = family_dict[position]
                bitstring[temp_parent-1] = '1'
                if temp_parent == 1: break          
            derived_genomes_inBx[biopsy] = ''.join(bitstring)
    return derived_genomes_inBx
最初的问题是Teppo Tammisto指出了采用“S32”格式的“str”数据结构的问题功能最初的代码中还出现了一些问题,我现在已经解决了。当我完成本论文的章节时,我将发布整个函数家族,用于虚拟地“活检”细胞自动机模型(实际上,只是一个数组),并从家族树数据和当前自动机状态向量重建“基因组”


谢谢大家!

如果您发布了一篇文章,您将增加更改以获得一个好的答案。这是Python 2还是Python 3?请将您的问题包括在您的评论中。类似的重要细节不应隐藏在评论部分。您是否尝试过打印
np.max(CM1)-1
确定这是你认为的吗?我已经按照你建议的Kevin和Mike编辑了这个问题。此外,我还打印了np.max(CM1)-1得到了253。thanksI使用了“S300”解决方案,它成功了-谢谢。但是,它后来在我的代码中引发了一个新的错误…后来,我想对每个基因组中给定位置的所有数字求和,而试图操纵位字符串的单个成员时出现了一个问题。我只是傻了吗?还有,映射解决方案不能吗关于你建议的工作…对不起,我错了。Map在Python2中是这样工作的,但在Python3中它需要是
list(Map(str,np.zeros(len(bioping_list)))