2009-07-23 6 views
0

J'utilise l'algorithme décrit here pour ajuster les courbes gaussiennes à mes données.L'algorithme d'ajustement n'accepte pas mes données

Si je produis mon tableau de données avec:

x=linspace(1.,100.,100) 
data= 17*exp(-((x-10)/3)**2) 

tout fonctionne très bien.

Mais si je lis les données à partir d'un fichier texte à l'aide

file = open("d:\\test7.txt") 
arr=[] 
data=[] 


def column(matrix,i): 
    return [row[i] for row in matrix] 

for line in file.readlines(): 
    numbers=map(float, line.split()) 
    arr.append(numbers) 

data = column(arr,300) 
x=linspace(1.,115.,115) 

Je reçois le message d'erreur:

Traceback (most recent call last): 
File "readmatrix.py", line 60, in <module> fit(f, [mu, sigma, height], data) 
File "readmatrix.py", line 42, in fit if x is None: x = arange(y.shape[0]) 
AttributeError: 'list' object has no attribute 'shape' 

Pour autant que je peux voir, les valeurs incluses dans les données sont correctes, il ressemble à:

[0.108032, 0.86181600000000003, 1.386169, 3.2790530000000002, ... ] 

Est-ce que quelqu'un a une idée de ce que je fais mal?

Merci!

+3

@Dzz: vous n'incluez même pas les parties pertinentes de votre code source. La ligne 42 est où votre erreur se produit parce que vous utilisez "y.shape [0]" et y est un type de liste qui n'a pas un attribut de forme. Vous allez devoir inclure plus de sources pour que nous puissions trouver l'erreur correctement. –

+0

Désolé, j'espérais réduire la quantité de texte dans le message en liant le code. – Dzz

Répondre

4

La fonction d'ajustement attend les données sous la forme d'un tableau numpy (qui a un attribut de forme) et non d'une liste (qui ne l'est pas), d'où l'attribut AttributeError.

Convertir vos données:

def column(matrix,i): 
    return numpy.asarray([row[i] for row in matrix]) 
+0

Presque! Merci beaucoup pour l'indice! – Dzz

4

La solution de balpha n'est pas correcte; la solution est simplement de convertir ma liste en un tableau numpy via numpy.array.

Merci de m'avoir donné un indice!

+1

En quoi n'est-ce pas correct? (J'ai juste utilisé la documentation numpy, selon laquelle asarray devrait fonctionner, je n'ai pas installé numpy) Quelle erreur obtenez-vous? – balpha

+0

Il le fait, mais la commande arr.append (numbers) fait à nouveau une liste sur le numpy.array .. – Dzz

+0

arr.append (numbers) s'appelle * avant * column(), donc cela ne devrait pas faire de différence. Quoi qu'il en soit, tant que ça fonctionne ... :-) – balpha

Questions connexes