Python et list
Bonjour,
J'aimerais savoir comment on peut réduire la taille du code suivant si vous voyez ce que je veux dire merci pour le coup de main !
J'aimerais savoir comment on peut réduire la taille du code suivant si vous voyez ce que je veux dire merci pour le coup de main !
S=0 for i in range(C): for X in clusters[ i]: print("X", X) print("G", G[ i]) S = S + d2(X,G[ i]) print(S)
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Essaie peut-être avec zip.
-- Schnoebelen, Philippe
-- Schnoebelen, Philippe
-- Schnoebelen, Philippe
NameError: name 'self' is not defined
Je peux vous montrer ce que j'ai fait
Et
-- Schnoebelen, Philippe
Tu n'es pas clair car on ne sait même pas sur quelle ligne portait l'erreur dont tu as donné le message. Je crois qu'il faut que tu enlèves l'argument 'self' dans : Cela dit, je préfèrerais faire : dans KLoyds.__init__() même si cela répète la classe de base, car il y a des subtilités avec cette façon d'utiliser super() (voir ici et là ; cela fait fort longtemps que j'ai lu ces liens et honnêtement, j'en ai oublié le contenu ; mais j'en ai retenu que super() utilisé ainsi peut réserver de mauvaises surprises).
Comme je n'ai pas compris le problème de classes j'ai utilisé l'écriture
A présent je vais lire vos réponses.
ok je crois que j'avance
A présent il est pas content car TypeError: __init__() takes 4 positional arguments but 5 were given j'ai l'impression que ce n'est pas de me faute parce que j'ai bien quatres arguments même si positional argument est un mot inconnu pour moi.
Comme je savais pas comment faire j'ai mis
self.G = [self.data[0], self.data[1]] # Initialisation step
Mais bien évidement j'aimerais tirer deux points aléatoirement du tableau (500,2) appelé data
Les listes Python sont très flexibles et faciles à manipuler. On peut mettre n'importe quels objets dedans, y compris d'autres listes. Pour pouvoir gérer sainement le remplacement d'un élément par un autre, la permutation de deux éléments, le tri... il faut que ces opérations puissent être faites en modifiant quelque chose qui occupe très peu de mémoire : un pointeur vers l'objet remplit ce critère. Donc pour accéder à un élément, il faut 1) accéder au pointeur correspondant à l'indice spécifié (se fait en $O(1)$ d'après cette page SO et la FAQ de CPython), 2) lire ce pointeur et 3) le déréférencer, i.e. : lire ce qu'il y a à l'adresse du pointeur : un ou des octets représentant l'objet qui nous intéresse.
À l'inverse, les tableaux NumPy (à $n$ dimensions) contiennent un paquet d'objets tous du même type, qui prennent tous la même place. Ils peuvent donc a priori être stockés directement et de manière contiguë, ce qui permet d'y accéder plus vite en lecture comme en écriture (adresse de l'élément $L[k_1, \dotsc, k_n]$ du type $(\text{adresse début de } L) + k_1 S_1 + \dotsb + k_n S_n$ où $k_1, \dotsc, k_n$ représentent les indices et $S_1, \dotsc, S_n$ les tailles des « lignes » à chaque niveau, $S_n$ étant la taille d'un élément du tableau). Avec ce système, à l'adresse calculée, on a directement l'objet stocké dans telle ou telle case du tableau. Pas besoin de déréférencer un pointeur.
NumPy peut sans doute aussi effectuer des opérations simultanément sur divers éléments d'un tableau en utilisant les instructions vectorielles des processeurs actuels, à confirmer toutefois. Bref, NumPy permet d'être plus efficace lorsqu'on manipule des tableaux de nombres qui sont tous du même type (au sein d'un tableau donné). Par contre, cela nécessite un apprentissage. paul18 du forum a l'air de bien connaître et avait posté un exemple ici ainsi que des liens sur la vectorisation là (c.-à-d. la façon de traiter les données de type tableau qui permet d'obtenir du code efficace).
Pour ton accès à un élément aléatoire, je dirais que soit tu utilises random.randint() pour calculer chacun des deux indices, soit tu fais deux appels successifs à random.choice() : le premier renvoie une ligne choisie aléatoirement et le second un élément de cette ligne.
-- Schnoebelen, Philippe