Correct, np.log(x) is the Natural Log (base e log) of x.
For other bases, remember this law of logs: log-b(x) = log-k(x) / log-k(b) where log-b is the log in some arbitrary base b, and log-k is the log in base k, e.g.
How should I compute log to the base two in python. Eg. I have this equation where I am using log base 2
import math
e = -(t/T)* math.log((t/T)[, 2])
回答 0
很高兴知道
但也知道它
math.log带有一个可选的第二个参数,该参数允许您指定基数:
In[22]:import mathIn[23]: math.log?Type: builtin_function_or_methodBaseClass:<type 'builtin_function_or_method'>StringForm:<built-in function log>Namespace:InteractiveDocstring:
log(x[, base])-> the logarithm of x to the given base.If the base not specified, returns the natural logarithm (base e) of x.In[25]: math.log(8,2)Out[25]:3.0
but also know that
math.log takes an optional second argument which allows you to specify the base:
In [22]: import math
In [23]: math.log?
Type: builtin_function_or_method
Base Class: <type 'builtin_function_or_method'>
String Form: <built-in function log>
Namespace: Interactive
Docstring:
log(x[, base]) -> the logarithm of x to the given base.
If the base not specified, returns the natural logarithm (base e) of x.
In [25]: math.log(8,2)
Out[25]: 3.0
Python frexp() calls the C function frexp() which just grabs and tweaks the exponent.
Python frexp() returns a tuple (mantissa, exponent). So [1] gets the exponent part.
For integral powers of 2 the exponent is one more than you might expect. For example 32 is stored as 0.5×2⁶. This explains the - 1 above. Also works for 1/32 which is stored as 0.5×2⁻⁴.
Floors toward negative infinity, so log₂31 computed this way is 4 not 5. log₂(1/17) is -5 not -4.
If you are on python 3.3 or above then it already has a built-in function for computing log2(x)
import math
'finds log base2 of x'
answer = math.log2(x)
If you are on older version of python then you can do like this
import math
'finds log base2 of x'
answer = math.log(x)/math.log(2)
回答 3
使用numpy:
In[1]:import numpy as npIn[2]: np.log2?Type: functionBaseClass:<type 'function'>StringForm:<function log2 at 0x03049030>Namespace:InteractiveFile: c:\python26\lib\site-packages\numpy\lib\ufunclike.pyDefinition: np.log2(x, y=None)Docstring:Return the base 2 logarithm of the input array, element-wise.Parameters----------
x : array_likeInput array.
y : array_likeOptional output array with the same shape as`x`.Returns-------
y : ndarrayThe logarithm to the base 2 of `x` element-wise.NaNs are returned where `x`is negative.SeeAlso--------
log, log1p, log10Examples-------->>> np.log2([-1,2,4])
array([NaN,1.,2.])In[3]: np.log2(8)Out[3]:3.0
In [1]: import numpy as np
In [2]: np.log2?
Type: function
Base Class: <type 'function'>
String Form: <function log2 at 0x03049030>
Namespace: Interactive
File: c:\python26\lib\site-packages\numpy\lib\ufunclike.py
Definition: np.log2(x, y=None)
Docstring:
Return the base 2 logarithm of the input array, element-wise.
Parameters
----------
x : array_like
Input array.
y : array_like
Optional output array with the same shape as `x`.
Returns
-------
y : ndarray
The logarithm to the base 2 of `x` element-wise.
NaNs are returned where `x` is negative.
See Also
--------
log, log1p, log10
Examples
--------
>>> np.log2([-1, 2, 4])
array([ NaN, 1., 2.])
In [3]: np.log2(8)
Out[3]: 3.0
def lg(x, tol=1e-13):
res =0.0# Integer partwhile x<1:
res -=1
x *=2while x>=2:
res +=1
x /=2# Fractional part
fp =1.0while fp>=tol:
fp /=2
x *= xif x >=2:
x /=2
res += fpreturn res
def lg(x, tol=1e-13):
res = 0.0
# Integer part
while x<1:
res -= 1
x *= 2
while x>=2:
res += 1
x /= 2
# Fractional part
fp = 1.0
while fp>=tol:
fp /= 2
x *= x
if x >= 2:
x /= 2
res += fp
return res
回答 5
>>>def log2( x ):...return math.log( x )/ math.log(2)...>>> log2(2)1.0>>> log2(4)2.0>>> log2(8)3.0>>> log2(2.4)1.2630344058337937>>>
from numpy import zeros, array
from math import sin, log
from newtonRaphson2 import*def f(x):
f = zeros(len(x))
f[0]= sin(x[0])+ x[1]**2+ log(x[2])-7.0
f[1]=3.0*x[0]+2.0**x[1]- x[2]**3+1.0
f[2]= x[0]+ x[1]+ x[2]-5.0return f
x = array([1.0,1.0,1.0])print newtonRaphson2(f,x)
当我运行它时,它显示以下错误:
File"example NR2method.py", line 8,in f
f[0]= sin(x[0])+ x[1]**2+ log(x[2])-7.0ValueError: math domain error
I was just testing an example from Numerical Methods in Engineering with Python.
from numpy import zeros, array
from math import sin, log
from newtonRaphson2 import *
def f(x):
f = zeros(len(x))
f[0] = sin(x[0]) + x[1]**2 + log(x[2]) - 7.0
f[1] = 3.0*x[0] + 2.0**x[1] - x[2]**3 + 1.0
f[2] = x[0] + x[1] + x[2] -5.0
return f
x = array([1.0, 1.0, 1.0])
print newtonRaphson2(f,x)
When I run it, it shows the following error:
File "example NR2method.py", line 8, in f
f[0] = sin(x[0]) + x[1]**2 + log(x[2]) - 7.0
ValueError: math domain error
I have narrowed it down to the log as when I remove log and add a different function, it works. I assume it is because of some sort of interference with the base, I can’t figure out how. Can anyone suggest a solution?
Your code is doing a log of a number that is less than or equal to zero. That’s mathematically undefined, so Python’s log function raises an exception. Here’s an example:
>>> from math import log
>>> log(-1)
Traceback (most recent call last):
File "<pyshell#59>", line 1, in <module>
log(-1)
ValueError: math domain error
Without knowing what your newtonRaphson2 function does, I’m not sure I can guess where the invalid x[2] value is coming from, but hopefully this will lead you on the right track.
You are trying to do a logarithm of something that is not positive.
Logarithms figure out the base after being given a number and the power it was raised to. log(0) means that something raised to the power of 2 is 0. An exponent can never result in 0*, which means that log(0) has no answer, thus throwing the math domain error
*Note: 0^0 can result in 0, but can also result in 1 at the same time. This problem is heavily argued over.
What is the difference between 'log' and 'symlog'? In a simple test I did, they both looked exactly the same.
I know the documentation says they accept different parameters, but I still don’t understand the difference between them. Can someone please explain it? The answer will be the best if it has some sample code and graphics! (also: where does the name ‘symlog’ come from?)
回答 0
我终于找到了一些时间来做一些实验,以了解它们之间的区别。这是我发现的:
log仅允许使用正值,并允许您选择如何处理负值(mask或clip)。
symlog表示对数对称,并允许正值和负值。
symlog 允许在绘图内将范围设置为零左右,而不是对数,而是线性的。
我认为通过图形和示例,一切都将变得更容易理解,因此让我们尝试一下:
import numpy
from matplotlib import pyplot
# Enable interactive mode
pyplot.ion()# Draw the grid lines
pyplot.grid(True)# Numbers from -50 to 50, with 0.1 as step
xdomain = numpy.arange(-50,50,0.1)# Plots a simple linear function 'f(x) = x'
pyplot.plot(xdomain, xdomain)# Plots 'sin(x)'
pyplot.plot(xdomain, numpy.sin(xdomain))# 'linear' is the default mode, so this next line is redundant:
pyplot.xscale('linear')
# How to treat negative values?# 'mask' will treat negative values as invalid# 'mask' is the default, so the next two lines are equivalent
pyplot.xscale('log')
pyplot.xscale('log', nonposx='mask')
# 'clip' will map all negative values a very small positive one
pyplot.xscale('log', nonposx='clip')
# 'symlog' scaling, however, handles negative values nicely
pyplot.xscale('symlog')
# And you can even set a linear range around zero
pyplot.xscale('symlog', linthreshx=20)
为了完整起见,我使用以下代码保存每个图:
# Default dpi is 80
pyplot.savefig('matplotlib_xscale_linear.png', dpi=50, bbox_inches='tight')
I finally found some time to do some experiments in order to understand the difference between them. Here’s what I discovered:
log only allows positive values, and lets you choose how to handle negative ones (mask or clip).
symlog means symmetrical log, and allows positive and negative values.
symlog allows to set a range around zero within the plot will be linear instead of logarithmic.
I think everything will get a lot easier to understand with graphics and examples, so let’s try them:
import numpy
from matplotlib import pyplot
# Enable interactive mode
pyplot.ion()
# Draw the grid lines
pyplot.grid(True)
# Numbers from -50 to 50, with 0.1 as step
xdomain = numpy.arange(-50,50, 0.1)
# Plots a simple linear function 'f(x) = x'
pyplot.plot(xdomain, xdomain)
# Plots 'sin(x)'
pyplot.plot(xdomain, numpy.sin(xdomain))
# 'linear' is the default mode, so this next line is redundant:
pyplot.xscale('linear')
# How to treat negative values?
# 'mask' will treat negative values as invalid
# 'mask' is the default, so the next two lines are equivalent
pyplot.xscale('log')
pyplot.xscale('log', nonposx='mask')
# 'clip' will map all negative values a very small positive one
pyplot.xscale('log', nonposx='clip')
# 'symlog' scaling, however, handles negative values nicely
pyplot.xscale('symlog')
# And you can even set a linear range around zero
pyplot.xscale('symlog', linthreshx=20)
Just for completeness, I’ve used the following code to save each figure:
# Default dpi is 80
pyplot.savefig('matplotlib_xscale_linear.png', dpi=50, bbox_inches='tight')
symlog is like log but allows you to define a range of values near zero within which the plot is linear, to avoid having the plot go to infinity around zero.
In a log graph, you can never have a zero value, and if you have a value that approaches zero, it will spike down way off the bottom off your graph (infinitely downward) because when you take “log(approaching zero)” you get “approaching negative infinity”.
symlog would help you out in situations where you want to have a log graph, but when the value may sometimes go down towards, or to, zero, but you still want to be able to show that on the graph in a meaningful way. If you need symlog, you’d know.
回答 2
这是必须使用符号日志时的行为示例:
初始图,未缩放。注意多少点聚集在x〜0
ax = sns.scatterplot(x='Score', y ='Total Amount Deposited', data = df, hue ='Predicted Category')
I want to plot a graph with one logarithmic axis using matplotlib.
I’ve been reading the docs, but can’t figure out the syntax. I know that it’s probably something simple like 'scale=linear' in the plot arguments, but I can’t seem to get it right
Sample program:
import pylab
import matplotlib.pyplot as plt
a = [pow(10, i) for i in range(10)]
fig = plt.figure()
ax = fig.add_subplot(2, 1, 1)
line, = ax.plot(a, color='blue', lw=2)
pylab.show()
You can use the Axes.set_yscale method. That allows you to change the scale after the Axes object is created. That would also allow you to build a control to let the user pick the scale if you needed to.
The relevant line to add is:
ax.set_yscale('log')
You can use 'linear' to switch back to a linear scale. Here’s what your code would look like:
import pylab
import matplotlib.pyplot as plt
a = [pow(10, i) for i in range(10)]
fig = plt.figure()
ax = fig.add_subplot(2, 1, 1)
line, = ax.plot(a, color='blue', lw=2)
ax.set_yscale('log')
pylab.show()
from matplotlib import pyplot
a =[ pow(10,i)for i in range(10)]
pyplot.subplot(2,1,1)
pyplot.plot(a, color='blue', lw=2)
pyplot.yscale('log')
pyplot.show()
Here is a slightly cleaned up code, using only pyplot functions:
from matplotlib import pyplot
a = [ pow(10,i) for i in range(10) ]
pyplot.subplot(2,1,1)
pyplot.plot(a, color='blue', lw=2)
pyplot.yscale('log')
pyplot.show()
from pylab import*import matplotlib.pyplot as pyplot
a =[ pow(10,i)for i in range(10)]
fig = pyplot.figure()
ax = fig.add_subplot(2,1,1)
line,= ax.semilogy(a, color='blue', lw=2)
show()
from pylab import *
import matplotlib.pyplot as pyplot
a = [ pow(10,i) for i in range(10) ]
fig = pyplot.figure()
ax = fig.add_subplot(2,1,1)
line, = ax.semilogy(a, color='blue', lw=2)
show()
回答 3
如果要更改对数的底数,只需添加:
plt.yscale('log',basey=2)# where basex or basey are the bases of log
I know this is slightly off-topic, since some comments mentioned the ax.set_yscale('log') to be “nicest” solution I thought a rebuttal could be due. I would not recommend using ax.set_yscale('log') for histograms and bar plots. In my version (0.99.1.1) i run into some rendering problems – not sure how general this issue is. However both bar and hist has optional arguments to set the y-scale to log, which work fine.
So if you are simply using the unsophisticated API, like I often am (I use it in ipython a lot), then this is simply
yscale('log')
plot(...)
Hope this helps someone looking for a simple answer! :).
回答 6
您可以使用以下代码:
np.log(df['col_whose_log_you_need']).iplot(kind='histogram', bins=100,
xTitle ='log of col',yTitle ='Count corresponding to column',
title='Distribution of log(col_whose_log_you_need)')
np.log(df['col_whose_log_you_need']).iplot(kind='histogram', bins=100,
xTitle = 'log of col',yTitle ='Count corresponding to column',
title='Distribution of log(col_whose_log_you_need)')