Python/Numpy属性错误:';浮动';对象没有属性';罪恶';

Python/Numpy属性错误:';浮动';对象没有属性';罪恶';,python,pandas,numpy,floating-point,attributeerror,Python,Pandas,Numpy,Floating Point,Attributeerror,我要把这篇文章贴在这里,因为这是一篇很难理解的文章,让我有些头疼。它可以说是四年前发布的一个副本,但我会再次发布它,以防有人有我在这里遇到的特定的熊猫numpy不兼容。或许有人会想出更好的答案 代码段: #import pdb; pdb.set_trace() # TODO: This raises AttributeError: 'float' object has no attribute 'sin' xr = xw + L*np.sin(θr) 输出: Traceback (most

我要把这篇文章贴在这里,因为这是一篇很难理解的文章,让我有些头疼。它可以说是四年前发布的一个副本,但我会再次发布它,以防有人有我在这里遇到的特定的熊猫numpy不兼容。或许有人会想出更好的答案

代码段:

#import pdb; pdb.set_trace()

# TODO: This raises AttributeError: 'float' object has no attribute 'sin'
xr = xw + L*np.sin(θr)
输出:

Traceback (most recent call last):
  File "MIP_MPC_demo.py", line 561, in <module>
    main()
  File "MIP_MPC_demo.py", line 557, in main
    animation = create_animation(model, data_recorder)
  File "MIP_MPC_demo.py", line 358, in create_animation
    xr = xw + L*np.sin(θr)
AttributeError: 'float' object has no attribute 'sin'
回溯(最近一次呼叫最后一次):
文件“MIP_MPC_demo.py”,第561行,在
main()
文件“MIP_MPC_demo.py”,第557行,主
动画=创建动画(模型、数据记录器)
创建动画中第358行的文件“MIP_MPC_demo.py”
xr=xw+L*np.sin(θr)
AttributeError:“float”对象没有属性“sin”
到目前为止,我所尝试的:

(Pdb) type(np)
<class 'module'>
(Pdb) np.sin
<ufunc 'sin'>
(Pdb) type(θr)
<class 'pandas.core.series.Series'>
(Pdb) np.sin(θr.values)
*** AttributeError: 'float' object has no attribute 'sin'
(Pdb) θr.dtype
dtype('O')
(Pdb) np.sin(θr)
*** AttributeError: 'float' object has no attribute 'sin'
(Pdb) θr.sin()
*** AttributeError: 'Series' object has no attribute 'sin'
(Pdb) θr.values.sin()
*** AttributeError: 'numpy.ndarray' object has no attribute 'sin'
(Pdb) θr.values.max()
nan
(Pdb) np.max(θr)
0.02343020407511865
(Pdb) np.sin(θr)
*** AttributeError: 'float' object has no attribute 'sin'
(Pdb) np.sin(θr[0])
0.0
(Pdb)类型(np)
(Pdb)np.sin
(Pdb)型(θr)
(Pdb)np.sin(θr.值)
***AttributeError:“float”对象没有属性“sin”
(Pdb)θr.dtype
数据类型('O')
(Pdb)np.sin(θr)
***AttributeError:“float”对象没有属性“sin”
(Pdb)θr.sin()
***AttributeError:“Series”对象没有属性“sin”
(Pdb)θr.values.sin()
***AttributeError:'numpy.ndarray'对象没有属性'sin'
(Pdb)θr.values.max()
楠
(Pdb)np.max(θr)
0.02343020407511865
(Pdb)np.sin(θr)
***AttributeError:“float”对象没有属性“sin”
(Pdb)np.sin(θr[0])
0
另一方面,这个例外至少可以说是误导性的。已经四年没有另一个人发布这个问题了。是否有其他人同意这一点,以及如何修改的建议?对例外情况的解释是什么?numpy是否正在执行某种映射操作并试图调用
θr
的每个元素的
sin
方法


我将很快发布答案…

这失败的原因与:

import numpy as np
arr = np.array([1.0, 2.0, 3.0], dtype=object)
np.sin(arr)
# AttributeError: 'float' object has no attribute 'sin'
在对象数组上调用
np.sin
时,它尝试调用每个元素的
sin
方法

如果您知道
θr.values
的数据类型,可以使用以下方法解决此问题:

arr = np.array(θr.values).astype(np.float64)  # assuming the type is float64
np.sin(arr)  # ok!

如果您知道θr的可能数据类型,则快速修复:

xr = xw + L*np.sin(θr.astype(float))
更好的解决方案。在创建数据帧时,从一开始就正确获取数据类型

而不是:

self.data = pd.DataFrame(index=range(n), columns=columns)
...

data.iloc[i, :] = new_data_dict
(我正在使用)

使用:

或:

或:


θr.值的类型是什么?您是正确的。然而,在我的例子中,我并不是从numpy数组开始的。如果我有它就会有正确的数据类型。我创建了一个空的数据帧,然后用浮点值填充它。DataFrame的默认类型是object,如果用float填充它,则它不会更改。。。。谢谢
data = pd.DataFrame(index=range(n), columns=columns, dtype=float)
data = pd.DataFrame(data=np.empty((n, len(columns)), columns=columns)
data = pd.DataFrame(np.full((n, len(columns), np.nan), columns=columns)