[Python-ideas] real numbers with SI scale factors
Ken Kundert
python-ideas at shalmirane.com
Mon Aug 29 18:58:49 EDT 2016
Chris,
I was not able to get an astrophyics example, but I do have a reasonable one
that performs a spectral analysis of the output of an analog to digital
converter, something radio astronomers are known to do.
I am including the code, but it requires a rather large data file to run, which
I will not include. The code uses my 'engfmt' library from pypi to perform
conversion to SI form. In this example, there is no need for conversion from SI
form.
#!/usr/bin/env python3
import numpy as np
from numpy.fft import fft, fftfreq, fftshift
import matplotlib as mpl
mpl.use('SVG')
from matplotlib.ticker import FuncFormatter
import matplotlib.pyplot as pl
from engfmt import Quantity, set_preferences
set_preferences(spacer=' ')
def mag(spectrum):
return np.absolute(spectrum)
def freq_fmt(val, pos):
return Quantity(val, 'Hz').to_eng()
def volt_fmt(val, pos):
return Quantity(val, 'V').to_eng()
freq_formatter = FuncFormatter(freq_fmt)
volt_formatter = FuncFormatter(volt_fmt)
data = np.fromfile('delta-sigma.smpl', sep=' ')
time, wave = data.reshape((2, len(data)//2), order='F')
timestep = time[1] - time[0]
nonperiodicity = wave[-1] - wave[0]
period = timestep * len(time)
print('timestep = {}'.format(Quantity(timestep, 's')))
print('nonperiodicity = {}'.format(Quantity(nonperiodicity, 'V')))
print('timepoints = {}'.format(len(time)))
print('freq resolution = {}'.format(Quantity(1/period, 'Hz')))
window = np.kaiser(len(time), 11)/0.37
# beta=11 corresponds to alpha=3.5 (beta = pi*alpha), /.4 # 0.4 is the
# processing gain with alpha=3.5 is 0.37
#window = 1
windowed = window*wave
spectrum = 2*fftshift(fft(windowed))/len(time)
freq = fftshift(fftfreq(len(wave), timestep))
fig = pl.figure()
ax = fig.add_subplot(111)
ax.plot(freq, mag(spectrum))
ax.set_yscale('log')
ax.xaxis.set_major_formatter(freq_formatter)
ax.yaxis.set_major_formatter(volt_formatter)
pl.savefig('spectrum.svg')
ax.set_xlim((0, 1e6))
pl.savefig('spectrum-zoomed.svg')
When run, this program prints the following diagnostics to stdout:
timestep = 20 ns
nonperiodicity = 2.3 pV
timepoints = 27994
freq resolution = 1.7861 kHz
It also generates two SVG files. I have converted one to PNG and attached it.
A few comments:
1. The data in the input file ('delta-sigma.smpl') has low dynamic range and is
machine generated, and not really meant for direct human consumption. As
such, it does not benefit from using SI scale factors. But there are
certainly cases where the data has both high dynamic range and is intended
for people to examine it directly. In those cases it would be very helpful if
NumPy was able to directly read the file. As the language exists today,
I would need to read the file myself, manually convert it, and feed the
result to NumPy.
2. Many of these numbers that are output do have high dynamic range and are
intended to be consumed directly by humans. These benefit from using SI scale
factors. For example, the 'freq resolution' can vary from Hz to MHz and
'nonperiodicity' can vary from fV to mV.
3. Extra effort was expended to make the axis labels on the graph use SI scale
factors so as to make the results 'publication quality'.
My hope is that if Python accepted SI literals directly, then both NumPy nad
MatPlotLib would also be extended to accept/use these formats directly,
eliminating the need for me to do the conversions and manage the axes.
-Ken
On Mon, Aug 29, 2016 at 06:02:29PM +1000, Chris Angelico wrote:
> On Mon, Aug 29, 2016 at 5:07 PM, Ken Kundert
> <python-ideas at shalmirane.com> wrote:
> >
> > I talked to astrophysicist about your comments, and what she said was:
> > 1. She would love it if Python had built in support for real numbers with SI
> > scale factors
> > 2. I told her about my library for reading and writing numbers with SI scale
> > factors, and she was much less enthusiastic because using it would require
> > convincing the rest of the group, which would be too much effort.
> > 3. She was amused by the "kilo pico speed of light" comment, but she was adamant
> > that the fact that you, or some system administrator, does not understand
> > what kpc means has absolutely no affect on her desired to use SI scale
> > factors. Her comment: I did not write it for him.
> > 4. She pointed out that the software she writes and uses is intended either for
> > herself of other astrophysicists. No system administrators involved.
>
> So can you share some of her code, and show how the ability to scale
> unitless numbers would help it?
>
> ChrisA
> _______________________________________________
> Python-ideas mailing list
> Python-ideas at python.org
> https://mail.python.org/mailman/listinfo/python-ideas
> Code of Conduct: http://python.org/psf/codeofconduct/
-------------- next part --------------
A non-text attachment was scrubbed...
Name: spectrum-zoomed.svg.png
Type: image/png
Size: 49011 bytes
Desc: not available
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20160829/7dfd31cb/attachment-0001.png>
More information about the Python-ideas
mailing list