静かなる名辞

pythonとプログラミングのこと

2019/03/22:TechAcademyがteratailの質問・回答を盗用していた件
2019/03/26:TechAcademy盗用事件 公式発表と深まる疑念



【python】numpyで任意の底でlog

 任意の底でlogを計算したいときがあります。

 結論から言うと、そういう関数は用意されていません。log, log10, log2はあるんですが。

Mathematical functions — NumPy v1.16 Manual

 ほしければ、自分でlog(底)で割ってあげます。

>>> import numpy as np
>>> a = 59**5
>>> np.log(a)/np.log(59)
5.0

 対数の性質を思い出せばそれほど難しくないのですが、デフォルトであると便利ですね。math.logなら一発でできるんですが。

>>> import math
>>> math.log(a, 59)
5.0

 おまけ。

 最初、すごく大きな値でやろうとしたらエラーが出ました。

>>> a = 59**100
>>> np.log(a)/np.log(59)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'int' object has no attribute 'log'
>>> a
1216749465718417874559491998513561121966072058691773438388982975785993854256756157494173512672915757033875049659241870497099358702416318491812748479721683887882543089775014614001

 これは多倍長整数だから表現できているのであって、int64とかでは表現できないためエラーになるということですね。floatに直したら行けました。

>>> float(a)
1.2167494657184178e+177
>>> np.log(float(a))/np.log(59)
100.0

 精度は有効桁数に縛られますが(doubleの有効桁数はたかだか15桁)、割とどうでも良い。