Python / Numpy AttributeError: 'float' object has no attribute 'sin'
Python / Numpy AttributeError: 'float' object has no attribute 'sin'
我要在这里 post 因为它是一个栗子,让我有些头疼。它可以说是四年前 this question posted 的副本,但我会再次 post 它以防有人遇到我在这里遇到的特定 pandas-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
附带说明一下,至少可以说该异常具有误导性。自从另一个人 post 编辑这个问题已经四年了。有没有其他人同意应该对此进行修改以及关于如何修改的任何建议?异常的解释是什么? numpy 是否在进行某种映射操作并试图调用 θr
的每个元素的 sin
方法?
我会post 尽快回答...
失败的原因与以下相同:
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
(我正在使用)
使用:
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)
我要在这里 post 因为它是一个栗子,让我有些头疼。它可以说是四年前 this question posted 的副本,但我会再次 post 它以防有人遇到我在这里遇到的特定 pandas-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
附带说明一下,至少可以说该异常具有误导性。自从另一个人 post 编辑这个问题已经四年了。有没有其他人同意应该对此进行修改以及关于如何修改的任何建议?异常的解释是什么? numpy 是否在进行某种映射操作并试图调用 θr
的每个元素的 sin
方法?
我会post 尽快回答...
失败的原因与以下相同:
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
(我正在使用)
使用:
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)