Convertir image en chaine d'ADN

Résolu
Soma1316 Messages postés 17 Date d'inscription   Statut Membre Dernière intervention   -  
Soma1316 Messages postés 17 Date d'inscription   Statut Membre Dernière intervention   -

Bonjour,

Ce code convertit trois matrices RGB en chaînes d'ADN, mais cela n'a pas fonctionné pour moi. Alors où est le problème ?

import numpy as np
from PIL import Image

def binary_to_dna(bin_arr):
    dna_arr = []
    for i in range(0, len(bin_arr), 2):
        if bin_arr[i : i + 2] == [0, 0]:
            dna_arr.append('A')
        elif bin_arr[i : i + 2] == [0, 1]:
            dna_arr.append('C')
        elif bin_arr[i : i + 2] == [1, 0]:
            dna_arr.append('G')
        elif bin_arr[i : i + 2] == [1, 1]:
            dna_arr.append('T')
    return ''.join(dna_arr)

img = Image.open('C:/image.gif').convert('RGB')
pix = np.array(img)

# en pixel
red =  pix[:, :, 0]
green = pix[:, :, 1]
blue = pix[:, :, 2]

# en binaire 
r = np.unpackbits( red, axis=1)
g = np.unpackbits(green,axis=1)
b = np.unpackbits(blue,axis=1)

# en sequence ADN
r_dna = binary_to_dna(r)
g_dna = binary_to_dna(g)
b_dna = binary_to_dna(b)

Erreur:

c:\Users\ACER\code\test22.py:51: DeprecationWarning: elementwise comparison failed; this will raise an error in the future.

  if bin_arr[i:i+2]==[0,0]:

Merci

A voir également:

2 réponses

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

Bonjour,

En fait il faudrait déjà expliquer ce que tu veux faire, car il y a plusieurs manière de corriger ce message d'erreur, mais ces corrections n'ont pas la même signification. En particulier, on ne sait pas comment est encodée ton image. Dans le cas général pix est un np.array (H, W, N) où :

  • H est la hauteur de l'image,
  • W la largeur de l'image
  • N le nombre de canaux (typiquement 3 pour une image RGB)

Ton code semble supposer que W=1 et N=2. Est-ce le cas (que vaut pix.shape) ?

Ensuite il y a au moins quelque chose d'étrange sur la borne supérieure de i pour pouvoir parler de i+2 (quand i va attendre len(bin_arr) - 1, le slice ne va considérer qu'un seul élément de bin_arr).

Hormis cela, voici deux solutions possibles :

  • Soit tu compares deux np.array (mais il faut que tu sois conscient.e que dans bin_array[i : i + 2] comporte deux tableaux (note que selon ce que tu veux faire, all peut être remplacé par any)
def binary_to_dna(bin_arr):
    dna_arr = []
    for i in range(0, len(bin_arr) - 1, 2):
        if bin_arr[i : i + 2].all() == np.array([0, 0]).all():
            dna_arr.append('A')
        elif bin_arr[i : i + 2].all() == np.array([0, 1]).all():
            dna_arr.append('C')
        elif bin_arr[i : i + 2].all() == np.array([1, 0]).all():
            dna_arr.append('G')
        elif bin_arr[i : i + 2].all() == np.array([1, 1]).all():
            dna_arr.append('T')
    return ''.join(dna_arr)
  • Soit tu extrais les deux valeurs (au lieu de prendre un slice), puis tu fais une comparaison de listes.
def binary_to_dna(bin_arr):
    dna_arr = []
    for i in range(0, len(bin_arr) - 1, 2):
        l = [bin_arr[i, 0], bin_arr[i + 1, 0]]
        if l == [0, 0]: 
            dna_arr.append('A')
        elif l == [0, 1]: 
            dna_arr.append('C')
        elif l == [1, 0]: 
            dna_arr.append('G')
        elif l == [1, 1]: 
            dna_arr.append('T')
        break   
    return ''.join(dna_arr)

Bonne chance

1
Soma1316 Messages postés 17 Date d'inscription   Statut Membre Dernière intervention   1
 

Merci beaucoup.

0
babybop
 

Salut.

D'après ce que je comprends si on recherche cette erreur, est que tu compares 2 structures différentes.

Plein d'explications sont trouvables aisément.

Par ex.  https://stacktuts.com/how-to-fix-python-deprecationwarning-elementwise-comparison-failed-this-will-raise-an-error-in-the-future

0