Convertir la chaine d'ADN complémentaire en une matrice bina

Soma1316 Messages postés 17 Date d'inscription   Statut Membre Dernière intervention   -  
mamiemando Messages postés 33774 Date d'inscription   Statut Modérateur Dernière intervention   -

Bounjour,

S'il vous plaît comment résoudre cette probleme

Code:

binary_complement = np.zeros((img.height, img.width), dtype=int))
for i in range(img.height):
    for j in range(img.width):
        indexs = i * img.width + j 
        nucleotide = adn[indexs]
        if nucleotide == 'A':
            binary_complement[i, j] = '00'
        elif nucleotide == 'T':
            binary_complement[i, j] = '11'
        elif nucleotide == 'C':
            binary_complement[i, j] = '01'
        else:
            binary_complement[i, j] = '00'
print(binary_complement)

erreur:

IndexError: string index out of range 

Modération : merci de partager le code comme expliqué ici
 

A voir également:

2 réponses

yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 

bonjour,

si j'étais toi, j'examinerais la longueur de la chaine, comparée au produit des dimensions de l'image.

peux-tu partager du texte plutôt qu'une image?

0
mamiemando Messages postés 33774 Date d'inscription   Statut Modérateur Dernière intervention   7 882
 

Bonjour

Merci de partager le code comme expliqué ici

Il y a plusieurs choses qui ne vont pas :

  • L'erreur en elle-même a lieu ligne 5 : rien ne garantir que la chaîne adn est suffisamment longue pour que le caractère à l'index i * img.width + j existe. Dit autrement, le code actuel ne peut marcher que si :
    len(adn) >= img.width * img.height

    ce qui est faux en général. En l'occurrence, len(adn) est vraisemblablement trop courtes par rapport à la taille de l'image. Il faudrait donc décider de ce qu'il faut faire concernant les pixels restants. La manière la plus simple est de les laisser tels quels en interrompant la boucle:
     

    binary_complement = np.zeros((img.height, img.width), dtype=int))
    for i in range(img.height):
        for j in range(img.width):
            indexs = i * img.width + j
            if indexs >= len(adn):
                print("Chaîne ADN trop courte")
                break
            ...
  • La manière dont est initialisé la matrice n'est pas top. Il vaudrait mieux choisir un type numpy (par exemple np.uint32 soit 4 octets par case)
  • Tu stockes dans la case (i, j) un trois caractères par exemple '1' '0' et '\0' soit trois octets. Mais ça n'est pas une valeur binaire que tu stockes (qui elle tiendrait en 2 bits soit moins d'un octet). Or les fonctions traditionnellement utilisées pour rendre une image sous forme de numpy.array en nuance de gris s'attendent à avoir une matrice pour laquelle chaque entier est une valeur stockée sur un octet. Il vaudrait donc mieux remplacer ces chaînes par leur valeur numérique (0 au lieu de "00" ; 1 au lieu de "01", 2 au lieu de "10", 3 au lieu de "11", etc)

Bonne chance

0