numpy.cov() 异常:“float”对象没有属性“shape”

Posted

技术标签:

【中文标题】numpy.cov() 异常:“float”对象没有属性“shape”【英文标题】:numpy.cov() exception: 'float' object has no attribute 'shape' 【发布时间】:2018-01-22 01:18:12 【问题描述】:

我有一个不同植物物种的数据集,我将每个物种分成不同的np.array

当尝试从这些物种中生成高斯模型时,我必须计算每个不同标签的均值和协方差矩阵。

问题是:在其中一个标签中使用np.cov() 时,函数会引发错误“'float' object has no attribute 'shape'”,我无法真正弄清楚问题出在哪里。我正在使用的确切代码行如下:

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

label0 是一个形状为 (50,3) 的 numpy ndarray,其中的列代表不同的变量,每一行是不同的观察值。

确切的错误跟踪是:

---------------------------------------------------------------------------
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'

对出了什么问题有任何想法吗?

【问题讨论】:

label0 似乎是一个浮点数而不是一个数组。 根据np.cov的文档,参数应该是每个变量一行,每个观察一列,而不是相反。 @COLDSPEED 当我打印 label0 的类型时说 np.ndarray。打印出它所说的形状(50,3)。所以肯定不是float,而是float数组哈哈 @jdehesa 这是默认设置,是的,每个变量一行,每个观察一列。但是,如果你阅读了文档,如果你有描述的矩阵的转置,你可以传递 rowvar=False。 只是为了确定:label0.dtype 是什么? minimal, complete and verifiable example 会有所帮助——我们可以运行它来重现错误。 【参考方案1】:

如果数组是dtype=object,则该错误是可重现的:

import numpy  as np

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

AttributeError: 'float' 对象没有属性 'shape'

如果可能,您应该将其转换为数字类型。例如:

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

注意:object 数组很少有用(它们很慢,而且并非所有 NumPy 函数都能优雅地处理这些 - 就像在这种情况下一样),因此检查它的来源并修复它可能是有意义的。

【讨论】:

看准了!其他人已经回复了这个修复,但既然你给了它一个答案,我会更新它。 "...检查它的来源..." 如有疑问,请怀疑 Pandas。 @MatGomes 我很高兴它成功了。如果该答案解决了您的问题,请不要忘记accept 最有帮助的答案。【参考方案2】:

试试

    label0.astype(float32)

然后计算你的 cov。

这可能是因为您的 dtype 是对象。

【讨论】:

以上是关于numpy.cov() 异常:“float”对象没有属性“shape”的主要内容,如果未能解决你的问题,请参考以下文章

火花地图作业异常:对象不可序列化

生成 numpy.MultivariateNormal 时出现 MemoryError

PCA主成分分析

Interrupted Exception异常可能没你想的那么简单!

Python3.4.1异常: 'float' object cannot be interpreted as an integer

很多程序员多年都没掌握的异常处理技巧和原则