2017-08-14 2 views
4

J'ai un jeu de données pour différentes espèces végétales, et j'ai séparé chaque espèce en np.array. En essayant de générer des modèles gaussiens à partir de ces espèces, j'ai dû calculer les moyennes et les matrices de covariance pour chaque étiquette différente. Le problème est: lorsque vous utilisez np.cov() dans l'une des étiquettes, la fonction déclenche l'erreur "L'objet 'float' n'a pas d'attribut 'shape'" et je n'arrive pas vraiment à comprendre d'où vient le problème. La ligne de code exacte J'utilise est le suivant:numpy.cov() exception: l'objet 'float' n'a pas d'attribut 'shape'

covx = np.cov(label0, rowvar=False) 

Lorsque label0 est une ndarray numpy de forme (50,3), où les colonnes représentent les différentes variables et chaque rangée est une observation différente.

La trace d'erreur exacte est:

--------------------------------------------------------------------------- 
AttributeError       Traceback (most recent call last) 
<ipython-input-81-277aa1d02ff0> in <module>() 
     2 
     3 # Get the covariances 
----> 4 np.cov(label0, rowvar=False) 

C:\Users\Matheus\Anaconda3\lib\site-packages\numpy\lib\function_base.py in cov(m, y, rowvar, bias, ddof, fweights, aweights) 
    3062    w *= aweights 
    3063 
-> 3064  avg, w_sum = average(X, axis=1, weights=w, returned=True) 
    3065  w_sum = w_sum[0] 
    3066 

C:\Users\Matheus\Anaconda3\lib\site-packages\numpy\lib\function_base.py in average(a, axis, weights, returned) 
    1143 
    1144  if returned: 
-> 1145   if scl.shape != avg.shape: 
    1146    scl = np.broadcast_to(scl, avg.shape).copy() 
    1147   return avg, scl 

AttributeError: 'float' object has no attribute 'shape' 

Toute idée de ce qui se passe mal?

+0

'label0' semble être un flottant plutôt qu'un tableau. –

+0

Selon la documentation de ['np.cov'] (https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.cov.html), le paramètre doit avoir une ligne par variable et une colonne par observation, et non l'inverse. – jdehesa

+0

Quelle est votre version de NumPy? – MSeifert

Répondre

6

L'erreur est reproductible si le tableau est de dtype=object:

import numpy as np 

label0 = np.random.random((50, 3)).astype(object) 
np.cov(label0, rowvar=False) 

AttributeError: 'float' object has no attribute 'shape'

Si possible, vous devez le convertir en un type numérique. Par exemple:

np.cov(label0.astype(float), rowvar=False) # works 

Note: object tableaux sont rarement utiles (ils sont lents et toutes les fonctions numpy traitent gracieusement avec ces - comme dans ce cas), il pourrait être judicieux de vérifier d'où il vient et aussi répare ça.

+0

Spot sur! Quelqu'un d'autre a déjà répondu avec ce correctif, mais puisque vous lui avez donné une réponse, je le mettrai à jour. –

+2

* "... vérifier d'où il vient ..." * En cas de doute, suspectez les Pandas. –

+0

@MatGomes Je suis content que ça a marché. Ne pas oublier de [accepter] (https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) la réponse la plus utile si cette réponse a résolu votre problème. – MSeifert