Python / Numpy AttributeError:'float'对象没有属性'sin'

时间:2018-04-22 23:35:24

标签: python pandas numpy floating-point attributeerror

我要在这里张贴这个,因为它是一个十分栗子,让我头疼。它可以说是四年前发布的this question的副本,但我会再次发布它,以防有人拥有我在这里遇到的特定熊猫 - 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'

到目前为止我尝试过:

(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

另一方面,这个例外至少可以说是误导。自其他人发布此问题已有四年了。有没有人同意应该修改这个以及如何做出任何建议?异常的解释是什么? numpy正在进行某种地图操作并尝试调用sin的每个元素的θr方法吗?

我会尽快发布答案......

2 个答案:

答案 0 :(得分:2)

这失败的原因与:

相同
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的dtype,可以用以下方法解决:

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

答案 1 :(得分:0)

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

xr = xw + L*np.sin(θr.astype(float))

更好的解决方案。在创建数据帧时,从头开始获取数据类型。

而不是:

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

data.iloc[i, :] = new_data_dict

(我正在使用)

使用:

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)