IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

ValueError quand j'essaye d'affecter une valeur [Python 3.X]


Sujet :

Python

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 29
    Points : 27
    Points
    27
    Par défaut ValueError quand j'essaye d'affecter une valeur
    Bonjour à tous,

    Je suis actuellement à la fin de mon algorithme Kmeans, mais quand je le lance j'ai une erreur où je n'arrive pas à trouver l'erreur.
    Quand j'essaye de faire la même opération sur le shell cela marche mais pas dans mon programme.

    Voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    import matplotlib.pyplot as plt
    import numpy as np #Import numpy locally in variable np
    import sys
    import math as m
    import seaborn as sns; sns.set()
    import matplotlib.cm as cmx
    import matplotlib.colors as colors
    from numpy import linalg as LA
     
    #Fonction read_data permet de lire les données d'un fichier formaté et de resortir un array des éléments du fichier
    def read_data(file_name):
    	data_file = open(file_name, 'r')
    	dat = (data_file.read()).split("\n")
    	data_file.close()
    	dat.pop()
    	dataread =[]
    	for d in dat:
    		esp = d.find(' ')
    		x = d[:esp]
    		y = d[esp+1:]
    		dataread.append((int(x), int(y)))
    	del dat
    	return np.asarray(dataread)
     
    #Fonction init_centroids ressort k centroids aléatoire
    def init_centroids (datas, k):
    	centroids_create = datas.copy()
    	np.random.shuffle(centroids_create)
    	return np.asarray9centroids_create[:k])
     
     
     
    '''Fonction close_centroid nous permet de calculer pour chaque élément le centroides qui lui est le plus proche et le ressort sous forme
    de array'''
    def close_centroid(datas, centds):
    	pproche = []
    	for ind in datas:
    		normes = []
    		for cen in centds:
    			normes.append(m.sqrt((cen[0]-ind[0])**2 + (cen[1]-ind[1])**2))
    		pproche.append(normes.index(min(normes)))
    	return np.asarray(pproche)
     
     
     
    '''Fonction movmnt_centroids calcul la moyenne des vecteurs de chaque points par rapport à son centroide le plus proche
    qui le déplace ensuite par rapport à ce vecteur moyen'''
    def movmnt_centroids(dat, pclose, cent):
    	for i in range(len(cent)):
    		indices = np.where(pclose == i)
    		sumx = 0
    		sumy = 0
    		for j in indices:
    			sumx += dat[j][0]
    			sumy += dat[j][1]
    		card = len(indices)
    		cent[i][0] = sumx//card
    		cent[i][1] = sumy//card
    	return cent
     
    #Fonction qui affecte les nouvelles positions des centroids
    def ite_movmt_centro(data,centr):
    	done = False
    	epsi = 0.000000000000001
    	def ecart (copie,origin,index):
    		ex = abs(ccentre[index][0] - centr[index][0])
    		ey = abs(ccentre[index][1] - centr[index][1])
    		return True if (ex <= epsi and ey <= epsi) else False
     
    	while (not done):
    		ccentre = centr.copy
    		pp = close_centroid(data,centr)
    		centr = movmnt_centroids(data, pp, centr)
    		for i in range(len(ccentre)):
    			if ecart(ccentre,centr,i):
    				if (i == (len(ccentre)-1)):
    					done = False
    				else:
    					pass
    			else:
    				break
    	return centr
     
    #get_cmap permet de créer un array avec N couleurs différente
    def get_cmap(N):
    	color_norm = colors.Normalize(vmin=0, vmax=N-1)
    	scalar_map = cmx.ScalarMappable(norm=color_norm,cmap='hsv')
    	def map_index_to_rgb_color(index):
    		return scalar_map.to_rgba(index)
    	return map_index_to_rgb_color
     
     
     
     
    '''Fonction kmeans, est la fonction principale qui appelle toute les fonctions ci-dessus. Elle sort un array avec les
    coordonnées de chaque centroide après que les centroides convergent et affiche dans une figure le grpahique de chaque
    chaque points avant et après application de kmeans'''
    def kmeans(data, k):
    	plt.subplot(121)
    	centroids = init_centroids(data, k)
    	cmap = get_cmap(k+1)
    	ccentroids = close_centroid(data, centroids)
     
    	for i in range(len(ccentroids)):
    		plt.scatter(data[i, 0], data[i, 1], c=cmap(ccentroids[i]))
    	plt.scatter(centroids[:, 0], centroids[:, 1], s=20, c='black')
    	plt.title('Avant mouvement des centroïdes')
    	plt.grid(False)
    	plt.axis('off')
     
    	plt.subplot(122)
    	centroids = ite_movmt_centro(data,centroids)
    	ccentroids = close_centroid(data, centroids)
    	for i in range(len(ccentroids) - 1):
    		plt.scatter(data[i, 0], data[i, 1], c=cmap(ccentroids[i]))
    	plt.scatter(centroids[:, 0], centroids[:, 1], s=20, c='black')
    	plt.title('Après mouvement des centroïdes')
    	plt.grid(False)
    	plt.axis('off')
     
    	fig = plt.gcf()
    	fig.canvas.set_window_title('Algorirthme K-Means')
    	print("Coordonnée des centroides :")
     
    	plt.show()
    	return centroids
     
     
     
    #Fonction kmeans_rand appelle kmean avec des données aléatoire
    def kmeans_rand(min,max,n,k):
    	return kmeans(np.random.randint(min, max, size=(n, 2)), k)
     
     
     
    #Fonction kmeans_file appelle kmean avec des données pris d'un fichier
    def kmeans_file(file_n,k):
    	return kmeans(np.array(read_data(file_n)), k)
    L'erreur que je rencontre, que ce soit quand je lance la fonction kmeans_rand ou kmeans_file est la suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    >>> tipe.kmeans_rand(1,100,300,5)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/Users/davidrigaux/Documents/GIT/Big_Data/CPI2/algorithmes/kmeans/kmeans/tipe.py", line 144, in kmeans_rand
        return kmeans(np.random.randint(min, max, size=(n, 2)), k)
      File "/Users/davidrigaux/Documents/GIT/Big_Data/CPI2/algorithmes/kmeans/kmeans/tipe.py", line 124, in kmeans
        centroids = ite_movmt_centro(data,centroids)
      File "/Users/davidrigaux/Documents/GIT/Big_Data/CPI2/algorithmes/kmeans/kmeans/tipe.py", line 85, in ite_movmt_centro
        centr = movmnt_centroids(data, pp, centr)
      File "/Users/davidrigaux/Documents/GIT/Big_Data/CPI2/algorithmes/kmeans/kmeans/tipe.py", line 69, in movmnt_centroids
        cent[i][0] = sumx//card
    ValueError: setting an array element with a sequence.
    cependant je ne sais pas pourquoi il n'arrive pas à faire l'affectation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cent[i][0] = sumx//card
    Avez vous une idée comment résoudre ce problème ?

    Merci d'avance,

    Rigaux

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    Dans ces cas là on commence à vérifier avec print

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    		card = len(indices)
                    print(sumx, card, sumx//card)
                    ...

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 29
    Points : 27
    Points
    27
    Par défaut
    Ah oui en effet c'est pas normal.

    En modifiant le code ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    def movmnt_centroids(dat, pclose, cent):
    	for i in range(len(cent)):
    		indices = np.where(pclose == i)
    		sumx = 0
    		sumy = 0
    		for j in indices:
    			sumx += dat[j][0]
    			print(dat[j][0])
    			sumy += dat[j][1]
    		card = len(indices)
    		print(sumx,card,sumx//card)
    		cent[i][0] = sumx//card
    		cent[i][1] = sumy//card
    	return cent
    Cela affiche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    >>> tipe.kmeans_file("dataset.in",5)
    [128   2]
    [128   2] 1 [128   2]
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/Users/davidrigaux/Documents/GIT/Big_Data/CPI2/algorithmes/kmeans/kmeans/tipe.py", line 152, in kmeans_file
        return kmeans(np.array(read_data(file_n)), k)
      File "/Users/davidrigaux/Documents/GIT/Big_Data/CPI2/algorithmes/kmeans/kmeans/tipe.py", line 126, in kmeans
        centroids = ite_movmt_centro(data,centroids)
      File "/Users/davidrigaux/Documents/GIT/Big_Data/CPI2/algorithmes/kmeans/kmeans/tipe.py", line 87, in ite_movmt_centro
        centr = movmnt_centroids(data, pp, centr)
      File "/Users/davidrigaux/Documents/GIT/Big_Data/CPI2/algorithmes/kmeans/kmeans/tipe.py", line 71, in movmnt_centroids
        cent[i][0] = sumx//card
    ValueError: setting an array element with a sequence.
    Mais le problème c'est que je ne sais même pas pourquoi j'ai une valeur de ce format affecté à sumx

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 29
    Points : 27
    Points
    27
    Par défaut
    J'ai réussi à résoudre mon errue !

    Elle etait enfait dans la facon dont je prenais les indices de mon tableau
    Il manquait la balise [0] ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    indices = np.where(pclose == i)[0]
    Car cela me renvoyait un array avec un seul élément qui était la liste des indices mais ce que je voulais c'était un tableau avec pour chaque case un indice !

    Bref voilà
    Problème résolu

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 13/12/2006, 13h34
  2. Affecter une valeur à un input type text
    Par mr.t dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 01/06/2005, 15h18
  3. Réponses: 4
    Dernier message: 07/04/2005, 13h37
  4. Affecter une valeur à un radiobutton svp
    Par bigfoot dans le forum Bases de données
    Réponses: 5
    Dernier message: 30/12/2004, 11h17
  5. [scriplet] affecter une valeur par un bean:write
    Par viena dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 25/11/2004, 16h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo