numpyをストレスなく使う!(エラー「AttributeError: 'float' object has no attribute 'sin'」の解釈(対処?))


目的

 numpyをストレスなく使う!
Pythonで計算などをする場合には、numpyが頻繁に使われる。そのため、numpy関連のエラーに出会うことも少なくない。
エラーを早めに解決するためには、少しでも、理解のレベルを上げる必要あり。
なんでも、こだわって、、、、理解を深める。

ここで、取り上げるエラーは、以下。

AttributeError: 'float' object has no attribute 'sin'

どのような場面で出るかというと、例えば、以下。

>>>
>>> import numpy as np
>>> a = np.array([1.1, 2.2],dtype=object)
>>> np.sin(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'float' object has no attribute 'sin'
>>>

このエラーをとりあげる理由は、
エラーの意味がわからない
だろうと思うため。
'float'オブジェクトが、sinを持たない
と言われているが、そんな処理は、依頼してないし。。。。

検討環境

Name: numpy
Version: 1.16.4

エラーの説明

このエラーに対しては、以下の記事が参考になる。

ここでの報告者の方は、

Many NumPy methods fail if an array has dtype object, and produce a misleading error message.

他力で、日本語にすると(Google翻訳(ママ) )

配列にdtypeオブジェクトがある場合、多くのNumPyメソッドは失敗し、誤解を招くエラーメッセージが生成されます。

と主張されている。
⇒そのとおりだと思う。

このサイトでのやり取りの結論は、よくわからないのですが、、、
とにかく、
numpy側も
エラーメッセージがあまり適切でない
ことは、認めているよう。
治しているようにも読めるが。。。。治ってない気がします。

エラーの対処方法

エラーの対処方法は、そもそも、何がやりたいのかにもよるが、
経緯上、dtype=objectである必要があるのであれば、
sinの計算の前に、astypeでキャストする
などがいいと思う。

>>> a = np.array([1.1, 2.2],dtype=object)
>>> np.sin(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'float' object has no attribute 'sin'
>>> np.sin(a.astype(np.float64))
array([0.89120736, 0.8084964 ])
>>>

まとめ

わずかに、numpyに詳しくなった。
numpyは、深いので、まだ、誤差の範囲だと思うが。

関連(本人)

英語と日本語、両方使ってPythonを丁寧に学ぶ。

今後

numpy、学ぶぞーーーー。
コメントなどあれば、お願いします。