Convertir image en chaine d'ADN

Résolu/Fermé
Soma1316 Messages postés 17 Date d'inscription vendredi 3 mars 2023 Statut Membre Dernière intervention 25 mai 2023 - Modifié le 5 avril 2023 à 15:28
Soma1316 Messages postés 17 Date d'inscription vendredi 3 mars 2023 Statut Membre Dernière intervention 25 mai 2023 - 6 avril 2023 à 07:05

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 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
Modifié le 5 avril 2023 à 15:46

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 vendredi 3 mars 2023 Statut Membre Dernière intervention 25 mai 2023 1
6 avril 2023 à 07:05

Merci beaucoup.

0

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