web-dev-qa-db-fra.com

exception numpy.cov (): l'objet 'float' n'a pas d'attribut 'shape'

J'ai un ensemble de données pour différentes espèces de plantes et j'ai séparé chaque espèce en un np.array Différent.

Lorsque j'ai essayé 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 'forme'" et je ne peux pas vraiment comprendre d'où vient le problème . La ligne de code exacte que j'utilise est la suivante:

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

label0 Est un tableau numérique de forme (50,3), où les colonnes représentent différentes variables et chaque ligne 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'

Des idées sur ce qui ne va pas?

11
Mat Gomes

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: l'objet 'float' n'a pas d'attribut 'shape'

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

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

Remarque: les tableaux object sont rarement utiles (ils sont lents et toutes les fonctions NumPy ne les traitent pas avec élégance - comme dans ce cas), il pourrait donc être judicieux de vérifier d'où elles viennent et de corriger cela.

13
MSeifert