Merge branch 'master_14.4.1' of github.com:Unidata/awips2 into master_14.4.1
Former-commit-id: 03348518d5
This commit is contained in:
commit
aa4542a859
4256 changed files with 871656 additions and 68205 deletions
BIN
pythonPackages/cython/Cython-0.22.1.tar.gz
Normal file
BIN
pythonPackages/cython/Cython-0.22.1.tar.gz
Normal file
Binary file not shown.
1
pythonPackages/metpy
Submodule
1
pythonPackages/metpy
Submodule
|
@ -0,0 +1 @@
|
|||
Subproject commit db120ecf9d6094c3c0c3f2778d5cd4a4c776c773
|
BIN
pythonPackages/numpy/numpy-1.9.2.tar.gz
Normal file
BIN
pythonPackages/numpy/numpy-1.9.2.tar.gz
Normal file
Binary file not shown.
1
pythonPackages/pint
Submodule
1
pythonPackages/pint
Submodule
|
@ -0,0 +1 @@
|
|||
Subproject commit 2c67bbac774a3ceb593df258514a432c6f107397
|
31
pythonPackages/python-dateutil/LICENSE
Normal file
31
pythonPackages/python-dateutil/LICENSE
Normal file
|
@ -0,0 +1,31 @@
|
|||
dateutil - Extensions to the standard Python datetime module.
|
||||
|
||||
Copyright (c) 2003-2011 - Gustavo Niemeyer <gustavo@niemeyer.net>
|
||||
Copyright (c) 2012-2014 - Tomi Pieviläinen <tomi.pievilainen@iki.fi>
|
||||
Copyright (c) 2014 - Yaron de Leeuw <me@jarondl.net>
|
||||
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
* Neither the name of the copyright holder nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
1
pythonPackages/python-dateutil/MANIFEST.in
Normal file
1
pythonPackages/python-dateutil/MANIFEST.in
Normal file
|
@ -0,0 +1 @@
|
|||
include LICENSE NEWS zonefile_metadata.json updatezinfo.py
|
232
pythonPackages/python-dateutil/NEWS
Normal file
232
pythonPackages/python-dateutil/NEWS
Normal file
|
@ -0,0 +1,232 @@
|
|||
Version 2.4.2
|
||||
-------------
|
||||
- Updated zoneinfo to 2015b.
|
||||
- Fixed issue with parsing of tzstr on Python 2.7.x; tzstr will now be decoded
|
||||
if not a unicode type. gh #51 (lp:1331576), gh pr #55.
|
||||
- Fix a parser issue where AM and PM tokens were showing up in fuzzy date
|
||||
stamps, triggering inappropriate errors. gh #56 (lp: 1428895), gh pr #63.
|
||||
- Missing function "setcachsize" removed from zoneinfo __all__ list by @ryanss,
|
||||
fixing an issue with wildcard imports of dateutil.zoneinfo. (gh pr #66).
|
||||
- (PyPi only) Fix an issue with source distributions not including the test
|
||||
suite.
|
||||
|
||||
|
||||
Version 2.4.1
|
||||
-------------
|
||||
|
||||
- Added explicit check for valid hours if AM/PM is specified in parser.
|
||||
(gh pr #22, issue #21)
|
||||
- Fix bug in rrule introduced in 2.4.0 where byweekday parameter was not
|
||||
handled properly. (gh pr #35, issue #34)
|
||||
- Fix error where parser allowed some invalid dates, overwriting existing hours
|
||||
with the last 2-digit number in the string. (gh pr #32, issue #31)
|
||||
- Fix and add test for Python 2.x compatibility with boolean checking of
|
||||
relativedelta objects. Implemented by @nimasmi (gh pr #43) and Cédric Krier
|
||||
(lp: 1035038)
|
||||
- Replaced parse() calls with explicit datetime objects in unit tests unrelated
|
||||
to parser. (gh pr #36)
|
||||
- Changed private _byxxx from sets to sorted tuples and fixed one currently
|
||||
unreachable bug in _construct_byset. (gh pr #54)
|
||||
- Additional documentation for parser (gh pr #29, #33, #41) and rrule.
|
||||
- Formatting fixes to documentation of rrule and README.rst.
|
||||
- Updated zoneinfo to 2015a.
|
||||
|
||||
Version 2.4.0
|
||||
-------------
|
||||
|
||||
- Fix an issue with relativedelta and freezegun (lp:1374022)
|
||||
- Fix tzinfo in windows for timezones without dst (lp:1010050, gh #2)
|
||||
- Ignore missing timezones in windows like in POSIX
|
||||
- Fix minimal version requirement for six (gh #6)
|
||||
- Many rrule changes and fixes by @pganssle (gh pull requests #13 #14 #17),
|
||||
including defusing some infinite loops (gh #4)
|
||||
|
||||
Version 2.3
|
||||
-----------
|
||||
|
||||
- Cleanup directory structure, moved test.py to dateutil/tests/test.py
|
||||
|
||||
- Changed many aspects of dealing with the zone info file. Instead of a cache,
|
||||
all the zones are loaded to memory, but symbolic links are loaded only once,
|
||||
so not much memory is used.
|
||||
|
||||
- The package is now zip-safe, and universal-wheelable, thanks to changes in
|
||||
the handling of the zoneinfo file.
|
||||
|
||||
- Fixed tzwin silently not imported on windows python2
|
||||
|
||||
- New maintainer, together with new hosting: GitHub, Travis, Read-The-Docs
|
||||
|
||||
Version 2.2
|
||||
-----------
|
||||
|
||||
- Updated zoneinfo to 2013h
|
||||
|
||||
- fuzzy_with_tokens parse addon from Christopher Corley
|
||||
|
||||
- Bug with LANG=C fixed by Mike Gilbert
|
||||
|
||||
Version 2.1
|
||||
-----------
|
||||
|
||||
- New maintainer
|
||||
|
||||
- Dateutil now works on Python 2.6, 2.7 and 3.2 from same codebase (with six)
|
||||
|
||||
- #704047: Ismael Carnales' patch for a new time format
|
||||
|
||||
- Small bug fixes, thanks for reporters!
|
||||
|
||||
|
||||
Version 2.0
|
||||
-----------
|
||||
|
||||
- Ported to Python 3, by Brian Jones. If you need dateutil for Python 2.X,
|
||||
please continue using the 1.X series.
|
||||
|
||||
- There's no such thing as a "PSF License". This source code is now
|
||||
made available under the Simplified BSD license. See LICENSE for
|
||||
details.
|
||||
|
||||
Version 1.5
|
||||
-----------
|
||||
|
||||
- As reported by Mathieu Bridon, rrules were matching the bysecond rules
|
||||
incorrectly against byminute in some circumstances when the SECONDLY
|
||||
frequency was in use, due to a copy & paste bug. The problem has been
|
||||
unittested and corrected.
|
||||
|
||||
- Adam Ryan reported a problem in the relativedelta implementation which
|
||||
affected the yearday parameter in the month of January specifically.
|
||||
This has been unittested and fixed.
|
||||
|
||||
- Updated timezone information.
|
||||
|
||||
|
||||
Version 1.4.1
|
||||
-------------
|
||||
|
||||
- Updated timezone information.
|
||||
|
||||
|
||||
Version 1.4
|
||||
-----------
|
||||
|
||||
- Fixed another parser precision problem on conversion of decimal seconds
|
||||
to microseconds, as reported by Erik Brown. Now these issues are gone
|
||||
for real since it's not using floating point arithmetic anymore.
|
||||
|
||||
- Fixed case where tzrange.utcoffset and tzrange.dst() might fail due
|
||||
to a date being used where a datetime was expected (reported and fixed
|
||||
by Lennart Regebro).
|
||||
|
||||
- Prevent tzstr from introducing daylight timings in strings that didn't
|
||||
specify them (reported by Lennart Regebro).
|
||||
|
||||
- Calls like gettz("GMT+3") and gettz("UTC-2") will now return the
|
||||
expected values, instead of the TZ variable behavior.
|
||||
|
||||
- Fixed DST signal handling in zoneinfo files. Reported by
|
||||
Nicholas F. Fabry and John-Mark Gurney.
|
||||
|
||||
|
||||
Version 1.3
|
||||
-----------
|
||||
|
||||
- Fixed precision problem on conversion of decimal seconds to
|
||||
microseconds, as reported by Skip Montanaro.
|
||||
|
||||
- Fixed bug in constructor of parser, and converted parser classes to
|
||||
new-style classes. Original report and patch by Michael Elsdörfer.
|
||||
|
||||
- Initialize tzid and comps in tz.py, to prevent the code from ever
|
||||
raising a NameError (even with broken files). Johan Dahlin suggested
|
||||
the fix after a pyflakes run.
|
||||
|
||||
- Version is now published in dateutil.__version__, as requested
|
||||
by Darren Dale.
|
||||
|
||||
- All code is compatible with new-style division.
|
||||
|
||||
|
||||
Version 1.2
|
||||
-----------
|
||||
|
||||
- Now tzfile will round timezones to full-minutes if necessary,
|
||||
since Python's datetime doesn't support sub-minute offsets.
|
||||
Thanks to Ilpo Nyyssönen for reporting the issue.
|
||||
|
||||
- Removed bare string exceptions, as reported and fixed by
|
||||
Wilfredo Sánchez Vega.
|
||||
|
||||
- Fix bug in leap count parsing (reported and fixed by Eugene Oden).
|
||||
|
||||
|
||||
Version 1.1
|
||||
-----------
|
||||
|
||||
- Fixed rrule byyearday handling. Abramo Bagnara pointed out that
|
||||
RFC2445 allows negative numbers.
|
||||
|
||||
- Fixed --prefix handling in setup.py (by Sidnei da Silva).
|
||||
|
||||
- Now tz.gettz() returns a tzlocal instance when not given any
|
||||
arguments and no other timezone information is found.
|
||||
|
||||
- Updating timezone information to version 2005q.
|
||||
|
||||
|
||||
Version 1.0
|
||||
-----------
|
||||
|
||||
- Fixed parsing of XXhXXm formatted time after day/month/year
|
||||
has been parsed.
|
||||
|
||||
- Added patch by Jeffrey Harris optimizing rrule.__contains__.
|
||||
|
||||
|
||||
Version 0.9
|
||||
-----------
|
||||
|
||||
- Fixed pickling of timezone types, as reported by
|
||||
Andreas Köhler.
|
||||
|
||||
- Implemented internal timezone information with binary
|
||||
timezone files [1]. datautil.tz.gettz() function will now
|
||||
try to use the system timezone files, and fallback to
|
||||
the internal versions. It's also possible to ask for
|
||||
the internal versions directly by using
|
||||
dateutil.zoneinfo.gettz().
|
||||
|
||||
- New tzwin timezone type, allowing access to Windows
|
||||
internal timezones (contributed by Jeffrey Harris).
|
||||
|
||||
- Fixed parsing of unicode date strings.
|
||||
|
||||
- Accept parserinfo instances as the parser constructor
|
||||
parameter, besides parserinfo (sub)classes.
|
||||
|
||||
- Changed weekday to spell the not-set n value as None
|
||||
instead of 0.
|
||||
|
||||
- Fixed other reported bugs.
|
||||
|
||||
[1] http://www.twinsun.com/tz/tz-link.htm
|
||||
|
||||
|
||||
Version 0.5
|
||||
-----------
|
||||
|
||||
- Removed FREQ_ prefix from rrule frequency constants
|
||||
WARNING: this breaks compatibility with previous versions.
|
||||
|
||||
- Fixed rrule.between() for cases where "after" is achieved
|
||||
before even starting, as reported by Andreas Köhler.
|
||||
|
||||
- Fixed two digit zero-year parsing (such as 31-Dec-00), as
|
||||
reported by Jim Abramson, and included test case for this.
|
||||
|
||||
- Sort exdate and rdate before iterating over them, so that
|
||||
it's not necessary to sort them before adding to the rruleset,
|
||||
as reported by Nicholas Piper.
|
||||
|
26
pythonPackages/python-dateutil/PKG-INFO
Normal file
26
pythonPackages/python-dateutil/PKG-INFO
Normal file
|
@ -0,0 +1,26 @@
|
|||
Metadata-Version: 1.1
|
||||
Name: python-dateutil
|
||||
Version: 2.4.2
|
||||
Summary: Extensions to the standard Python datetime module
|
||||
Home-page: https://dateutil.readthedocs.org
|
||||
Author: Yaron de Leeuw
|
||||
Author-email: me@jarondl.net
|
||||
License: Simplified BSD
|
||||
Description:
|
||||
The dateutil module provides powerful extensions to the
|
||||
datetime module available in the Python standard library.
|
||||
|
||||
Platform: UNKNOWN
|
||||
Classifier: Development Status :: 5 - Production/Stable
|
||||
Classifier: Intended Audience :: Developers
|
||||
Classifier: License :: OSI Approved :: BSD License
|
||||
Classifier: Programming Language :: Python
|
||||
Classifier: Programming Language :: Python :: 2
|
||||
Classifier: Programming Language :: Python :: 2.6
|
||||
Classifier: Programming Language :: Python :: 2.7
|
||||
Classifier: Programming Language :: Python :: 3
|
||||
Classifier: Programming Language :: Python :: 3.2
|
||||
Classifier: Programming Language :: Python :: 3.3
|
||||
Classifier: Programming Language :: Python :: 3.4
|
||||
Classifier: Topic :: Software Development :: Libraries
|
||||
Requires: six
|
124
pythonPackages/python-dateutil/README.rst
Normal file
124
pythonPackages/python-dateutil/README.rst
Normal file
|
@ -0,0 +1,124 @@
|
|||
dateutil - powerful extensions to datetime
|
||||
==========================================
|
||||
|
||||
.. image:: https://img.shields.io/travis/dateutil/dateutil/master.svg?style=flat-square
|
||||
:target: https://travis-ci.org/dateutil/dateutil
|
||||
:alt: travis build status
|
||||
|
||||
.. image:: https://img.shields.io/appveyor/ci/dateutil/dateutil/master.svg?style=flat-square
|
||||
:target: https://ci.appveyor.com/project/dateutil/dateutil
|
||||
:alt: appveyor build status
|
||||
|
||||
.. image:: https://img.shields.io/pypi/dd/python-dateutil.svg?style=flat-square
|
||||
:target: https://pypi.python.org/pypi/python-dateutil/
|
||||
:alt: pypi downloads per day
|
||||
|
||||
.. image:: https://img.shields.io/pypi/v/python-dateutil.svg?style=flat-square
|
||||
:target: https://pypi.python.org/pypi/python-dateutil/
|
||||
:alt: pypi version
|
||||
|
||||
|
||||
|
||||
The `dateutil` module provides powerful extensions to
|
||||
the standard `datetime` module, available in Python.
|
||||
|
||||
|
||||
Download
|
||||
========
|
||||
dateutil is available on PyPI
|
||||
https://pypi.python.org/pypi/python-dateutil/
|
||||
|
||||
The documentation is hosted at:
|
||||
https://dateutil.readthedocs.org/
|
||||
|
||||
Code
|
||||
====
|
||||
https://github.com/dateutil/dateutil/
|
||||
|
||||
Features
|
||||
========
|
||||
|
||||
* Computing of relative deltas (next month, next year,
|
||||
next monday, last week of month, etc);
|
||||
* Computing of relative deltas between two given
|
||||
date and/or datetime objects;
|
||||
* Computing of dates based on very flexible recurrence rules,
|
||||
using a superset of the `iCalendar <https://www.ietf.org/rfc/rfc2445.txt>`_
|
||||
specification. Parsing of RFC strings is supported as well.
|
||||
* Generic parsing of dates in almost any string format;
|
||||
* Timezone (tzinfo) implementations for tzfile(5) format
|
||||
files (/etc/localtime, /usr/share/zoneinfo, etc), TZ
|
||||
environment string (in all known formats), iCalendar
|
||||
format files, given ranges (with help from relative deltas),
|
||||
local machine timezone, fixed offset timezone, UTC timezone,
|
||||
and Windows registry-based time zones.
|
||||
* Internal up-to-date world timezone information based on
|
||||
Olson's database.
|
||||
* Computing of Easter Sunday dates for any given year,
|
||||
using Western, Orthodox or Julian algorithms;
|
||||
* More than 400 test cases.
|
||||
|
||||
Quick example
|
||||
=============
|
||||
Here's a snapshot, just to give an idea about the power of the
|
||||
package. For more examples, look at the documentation.
|
||||
|
||||
Suppose you want to know how much time is left, in
|
||||
years/months/days/etc, before the next easter happening on a
|
||||
year with a Friday 13th in August, and you want to get today's
|
||||
date out of the "date" unix system command. Here is the code:
|
||||
|
||||
.. doctest:: readmeexample
|
||||
|
||||
>>> from dateutil.relativedelta import *
|
||||
>>> from dateutil.easter import *
|
||||
>>> from dateutil.rrule import *
|
||||
>>> from dateutil.parser import *
|
||||
>>> from datetime import *
|
||||
>>> now = parse("Sat Oct 11 17:13:46 UTC 2003")
|
||||
>>> today = now.date()
|
||||
>>> year = rrule(YEARLY,dtstart=now,bymonth=8,bymonthday=13,byweekday=FR)[0].year
|
||||
>>> rdelta = relativedelta(easter(year), today)
|
||||
>>> print("Today is: %s" % today)
|
||||
Today is: 2003-10-11
|
||||
>>> print("Year with next Aug 13th on a Friday is: %s" % year)
|
||||
Year with next Aug 13th on a Friday is: 2004
|
||||
>>> print("How far is the Easter of that year: %s" % rdelta)
|
||||
How far is the Easter of that year: relativedelta(months=+6)
|
||||
>>> print("And the Easter of that year is: %s" % (today+rdelta))
|
||||
And the Easter of that year is: 2004-04-11
|
||||
|
||||
Being exactly 6 months ahead was **really** a coincidence :)
|
||||
|
||||
|
||||
Author
|
||||
======
|
||||
The dateutil module was written by Gustavo Niemeyer <gustavo@niemeyer.net>
|
||||
in 2003
|
||||
|
||||
It is maintained by:
|
||||
|
||||
* Gustavo Niemeyer <gustavo@niemeyer.net> 2003-2011
|
||||
* Tomi Pieviläinen <tomi.pievilainen@iki.fi> 2012-2014
|
||||
* Yaron de Leeuw <me@jarondl.net> 2014-
|
||||
|
||||
Building and releasing
|
||||
======================
|
||||
When you get the source, it does not contain the internal zoneinfo
|
||||
database. To get (and update) the database, run the updatezinfo.py script. Make sure
|
||||
that the zic command is in your path, and that you have network connectivity
|
||||
to get the latest timezone information from IANA. If you have downloaded
|
||||
the timezone data earlier, you can give the tarball as a parameter to
|
||||
updatezinfo.py.
|
||||
|
||||
|
||||
Testing
|
||||
=======
|
||||
dateutil has a comprehensive test suite, which can be run simply by running
|
||||
`python setup.py test [-q]` in the project root. Note that if you don't have the internal
|
||||
zoneinfo database, some tests will fail. Apart from that, all tests should pass.
|
||||
|
||||
To easily test dateutil against all supported Python versions, you can use
|
||||
`tox <https://tox.readthedocs.org/en/latest/>`_.
|
||||
|
||||
All github pull requests are automatically tested using travis.
|
2
pythonPackages/python-dateutil/dateutil/__init__.py
Normal file
2
pythonPackages/python-dateutil/dateutil/__init__.py
Normal file
|
@ -0,0 +1,2 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
__version__ = "2.4.2"
|
89
pythonPackages/python-dateutil/dateutil/easter.py
Normal file
89
pythonPackages/python-dateutil/dateutil/easter.py
Normal file
|
@ -0,0 +1,89 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
This module offers a generic easter computing method for any given year, using
|
||||
Western, Orthodox or Julian algorithms.
|
||||
"""
|
||||
|
||||
import datetime
|
||||
|
||||
__all__ = ["easter", "EASTER_JULIAN", "EASTER_ORTHODOX", "EASTER_WESTERN"]
|
||||
|
||||
EASTER_JULIAN = 1
|
||||
EASTER_ORTHODOX = 2
|
||||
EASTER_WESTERN = 3
|
||||
|
||||
|
||||
def easter(year, method=EASTER_WESTERN):
|
||||
"""
|
||||
This method was ported from the work done by GM Arts,
|
||||
on top of the algorithm by Claus Tondering, which was
|
||||
based in part on the algorithm of Ouding (1940), as
|
||||
quoted in "Explanatory Supplement to the Astronomical
|
||||
Almanac", P. Kenneth Seidelmann, editor.
|
||||
|
||||
This algorithm implements three different easter
|
||||
calculation methods:
|
||||
|
||||
1 - Original calculation in Julian calendar, valid in
|
||||
dates after 326 AD
|
||||
2 - Original method, with date converted to Gregorian
|
||||
calendar, valid in years 1583 to 4099
|
||||
3 - Revised method, in Gregorian calendar, valid in
|
||||
years 1583 to 4099 as well
|
||||
|
||||
These methods are represented by the constants:
|
||||
|
||||
EASTER_JULIAN = 1
|
||||
EASTER_ORTHODOX = 2
|
||||
EASTER_WESTERN = 3
|
||||
|
||||
The default method is method 3.
|
||||
|
||||
More about the algorithm may be found at:
|
||||
|
||||
http://users.chariot.net.au/~gmarts/eastalg.htm
|
||||
|
||||
and
|
||||
|
||||
http://www.tondering.dk/claus/calendar.html
|
||||
|
||||
"""
|
||||
|
||||
if not (1 <= method <= 3):
|
||||
raise ValueError("invalid method")
|
||||
|
||||
# g - Golden year - 1
|
||||
# c - Century
|
||||
# h - (23 - Epact) mod 30
|
||||
# i - Number of days from March 21 to Paschal Full Moon
|
||||
# j - Weekday for PFM (0=Sunday, etc)
|
||||
# p - Number of days from March 21 to Sunday on or before PFM
|
||||
# (-6 to 28 methods 1 & 3, to 56 for method 2)
|
||||
# e - Extra days to add for method 2 (converting Julian
|
||||
# date to Gregorian date)
|
||||
|
||||
y = year
|
||||
g = y % 19
|
||||
e = 0
|
||||
if method < 3:
|
||||
# Old method
|
||||
i = (19*g + 15) % 30
|
||||
j = (y + y//4 + i) % 7
|
||||
if method == 2:
|
||||
# Extra dates to convert Julian to Gregorian date
|
||||
e = 10
|
||||
if y > 1600:
|
||||
e = e + y//100 - 16 - (y//100 - 16)//4
|
||||
else:
|
||||
# New method
|
||||
c = y//100
|
||||
h = (c - c//4 - (8*c + 13)//25 + 19*g + 15) % 30
|
||||
i = h - (h//28)*(1 - (h//28)*(29//(h + 1))*((21 - g)//11))
|
||||
j = (y + y//4 + i + 2 - c + c//4) % 7
|
||||
|
||||
# p can be from -6 to 56 corresponding to dates 22 March to 23 May
|
||||
# (later dates apply to method 2, although 23 May never actually occurs)
|
||||
p = i - j + e
|
||||
d = 1 + (p + 27 + (p + 6)//40) % 31
|
||||
m = 3 + (p + 26)//30
|
||||
return datetime.date(int(y), int(m), int(d))
|
1205
pythonPackages/python-dateutil/dateutil/parser.py
Normal file
1205
pythonPackages/python-dateutil/dateutil/parser.py
Normal file
File diff suppressed because it is too large
Load diff
450
pythonPackages/python-dateutil/dateutil/relativedelta.py
Normal file
450
pythonPackages/python-dateutil/dateutil/relativedelta.py
Normal file
|
@ -0,0 +1,450 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
import datetime
|
||||
import calendar
|
||||
|
||||
from six import integer_types
|
||||
|
||||
__all__ = ["relativedelta", "MO", "TU", "WE", "TH", "FR", "SA", "SU"]
|
||||
|
||||
|
||||
class weekday(object):
|
||||
__slots__ = ["weekday", "n"]
|
||||
|
||||
def __init__(self, weekday, n=None):
|
||||
self.weekday = weekday
|
||||
self.n = n
|
||||
|
||||
def __call__(self, n):
|
||||
if n == self.n:
|
||||
return self
|
||||
else:
|
||||
return self.__class__(self.weekday, n)
|
||||
|
||||
def __eq__(self, other):
|
||||
try:
|
||||
if self.weekday != other.weekday or self.n != other.n:
|
||||
return False
|
||||
except AttributeError:
|
||||
return False
|
||||
return True
|
||||
|
||||
def __repr__(self):
|
||||
s = ("MO", "TU", "WE", "TH", "FR", "SA", "SU")[self.weekday]
|
||||
if not self.n:
|
||||
return s
|
||||
else:
|
||||
return "%s(%+d)" % (s, self.n)
|
||||
|
||||
MO, TU, WE, TH, FR, SA, SU = weekdays = tuple([weekday(x) for x in range(7)])
|
||||
|
||||
|
||||
class relativedelta(object):
|
||||
"""
|
||||
The relativedelta type is based on the specification of the excellent
|
||||
work done by M.-A. Lemburg in his
|
||||
`mx.DateTime <http://www.egenix.com/files/python/mxDateTime.html>`_ extension.
|
||||
However, notice that this type does *NOT* implement the same algorithm as
|
||||
his work. Do *NOT* expect it to behave like mx.DateTime's counterpart.
|
||||
|
||||
There are two different ways to build a relativedelta instance. The
|
||||
first one is passing it two date/datetime classes::
|
||||
|
||||
relativedelta(datetime1, datetime2)
|
||||
|
||||
The second one is passing it any number of the following keyword arguments::
|
||||
|
||||
relativedelta(arg1=x,arg2=y,arg3=z...)
|
||||
|
||||
year, month, day, hour, minute, second, microsecond:
|
||||
Absolute information (argument is singular); adding or subtracting a
|
||||
relativedelta with absolute information does not perform an aritmetic
|
||||
operation, but rather REPLACES the corresponding value in the
|
||||
original datetime with the value(s) in relativedelta.
|
||||
|
||||
years, months, weeks, days, hours, minutes, seconds, microseconds:
|
||||
Relative information, may be negative (argument is plural); adding
|
||||
or subtracting a relativedelta with relative information performs
|
||||
the corresponding aritmetic operation on the original datetime value
|
||||
with the information in the relativedelta.
|
||||
|
||||
weekday:
|
||||
One of the weekday instances (MO, TU, etc). These instances may
|
||||
receive a parameter N, specifying the Nth weekday, which could
|
||||
be positive or negative (like MO(+1) or MO(-2). Not specifying
|
||||
it is the same as specifying +1. You can also use an integer,
|
||||
where 0=MO.
|
||||
|
||||
leapdays:
|
||||
Will add given days to the date found, if year is a leap
|
||||
year, and the date found is post 28 of february.
|
||||
|
||||
yearday, nlyearday:
|
||||
Set the yearday or the non-leap year day (jump leap days).
|
||||
These are converted to day/month/leapdays information.
|
||||
|
||||
Here is the behavior of operations with relativedelta:
|
||||
|
||||
1. Calculate the absolute year, using the 'year' argument, or the
|
||||
original datetime year, if the argument is not present.
|
||||
|
||||
2. Add the relative 'years' argument to the absolute year.
|
||||
|
||||
3. Do steps 1 and 2 for month/months.
|
||||
|
||||
4. Calculate the absolute day, using the 'day' argument, or the
|
||||
original datetime day, if the argument is not present. Then,
|
||||
subtract from the day until it fits in the year and month
|
||||
found after their operations.
|
||||
|
||||
5. Add the relative 'days' argument to the absolute day. Notice
|
||||
that the 'weeks' argument is multiplied by 7 and added to
|
||||
'days'.
|
||||
|
||||
6. Do steps 1 and 2 for hour/hours, minute/minutes, second/seconds,
|
||||
microsecond/microseconds.
|
||||
|
||||
7. If the 'weekday' argument is present, calculate the weekday,
|
||||
with the given (wday, nth) tuple. wday is the index of the
|
||||
weekday (0-6, 0=Mon), and nth is the number of weeks to add
|
||||
forward or backward, depending on its signal. Notice that if
|
||||
the calculated date is already Monday, for example, using
|
||||
(0, 1) or (0, -1) won't change the day.
|
||||
"""
|
||||
|
||||
def __init__(self, dt1=None, dt2=None,
|
||||
years=0, months=0, days=0, leapdays=0, weeks=0,
|
||||
hours=0, minutes=0, seconds=0, microseconds=0,
|
||||
year=None, month=None, day=None, weekday=None,
|
||||
yearday=None, nlyearday=None,
|
||||
hour=None, minute=None, second=None, microsecond=None):
|
||||
if dt1 and dt2:
|
||||
# datetime is a subclass of date. So both must be date
|
||||
if not (isinstance(dt1, datetime.date) and
|
||||
isinstance(dt2, datetime.date)):
|
||||
raise TypeError("relativedelta only diffs datetime/date")
|
||||
# We allow two dates, or two datetimes, so we coerce them to be
|
||||
# of the same type
|
||||
if (isinstance(dt1, datetime.datetime) !=
|
||||
isinstance(dt2, datetime.datetime)):
|
||||
if not isinstance(dt1, datetime.datetime):
|
||||
dt1 = datetime.datetime.fromordinal(dt1.toordinal())
|
||||
elif not isinstance(dt2, datetime.datetime):
|
||||
dt2 = datetime.datetime.fromordinal(dt2.toordinal())
|
||||
self.years = 0
|
||||
self.months = 0
|
||||
self.days = 0
|
||||
self.leapdays = 0
|
||||
self.hours = 0
|
||||
self.minutes = 0
|
||||
self.seconds = 0
|
||||
self.microseconds = 0
|
||||
self.year = None
|
||||
self.month = None
|
||||
self.day = None
|
||||
self.weekday = None
|
||||
self.hour = None
|
||||
self.minute = None
|
||||
self.second = None
|
||||
self.microsecond = None
|
||||
self._has_time = 0
|
||||
|
||||
months = (dt1.year*12+dt1.month)-(dt2.year*12+dt2.month)
|
||||
self._set_months(months)
|
||||
dtm = self.__radd__(dt2)
|
||||
if dt1 < dt2:
|
||||
while dt1 > dtm:
|
||||
months += 1
|
||||
self._set_months(months)
|
||||
dtm = self.__radd__(dt2)
|
||||
else:
|
||||
while dt1 < dtm:
|
||||
months -= 1
|
||||
self._set_months(months)
|
||||
dtm = self.__radd__(dt2)
|
||||
delta = dt1 - dtm
|
||||
self.seconds = delta.seconds+delta.days*86400
|
||||
self.microseconds = delta.microseconds
|
||||
else:
|
||||
self.years = years
|
||||
self.months = months
|
||||
self.days = days+weeks*7
|
||||
self.leapdays = leapdays
|
||||
self.hours = hours
|
||||
self.minutes = minutes
|
||||
self.seconds = seconds
|
||||
self.microseconds = microseconds
|
||||
self.year = year
|
||||
self.month = month
|
||||
self.day = day
|
||||
self.hour = hour
|
||||
self.minute = minute
|
||||
self.second = second
|
||||
self.microsecond = microsecond
|
||||
|
||||
if isinstance(weekday, integer_types):
|
||||
self.weekday = weekdays[weekday]
|
||||
else:
|
||||
self.weekday = weekday
|
||||
|
||||
yday = 0
|
||||
if nlyearday:
|
||||
yday = nlyearday
|
||||
elif yearday:
|
||||
yday = yearday
|
||||
if yearday > 59:
|
||||
self.leapdays = -1
|
||||
if yday:
|
||||
ydayidx = [31, 59, 90, 120, 151, 181, 212,
|
||||
243, 273, 304, 334, 366]
|
||||
for idx, ydays in enumerate(ydayidx):
|
||||
if yday <= ydays:
|
||||
self.month = idx+1
|
||||
if idx == 0:
|
||||
self.day = yday
|
||||
else:
|
||||
self.day = yday-ydayidx[idx-1]
|
||||
break
|
||||
else:
|
||||
raise ValueError("invalid year day (%d)" % yday)
|
||||
|
||||
self._fix()
|
||||
|
||||
def _fix(self):
|
||||
if abs(self.microseconds) > 999999:
|
||||
s = self.microseconds//abs(self.microseconds)
|
||||
div, mod = divmod(self.microseconds*s, 1000000)
|
||||
self.microseconds = mod*s
|
||||
self.seconds += div*s
|
||||
if abs(self.seconds) > 59:
|
||||
s = self.seconds//abs(self.seconds)
|
||||
div, mod = divmod(self.seconds*s, 60)
|
||||
self.seconds = mod*s
|
||||
self.minutes += div*s
|
||||
if abs(self.minutes) > 59:
|
||||
s = self.minutes//abs(self.minutes)
|
||||
div, mod = divmod(self.minutes*s, 60)
|
||||
self.minutes = mod*s
|
||||
self.hours += div*s
|
||||
if abs(self.hours) > 23:
|
||||
s = self.hours//abs(self.hours)
|
||||
div, mod = divmod(self.hours*s, 24)
|
||||
self.hours = mod*s
|
||||
self.days += div*s
|
||||
if abs(self.months) > 11:
|
||||
s = self.months//abs(self.months)
|
||||
div, mod = divmod(self.months*s, 12)
|
||||
self.months = mod*s
|
||||
self.years += div*s
|
||||
if (self.hours or self.minutes or self.seconds or self.microseconds
|
||||
or self.hour is not None or self.minute is not None or
|
||||
self.second is not None or self.microsecond is not None):
|
||||
self._has_time = 1
|
||||
else:
|
||||
self._has_time = 0
|
||||
|
||||
def _set_months(self, months):
|
||||
self.months = months
|
||||
if abs(self.months) > 11:
|
||||
s = self.months//abs(self.months)
|
||||
div, mod = divmod(self.months*s, 12)
|
||||
self.months = mod*s
|
||||
self.years = div*s
|
||||
else:
|
||||
self.years = 0
|
||||
|
||||
def __add__(self, other):
|
||||
if isinstance(other, relativedelta):
|
||||
return relativedelta(years=other.years+self.years,
|
||||
months=other.months+self.months,
|
||||
days=other.days+self.days,
|
||||
hours=other.hours+self.hours,
|
||||
minutes=other.minutes+self.minutes,
|
||||
seconds=other.seconds+self.seconds,
|
||||
microseconds=(other.microseconds +
|
||||
self.microseconds),
|
||||
leapdays=other.leapdays or self.leapdays,
|
||||
year=other.year or self.year,
|
||||
month=other.month or self.month,
|
||||
day=other.day or self.day,
|
||||
weekday=other.weekday or self.weekday,
|
||||
hour=other.hour or self.hour,
|
||||
minute=other.minute or self.minute,
|
||||
second=other.second or self.second,
|
||||
microsecond=(other.microsecond or
|
||||
self.microsecond))
|
||||
if not isinstance(other, datetime.date):
|
||||
raise TypeError("unsupported type for add operation")
|
||||
elif self._has_time and not isinstance(other, datetime.datetime):
|
||||
other = datetime.datetime.fromordinal(other.toordinal())
|
||||
year = (self.year or other.year)+self.years
|
||||
month = self.month or other.month
|
||||
if self.months:
|
||||
assert 1 <= abs(self.months) <= 12
|
||||
month += self.months
|
||||
if month > 12:
|
||||
year += 1
|
||||
month -= 12
|
||||
elif month < 1:
|
||||
year -= 1
|
||||
month += 12
|
||||
day = min(calendar.monthrange(year, month)[1],
|
||||
self.day or other.day)
|
||||
repl = {"year": year, "month": month, "day": day}
|
||||
for attr in ["hour", "minute", "second", "microsecond"]:
|
||||
value = getattr(self, attr)
|
||||
if value is not None:
|
||||
repl[attr] = value
|
||||
days = self.days
|
||||
if self.leapdays and month > 2 and calendar.isleap(year):
|
||||
days += self.leapdays
|
||||
ret = (other.replace(**repl)
|
||||
+ datetime.timedelta(days=days,
|
||||
hours=self.hours,
|
||||
minutes=self.minutes,
|
||||
seconds=self.seconds,
|
||||
microseconds=self.microseconds))
|
||||
if self.weekday:
|
||||
weekday, nth = self.weekday.weekday, self.weekday.n or 1
|
||||
jumpdays = (abs(nth)-1)*7
|
||||
if nth > 0:
|
||||
jumpdays += (7-ret.weekday()+weekday) % 7
|
||||
else:
|
||||
jumpdays += (ret.weekday()-weekday) % 7
|
||||
jumpdays *= -1
|
||||
ret += datetime.timedelta(days=jumpdays)
|
||||
return ret
|
||||
|
||||
def __radd__(self, other):
|
||||
return self.__add__(other)
|
||||
|
||||
def __rsub__(self, other):
|
||||
return self.__neg__().__radd__(other)
|
||||
|
||||
def __sub__(self, other):
|
||||
if not isinstance(other, relativedelta):
|
||||
raise TypeError("unsupported type for sub operation")
|
||||
return relativedelta(years=self.years-other.years,
|
||||
months=self.months-other.months,
|
||||
days=self.days-other.days,
|
||||
hours=self.hours-other.hours,
|
||||
minutes=self.minutes-other.minutes,
|
||||
seconds=self.seconds-other.seconds,
|
||||
microseconds=self.microseconds-other.microseconds,
|
||||
leapdays=self.leapdays or other.leapdays,
|
||||
year=self.year or other.year,
|
||||
month=self.month or other.month,
|
||||
day=self.day or other.day,
|
||||
weekday=self.weekday or other.weekday,
|
||||
hour=self.hour or other.hour,
|
||||
minute=self.minute or other.minute,
|
||||
second=self.second or other.second,
|
||||
microsecond=self.microsecond or other.microsecond)
|
||||
|
||||
def __neg__(self):
|
||||
return relativedelta(years=-self.years,
|
||||
months=-self.months,
|
||||
days=-self.days,
|
||||
hours=-self.hours,
|
||||
minutes=-self.minutes,
|
||||
seconds=-self.seconds,
|
||||
microseconds=-self.microseconds,
|
||||
leapdays=self.leapdays,
|
||||
year=self.year,
|
||||
month=self.month,
|
||||
day=self.day,
|
||||
weekday=self.weekday,
|
||||
hour=self.hour,
|
||||
minute=self.minute,
|
||||
second=self.second,
|
||||
microsecond=self.microsecond)
|
||||
|
||||
def __bool__(self):
|
||||
return not (not self.years and
|
||||
not self.months and
|
||||
not self.days and
|
||||
not self.hours and
|
||||
not self.minutes and
|
||||
not self.seconds and
|
||||
not self.microseconds and
|
||||
not self.leapdays and
|
||||
self.year is None and
|
||||
self.month is None and
|
||||
self.day is None and
|
||||
self.weekday is None and
|
||||
self.hour is None and
|
||||
self.minute is None and
|
||||
self.second is None and
|
||||
self.microsecond is None)
|
||||
# Compatibility with Python 2.x
|
||||
__nonzero__ = __bool__
|
||||
|
||||
def __mul__(self, other):
|
||||
f = float(other)
|
||||
return relativedelta(years=int(self.years*f),
|
||||
months=int(self.months*f),
|
||||
days=int(self.days*f),
|
||||
hours=int(self.hours*f),
|
||||
minutes=int(self.minutes*f),
|
||||
seconds=int(self.seconds*f),
|
||||
microseconds=int(self.microseconds*f),
|
||||
leapdays=self.leapdays,
|
||||
year=self.year,
|
||||
month=self.month,
|
||||
day=self.day,
|
||||
weekday=self.weekday,
|
||||
hour=self.hour,
|
||||
minute=self.minute,
|
||||
second=self.second,
|
||||
microsecond=self.microsecond)
|
||||
|
||||
__rmul__ = __mul__
|
||||
|
||||
def __eq__(self, other):
|
||||
if not isinstance(other, relativedelta):
|
||||
return False
|
||||
if self.weekday or other.weekday:
|
||||
if not self.weekday or not other.weekday:
|
||||
return False
|
||||
if self.weekday.weekday != other.weekday.weekday:
|
||||
return False
|
||||
n1, n2 = self.weekday.n, other.weekday.n
|
||||
if n1 != n2 and not ((not n1 or n1 == 1) and (not n2 or n2 == 1)):
|
||||
return False
|
||||
return (self.years == other.years and
|
||||
self.months == other.months and
|
||||
self.days == other.days and
|
||||
self.hours == other.hours and
|
||||
self.minutes == other.minutes and
|
||||
self.seconds == other.seconds and
|
||||
self.leapdays == other.leapdays and
|
||||
self.year == other.year and
|
||||
self.month == other.month and
|
||||
self.day == other.day and
|
||||
self.hour == other.hour and
|
||||
self.minute == other.minute and
|
||||
self.second == other.second and
|
||||
self.microsecond == other.microsecond)
|
||||
|
||||
def __ne__(self, other):
|
||||
return not self.__eq__(other)
|
||||
|
||||
def __div__(self, other):
|
||||
return self.__mul__(1/float(other))
|
||||
|
||||
__truediv__ = __div__
|
||||
|
||||
def __repr__(self):
|
||||
l = []
|
||||
for attr in ["years", "months", "days", "leapdays",
|
||||
"hours", "minutes", "seconds", "microseconds"]:
|
||||
value = getattr(self, attr)
|
||||
if value:
|
||||
l.append("%s=%+d" % (attr, value))
|
||||
for attr in ["year", "month", "day", "weekday",
|
||||
"hour", "minute", "second", "microsecond"]:
|
||||
value = getattr(self, attr)
|
||||
if value is not None:
|
||||
l.append("%s=%s" % (attr, repr(value)))
|
||||
return "%s(%s)" % (self.__class__.__name__, ", ".join(l))
|
||||
|
||||
# vim:ts=4:sw=4:et
|
1375
pythonPackages/python-dateutil/dateutil/rrule.py
Normal file
1375
pythonPackages/python-dateutil/dateutil/rrule.py
Normal file
File diff suppressed because it is too large
Load diff
0
pythonPackages/python-dateutil/dateutil/test/__init__.py
Normal file
0
pythonPackages/python-dateutil/dateutil/test/__init__.py
Normal file
4131
pythonPackages/python-dateutil/dateutil/test/test.py
Normal file
4131
pythonPackages/python-dateutil/dateutil/test/test.py
Normal file
File diff suppressed because it is too large
Load diff
986
pythonPackages/python-dateutil/dateutil/tz.py
Normal file
986
pythonPackages/python-dateutil/dateutil/tz.py
Normal file
|
@ -0,0 +1,986 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
This module offers timezone implementations subclassing the abstract
|
||||
:py:`datetime.tzinfo` type. There are classes to handle tzfile format files
|
||||
(usually are in :file:`/etc/localtime`, :file:`/usr/share/zoneinfo`, etc), TZ
|
||||
environment string (in all known formats), given ranges (with help from
|
||||
relative deltas), local machine timezone, fixed offset timezone, and UTC
|
||||
timezone.
|
||||
"""
|
||||
import datetime
|
||||
import struct
|
||||
import time
|
||||
import sys
|
||||
import os
|
||||
|
||||
from six import string_types, PY3
|
||||
|
||||
try:
|
||||
from dateutil.tzwin import tzwin, tzwinlocal
|
||||
except ImportError:
|
||||
tzwin = tzwinlocal = None
|
||||
|
||||
relativedelta = None
|
||||
parser = None
|
||||
rrule = None
|
||||
|
||||
__all__ = ["tzutc", "tzoffset", "tzlocal", "tzfile", "tzrange",
|
||||
"tzstr", "tzical", "tzwin", "tzwinlocal", "gettz"]
|
||||
|
||||
|
||||
def tzname_in_python2(myfunc):
|
||||
"""Change unicode output into bytestrings in Python 2
|
||||
|
||||
tzname() API changed in Python 3. It used to return bytes, but was changed
|
||||
to unicode strings
|
||||
"""
|
||||
def inner_func(*args, **kwargs):
|
||||
if PY3:
|
||||
return myfunc(*args, **kwargs)
|
||||
else:
|
||||
return myfunc(*args, **kwargs).encode()
|
||||
return inner_func
|
||||
|
||||
ZERO = datetime.timedelta(0)
|
||||
EPOCHORDINAL = datetime.datetime.utcfromtimestamp(0).toordinal()
|
||||
|
||||
|
||||
class tzutc(datetime.tzinfo):
|
||||
|
||||
def utcoffset(self, dt):
|
||||
return ZERO
|
||||
|
||||
def dst(self, dt):
|
||||
return ZERO
|
||||
|
||||
@tzname_in_python2
|
||||
def tzname(self, dt):
|
||||
return "UTC"
|
||||
|
||||
def __eq__(self, other):
|
||||
return (isinstance(other, tzutc) or
|
||||
(isinstance(other, tzoffset) and other._offset == ZERO))
|
||||
|
||||
def __ne__(self, other):
|
||||
return not self.__eq__(other)
|
||||
|
||||
def __repr__(self):
|
||||
return "%s()" % self.__class__.__name__
|
||||
|
||||
__reduce__ = object.__reduce__
|
||||
|
||||
|
||||
class tzoffset(datetime.tzinfo):
|
||||
|
||||
def __init__(self, name, offset):
|
||||
self._name = name
|
||||
self._offset = datetime.timedelta(seconds=offset)
|
||||
|
||||
def utcoffset(self, dt):
|
||||
return self._offset
|
||||
|
||||
def dst(self, dt):
|
||||
return ZERO
|
||||
|
||||
@tzname_in_python2
|
||||
def tzname(self, dt):
|
||||
return self._name
|
||||
|
||||
def __eq__(self, other):
|
||||
return (isinstance(other, tzoffset) and
|
||||
self._offset == other._offset)
|
||||
|
||||
def __ne__(self, other):
|
||||
return not self.__eq__(other)
|
||||
|
||||
def __repr__(self):
|
||||
return "%s(%s, %s)" % (self.__class__.__name__,
|
||||
repr(self._name),
|
||||
self._offset.days*86400+self._offset.seconds)
|
||||
|
||||
__reduce__ = object.__reduce__
|
||||
|
||||
|
||||
class tzlocal(datetime.tzinfo):
|
||||
|
||||
_std_offset = datetime.timedelta(seconds=-time.timezone)
|
||||
if time.daylight:
|
||||
_dst_offset = datetime.timedelta(seconds=-time.altzone)
|
||||
else:
|
||||
_dst_offset = _std_offset
|
||||
|
||||
def utcoffset(self, dt):
|
||||
if self._isdst(dt):
|
||||
return self._dst_offset
|
||||
else:
|
||||
return self._std_offset
|
||||
|
||||
def dst(self, dt):
|
||||
if self._isdst(dt):
|
||||
return self._dst_offset-self._std_offset
|
||||
else:
|
||||
return ZERO
|
||||
|
||||
@tzname_in_python2
|
||||
def tzname(self, dt):
|
||||
return time.tzname[self._isdst(dt)]
|
||||
|
||||
def _isdst(self, dt):
|
||||
# We can't use mktime here. It is unstable when deciding if
|
||||
# the hour near to a change is DST or not.
|
||||
#
|
||||
# timestamp = time.mktime((dt.year, dt.month, dt.day, dt.hour,
|
||||
# dt.minute, dt.second, dt.weekday(), 0, -1))
|
||||
# return time.localtime(timestamp).tm_isdst
|
||||
#
|
||||
# The code above yields the following result:
|
||||
#
|
||||
# >>> import tz, datetime
|
||||
# >>> t = tz.tzlocal()
|
||||
# >>> datetime.datetime(2003,2,15,23,tzinfo=t).tzname()
|
||||
# 'BRDT'
|
||||
# >>> datetime.datetime(2003,2,16,0,tzinfo=t).tzname()
|
||||
# 'BRST'
|
||||
# >>> datetime.datetime(2003,2,15,23,tzinfo=t).tzname()
|
||||
# 'BRST'
|
||||
# >>> datetime.datetime(2003,2,15,22,tzinfo=t).tzname()
|
||||
# 'BRDT'
|
||||
# >>> datetime.datetime(2003,2,15,23,tzinfo=t).tzname()
|
||||
# 'BRDT'
|
||||
#
|
||||
# Here is a more stable implementation:
|
||||
#
|
||||
timestamp = ((dt.toordinal() - EPOCHORDINAL) * 86400
|
||||
+ dt.hour * 3600
|
||||
+ dt.minute * 60
|
||||
+ dt.second)
|
||||
return time.localtime(timestamp+time.timezone).tm_isdst
|
||||
|
||||
def __eq__(self, other):
|
||||
if not isinstance(other, tzlocal):
|
||||
return False
|
||||
return (self._std_offset == other._std_offset and
|
||||
self._dst_offset == other._dst_offset)
|
||||
return True
|
||||
|
||||
def __ne__(self, other):
|
||||
return not self.__eq__(other)
|
||||
|
||||
def __repr__(self):
|
||||
return "%s()" % self.__class__.__name__
|
||||
|
||||
__reduce__ = object.__reduce__
|
||||
|
||||
|
||||
class _ttinfo(object):
|
||||
__slots__ = ["offset", "delta", "isdst", "abbr", "isstd", "isgmt"]
|
||||
|
||||
def __init__(self):
|
||||
for attr in self.__slots__:
|
||||
setattr(self, attr, None)
|
||||
|
||||
def __repr__(self):
|
||||
l = []
|
||||
for attr in self.__slots__:
|
||||
value = getattr(self, attr)
|
||||
if value is not None:
|
||||
l.append("%s=%s" % (attr, repr(value)))
|
||||
return "%s(%s)" % (self.__class__.__name__, ", ".join(l))
|
||||
|
||||
def __eq__(self, other):
|
||||
if not isinstance(other, _ttinfo):
|
||||
return False
|
||||
return (self.offset == other.offset and
|
||||
self.delta == other.delta and
|
||||
self.isdst == other.isdst and
|
||||
self.abbr == other.abbr and
|
||||
self.isstd == other.isstd and
|
||||
self.isgmt == other.isgmt)
|
||||
|
||||
def __ne__(self, other):
|
||||
return not self.__eq__(other)
|
||||
|
||||
def __getstate__(self):
|
||||
state = {}
|
||||
for name in self.__slots__:
|
||||
state[name] = getattr(self, name, None)
|
||||
return state
|
||||
|
||||
def __setstate__(self, state):
|
||||
for name in self.__slots__:
|
||||
if name in state:
|
||||
setattr(self, name, state[name])
|
||||
|
||||
|
||||
class tzfile(datetime.tzinfo):
|
||||
|
||||
# http://www.twinsun.com/tz/tz-link.htm
|
||||
# ftp://ftp.iana.org/tz/tz*.tar.gz
|
||||
|
||||
def __init__(self, fileobj, filename=None):
|
||||
file_opened_here = False
|
||||
if isinstance(fileobj, string_types):
|
||||
self._filename = fileobj
|
||||
fileobj = open(fileobj, 'rb')
|
||||
file_opened_here = True
|
||||
elif filename is not None:
|
||||
self._filename = filename
|
||||
elif hasattr(fileobj, "name"):
|
||||
self._filename = fileobj.name
|
||||
else:
|
||||
self._filename = repr(fileobj)
|
||||
|
||||
# From tzfile(5):
|
||||
#
|
||||
# The time zone information files used by tzset(3)
|
||||
# begin with the magic characters "TZif" to identify
|
||||
# them as time zone information files, followed by
|
||||
# sixteen bytes reserved for future use, followed by
|
||||
# six four-byte values of type long, written in a
|
||||
# ``standard'' byte order (the high-order byte
|
||||
# of the value is written first).
|
||||
try:
|
||||
if fileobj.read(4).decode() != "TZif":
|
||||
raise ValueError("magic not found")
|
||||
|
||||
fileobj.read(16)
|
||||
|
||||
(
|
||||
# The number of UTC/local indicators stored in the file.
|
||||
ttisgmtcnt,
|
||||
|
||||
# The number of standard/wall indicators stored in the file.
|
||||
ttisstdcnt,
|
||||
|
||||
# The number of leap seconds for which data is
|
||||
# stored in the file.
|
||||
leapcnt,
|
||||
|
||||
# The number of "transition times" for which data
|
||||
# is stored in the file.
|
||||
timecnt,
|
||||
|
||||
# The number of "local time types" for which data
|
||||
# is stored in the file (must not be zero).
|
||||
typecnt,
|
||||
|
||||
# The number of characters of "time zone
|
||||
# abbreviation strings" stored in the file.
|
||||
charcnt,
|
||||
|
||||
) = struct.unpack(">6l", fileobj.read(24))
|
||||
|
||||
# The above header is followed by tzh_timecnt four-byte
|
||||
# values of type long, sorted in ascending order.
|
||||
# These values are written in ``standard'' byte order.
|
||||
# Each is used as a transition time (as returned by
|
||||
# time(2)) at which the rules for computing local time
|
||||
# change.
|
||||
|
||||
if timecnt:
|
||||
self._trans_list = struct.unpack(">%dl" % timecnt,
|
||||
fileobj.read(timecnt*4))
|
||||
else:
|
||||
self._trans_list = []
|
||||
|
||||
# Next come tzh_timecnt one-byte values of type unsigned
|
||||
# char; each one tells which of the different types of
|
||||
# ``local time'' types described in the file is associated
|
||||
# with the same-indexed transition time. These values
|
||||
# serve as indices into an array of ttinfo structures that
|
||||
# appears next in the file.
|
||||
|
||||
if timecnt:
|
||||
self._trans_idx = struct.unpack(">%dB" % timecnt,
|
||||
fileobj.read(timecnt))
|
||||
else:
|
||||
self._trans_idx = []
|
||||
|
||||
# Each ttinfo structure is written as a four-byte value
|
||||
# for tt_gmtoff of type long, in a standard byte
|
||||
# order, followed by a one-byte value for tt_isdst
|
||||
# and a one-byte value for tt_abbrind. In each
|
||||
# structure, tt_gmtoff gives the number of
|
||||
# seconds to be added to UTC, tt_isdst tells whether
|
||||
# tm_isdst should be set by localtime(3), and
|
||||
# tt_abbrind serves as an index into the array of
|
||||
# time zone abbreviation characters that follow the
|
||||
# ttinfo structure(s) in the file.
|
||||
|
||||
ttinfo = []
|
||||
|
||||
for i in range(typecnt):
|
||||
ttinfo.append(struct.unpack(">lbb", fileobj.read(6)))
|
||||
|
||||
abbr = fileobj.read(charcnt).decode()
|
||||
|
||||
# Then there are tzh_leapcnt pairs of four-byte
|
||||
# values, written in standard byte order; the
|
||||
# first value of each pair gives the time (as
|
||||
# returned by time(2)) at which a leap second
|
||||
# occurs; the second gives the total number of
|
||||
# leap seconds to be applied after the given time.
|
||||
# The pairs of values are sorted in ascending order
|
||||
# by time.
|
||||
|
||||
# Not used, for now
|
||||
# if leapcnt:
|
||||
# leap = struct.unpack(">%dl" % (leapcnt*2),
|
||||
# fileobj.read(leapcnt*8))
|
||||
|
||||
# Then there are tzh_ttisstdcnt standard/wall
|
||||
# indicators, each stored as a one-byte value;
|
||||
# they tell whether the transition times associated
|
||||
# with local time types were specified as standard
|
||||
# time or wall clock time, and are used when
|
||||
# a time zone file is used in handling POSIX-style
|
||||
# time zone environment variables.
|
||||
|
||||
if ttisstdcnt:
|
||||
isstd = struct.unpack(">%db" % ttisstdcnt,
|
||||
fileobj.read(ttisstdcnt))
|
||||
|
||||
# Finally, there are tzh_ttisgmtcnt UTC/local
|
||||
# indicators, each stored as a one-byte value;
|
||||
# they tell whether the transition times associated
|
||||
# with local time types were specified as UTC or
|
||||
# local time, and are used when a time zone file
|
||||
# is used in handling POSIX-style time zone envi-
|
||||
# ronment variables.
|
||||
|
||||
if ttisgmtcnt:
|
||||
isgmt = struct.unpack(">%db" % ttisgmtcnt,
|
||||
fileobj.read(ttisgmtcnt))
|
||||
|
||||
# ** Everything has been read **
|
||||
finally:
|
||||
if file_opened_here:
|
||||
fileobj.close()
|
||||
|
||||
# Build ttinfo list
|
||||
self._ttinfo_list = []
|
||||
for i in range(typecnt):
|
||||
gmtoff, isdst, abbrind = ttinfo[i]
|
||||
# Round to full-minutes if that's not the case. Python's
|
||||
# datetime doesn't accept sub-minute timezones. Check
|
||||
# http://python.org/sf/1447945 for some information.
|
||||
gmtoff = (gmtoff+30)//60*60
|
||||
tti = _ttinfo()
|
||||
tti.offset = gmtoff
|
||||
tti.delta = datetime.timedelta(seconds=gmtoff)
|
||||
tti.isdst = isdst
|
||||
tti.abbr = abbr[abbrind:abbr.find('\x00', abbrind)]
|
||||
tti.isstd = (ttisstdcnt > i and isstd[i] != 0)
|
||||
tti.isgmt = (ttisgmtcnt > i and isgmt[i] != 0)
|
||||
self._ttinfo_list.append(tti)
|
||||
|
||||
# Replace ttinfo indexes for ttinfo objects.
|
||||
trans_idx = []
|
||||
for idx in self._trans_idx:
|
||||
trans_idx.append(self._ttinfo_list[idx])
|
||||
self._trans_idx = tuple(trans_idx)
|
||||
|
||||
# Set standard, dst, and before ttinfos. before will be
|
||||
# used when a given time is before any transitions,
|
||||
# and will be set to the first non-dst ttinfo, or to
|
||||
# the first dst, if all of them are dst.
|
||||
self._ttinfo_std = None
|
||||
self._ttinfo_dst = None
|
||||
self._ttinfo_before = None
|
||||
if self._ttinfo_list:
|
||||
if not self._trans_list:
|
||||
self._ttinfo_std = self._ttinfo_first = self._ttinfo_list[0]
|
||||
else:
|
||||
for i in range(timecnt-1, -1, -1):
|
||||
tti = self._trans_idx[i]
|
||||
if not self._ttinfo_std and not tti.isdst:
|
||||
self._ttinfo_std = tti
|
||||
elif not self._ttinfo_dst and tti.isdst:
|
||||
self._ttinfo_dst = tti
|
||||
if self._ttinfo_std and self._ttinfo_dst:
|
||||
break
|
||||
else:
|
||||
if self._ttinfo_dst and not self._ttinfo_std:
|
||||
self._ttinfo_std = self._ttinfo_dst
|
||||
|
||||
for tti in self._ttinfo_list:
|
||||
if not tti.isdst:
|
||||
self._ttinfo_before = tti
|
||||
break
|
||||
else:
|
||||
self._ttinfo_before = self._ttinfo_list[0]
|
||||
|
||||
# Now fix transition times to become relative to wall time.
|
||||
#
|
||||
# I'm not sure about this. In my tests, the tz source file
|
||||
# is setup to wall time, and in the binary file isstd and
|
||||
# isgmt are off, so it should be in wall time. OTOH, it's
|
||||
# always in gmt time. Let me know if you have comments
|
||||
# about this.
|
||||
laststdoffset = 0
|
||||
self._trans_list = list(self._trans_list)
|
||||
for i in range(len(self._trans_list)):
|
||||
tti = self._trans_idx[i]
|
||||
if not tti.isdst:
|
||||
# This is std time.
|
||||
self._trans_list[i] += tti.offset
|
||||
laststdoffset = tti.offset
|
||||
else:
|
||||
# This is dst time. Convert to std.
|
||||
self._trans_list[i] += laststdoffset
|
||||
self._trans_list = tuple(self._trans_list)
|
||||
|
||||
def _find_ttinfo(self, dt, laststd=0):
|
||||
timestamp = ((dt.toordinal() - EPOCHORDINAL) * 86400
|
||||
+ dt.hour * 3600
|
||||
+ dt.minute * 60
|
||||
+ dt.second)
|
||||
idx = 0
|
||||
for trans in self._trans_list:
|
||||
if timestamp < trans:
|
||||
break
|
||||
idx += 1
|
||||
else:
|
||||
return self._ttinfo_std
|
||||
if idx == 0:
|
||||
return self._ttinfo_before
|
||||
if laststd:
|
||||
while idx > 0:
|
||||
tti = self._trans_idx[idx-1]
|
||||
if not tti.isdst:
|
||||
return tti
|
||||
idx -= 1
|
||||
else:
|
||||
return self._ttinfo_std
|
||||
else:
|
||||
return self._trans_idx[idx-1]
|
||||
|
||||
def utcoffset(self, dt):
|
||||
if not self._ttinfo_std:
|
||||
return ZERO
|
||||
return self._find_ttinfo(dt).delta
|
||||
|
||||
def dst(self, dt):
|
||||
if not self._ttinfo_dst:
|
||||
return ZERO
|
||||
tti = self._find_ttinfo(dt)
|
||||
if not tti.isdst:
|
||||
return ZERO
|
||||
|
||||
# The documentation says that utcoffset()-dst() must
|
||||
# be constant for every dt.
|
||||
return tti.delta-self._find_ttinfo(dt, laststd=1).delta
|
||||
|
||||
# An alternative for that would be:
|
||||
#
|
||||
# return self._ttinfo_dst.offset-self._ttinfo_std.offset
|
||||
#
|
||||
# However, this class stores historical changes in the
|
||||
# dst offset, so I belive that this wouldn't be the right
|
||||
# way to implement this.
|
||||
|
||||
@tzname_in_python2
|
||||
def tzname(self, dt):
|
||||
if not self._ttinfo_std:
|
||||
return None
|
||||
return self._find_ttinfo(dt).abbr
|
||||
|
||||
def __eq__(self, other):
|
||||
if not isinstance(other, tzfile):
|
||||
return False
|
||||
return (self._trans_list == other._trans_list and
|
||||
self._trans_idx == other._trans_idx and
|
||||
self._ttinfo_list == other._ttinfo_list)
|
||||
|
||||
def __ne__(self, other):
|
||||
return not self.__eq__(other)
|
||||
|
||||
def __repr__(self):
|
||||
return "%s(%s)" % (self.__class__.__name__, repr(self._filename))
|
||||
|
||||
def __reduce__(self):
|
||||
if not os.path.isfile(self._filename):
|
||||
raise ValueError("Unpickable %s class" % self.__class__.__name__)
|
||||
return (self.__class__, (self._filename,))
|
||||
|
||||
|
||||
class tzrange(datetime.tzinfo):
|
||||
def __init__(self, stdabbr, stdoffset=None,
|
||||
dstabbr=None, dstoffset=None,
|
||||
start=None, end=None):
|
||||
global relativedelta
|
||||
if not relativedelta:
|
||||
from dateutil import relativedelta
|
||||
self._std_abbr = stdabbr
|
||||
self._dst_abbr = dstabbr
|
||||
if stdoffset is not None:
|
||||
self._std_offset = datetime.timedelta(seconds=stdoffset)
|
||||
else:
|
||||
self._std_offset = ZERO
|
||||
if dstoffset is not None:
|
||||
self._dst_offset = datetime.timedelta(seconds=dstoffset)
|
||||
elif dstabbr and stdoffset is not None:
|
||||
self._dst_offset = self._std_offset+datetime.timedelta(hours=+1)
|
||||
else:
|
||||
self._dst_offset = ZERO
|
||||
if dstabbr and start is None:
|
||||
self._start_delta = relativedelta.relativedelta(
|
||||
hours=+2, month=4, day=1, weekday=relativedelta.SU(+1))
|
||||
else:
|
||||
self._start_delta = start
|
||||
if dstabbr and end is None:
|
||||
self._end_delta = relativedelta.relativedelta(
|
||||
hours=+1, month=10, day=31, weekday=relativedelta.SU(-1))
|
||||
else:
|
||||
self._end_delta = end
|
||||
|
||||
def utcoffset(self, dt):
|
||||
if self._isdst(dt):
|
||||
return self._dst_offset
|
||||
else:
|
||||
return self._std_offset
|
||||
|
||||
def dst(self, dt):
|
||||
if self._isdst(dt):
|
||||
return self._dst_offset-self._std_offset
|
||||
else:
|
||||
return ZERO
|
||||
|
||||
@tzname_in_python2
|
||||
def tzname(self, dt):
|
||||
if self._isdst(dt):
|
||||
return self._dst_abbr
|
||||
else:
|
||||
return self._std_abbr
|
||||
|
||||
def _isdst(self, dt):
|
||||
if not self._start_delta:
|
||||
return False
|
||||
year = datetime.datetime(dt.year, 1, 1)
|
||||
start = year+self._start_delta
|
||||
end = year+self._end_delta
|
||||
dt = dt.replace(tzinfo=None)
|
||||
if start < end:
|
||||
return dt >= start and dt < end
|
||||
else:
|
||||
return dt >= start or dt < end
|
||||
|
||||
def __eq__(self, other):
|
||||
if not isinstance(other, tzrange):
|
||||
return False
|
||||
return (self._std_abbr == other._std_abbr and
|
||||
self._dst_abbr == other._dst_abbr and
|
||||
self._std_offset == other._std_offset and
|
||||
self._dst_offset == other._dst_offset and
|
||||
self._start_delta == other._start_delta and
|
||||
self._end_delta == other._end_delta)
|
||||
|
||||
def __ne__(self, other):
|
||||
return not self.__eq__(other)
|
||||
|
||||
def __repr__(self):
|
||||
return "%s(...)" % self.__class__.__name__
|
||||
|
||||
__reduce__ = object.__reduce__
|
||||
|
||||
|
||||
class tzstr(tzrange):
|
||||
|
||||
def __init__(self, s):
|
||||
global parser
|
||||
if not parser:
|
||||
from dateutil import parser
|
||||
self._s = s
|
||||
|
||||
res = parser._parsetz(s)
|
||||
if res is None:
|
||||
raise ValueError("unknown string format")
|
||||
|
||||
# Here we break the compatibility with the TZ variable handling.
|
||||
# GMT-3 actually *means* the timezone -3.
|
||||
if res.stdabbr in ("GMT", "UTC"):
|
||||
res.stdoffset *= -1
|
||||
|
||||
# We must initialize it first, since _delta() needs
|
||||
# _std_offset and _dst_offset set. Use False in start/end
|
||||
# to avoid building it two times.
|
||||
tzrange.__init__(self, res.stdabbr, res.stdoffset,
|
||||
res.dstabbr, res.dstoffset,
|
||||
start=False, end=False)
|
||||
|
||||
if not res.dstabbr:
|
||||
self._start_delta = None
|
||||
self._end_delta = None
|
||||
else:
|
||||
self._start_delta = self._delta(res.start)
|
||||
if self._start_delta:
|
||||
self._end_delta = self._delta(res.end, isend=1)
|
||||
|
||||
def _delta(self, x, isend=0):
|
||||
kwargs = {}
|
||||
if x.month is not None:
|
||||
kwargs["month"] = x.month
|
||||
if x.weekday is not None:
|
||||
kwargs["weekday"] = relativedelta.weekday(x.weekday, x.week)
|
||||
if x.week > 0:
|
||||
kwargs["day"] = 1
|
||||
else:
|
||||
kwargs["day"] = 31
|
||||
elif x.day:
|
||||
kwargs["day"] = x.day
|
||||
elif x.yday is not None:
|
||||
kwargs["yearday"] = x.yday
|
||||
elif x.jyday is not None:
|
||||
kwargs["nlyearday"] = x.jyday
|
||||
if not kwargs:
|
||||
# Default is to start on first sunday of april, and end
|
||||
# on last sunday of october.
|
||||
if not isend:
|
||||
kwargs["month"] = 4
|
||||
kwargs["day"] = 1
|
||||
kwargs["weekday"] = relativedelta.SU(+1)
|
||||
else:
|
||||
kwargs["month"] = 10
|
||||
kwargs["day"] = 31
|
||||
kwargs["weekday"] = relativedelta.SU(-1)
|
||||
if x.time is not None:
|
||||
kwargs["seconds"] = x.time
|
||||
else:
|
||||
# Default is 2AM.
|
||||
kwargs["seconds"] = 7200
|
||||
if isend:
|
||||
# Convert to standard time, to follow the documented way
|
||||
# of working with the extra hour. See the documentation
|
||||
# of the tzinfo class.
|
||||
delta = self._dst_offset-self._std_offset
|
||||
kwargs["seconds"] -= delta.seconds+delta.days*86400
|
||||
return relativedelta.relativedelta(**kwargs)
|
||||
|
||||
def __repr__(self):
|
||||
return "%s(%s)" % (self.__class__.__name__, repr(self._s))
|
||||
|
||||
|
||||
class _tzicalvtzcomp(object):
|
||||
def __init__(self, tzoffsetfrom, tzoffsetto, isdst,
|
||||
tzname=None, rrule=None):
|
||||
self.tzoffsetfrom = datetime.timedelta(seconds=tzoffsetfrom)
|
||||
self.tzoffsetto = datetime.timedelta(seconds=tzoffsetto)
|
||||
self.tzoffsetdiff = self.tzoffsetto-self.tzoffsetfrom
|
||||
self.isdst = isdst
|
||||
self.tzname = tzname
|
||||
self.rrule = rrule
|
||||
|
||||
|
||||
class _tzicalvtz(datetime.tzinfo):
|
||||
def __init__(self, tzid, comps=[]):
|
||||
self._tzid = tzid
|
||||
self._comps = comps
|
||||
self._cachedate = []
|
||||
self._cachecomp = []
|
||||
|
||||
def _find_comp(self, dt):
|
||||
if len(self._comps) == 1:
|
||||
return self._comps[0]
|
||||
dt = dt.replace(tzinfo=None)
|
||||
try:
|
||||
return self._cachecomp[self._cachedate.index(dt)]
|
||||
except ValueError:
|
||||
pass
|
||||
lastcomp = None
|
||||
lastcompdt = None
|
||||
for comp in self._comps:
|
||||
if not comp.isdst:
|
||||
# Handle the extra hour in DST -> STD
|
||||
compdt = comp.rrule.before(dt-comp.tzoffsetdiff, inc=True)
|
||||
else:
|
||||
compdt = comp.rrule.before(dt, inc=True)
|
||||
if compdt and (not lastcompdt or lastcompdt < compdt):
|
||||
lastcompdt = compdt
|
||||
lastcomp = comp
|
||||
if not lastcomp:
|
||||
# RFC says nothing about what to do when a given
|
||||
# time is before the first onset date. We'll look for the
|
||||
# first standard component, or the first component, if
|
||||
# none is found.
|
||||
for comp in self._comps:
|
||||
if not comp.isdst:
|
||||
lastcomp = comp
|
||||
break
|
||||
else:
|
||||
lastcomp = comp[0]
|
||||
self._cachedate.insert(0, dt)
|
||||
self._cachecomp.insert(0, lastcomp)
|
||||
if len(self._cachedate) > 10:
|
||||
self._cachedate.pop()
|
||||
self._cachecomp.pop()
|
||||
return lastcomp
|
||||
|
||||
def utcoffset(self, dt):
|
||||
return self._find_comp(dt).tzoffsetto
|
||||
|
||||
def dst(self, dt):
|
||||
comp = self._find_comp(dt)
|
||||
if comp.isdst:
|
||||
return comp.tzoffsetdiff
|
||||
else:
|
||||
return ZERO
|
||||
|
||||
@tzname_in_python2
|
||||
def tzname(self, dt):
|
||||
return self._find_comp(dt).tzname
|
||||
|
||||
def __repr__(self):
|
||||
return "<tzicalvtz %s>" % repr(self._tzid)
|
||||
|
||||
__reduce__ = object.__reduce__
|
||||
|
||||
|
||||
class tzical(object):
|
||||
def __init__(self, fileobj):
|
||||
global rrule
|
||||
if not rrule:
|
||||
from dateutil import rrule
|
||||
|
||||
if isinstance(fileobj, string_types):
|
||||
self._s = fileobj
|
||||
# ical should be encoded in UTF-8 with CRLF
|
||||
fileobj = open(fileobj, 'r')
|
||||
elif hasattr(fileobj, "name"):
|
||||
self._s = fileobj.name
|
||||
else:
|
||||
self._s = repr(fileobj)
|
||||
|
||||
self._vtz = {}
|
||||
|
||||
self._parse_rfc(fileobj.read())
|
||||
|
||||
def keys(self):
|
||||
return list(self._vtz.keys())
|
||||
|
||||
def get(self, tzid=None):
|
||||
if tzid is None:
|
||||
keys = list(self._vtz.keys())
|
||||
if len(keys) == 0:
|
||||
raise ValueError("no timezones defined")
|
||||
elif len(keys) > 1:
|
||||
raise ValueError("more than one timezone available")
|
||||
tzid = keys[0]
|
||||
return self._vtz.get(tzid)
|
||||
|
||||
def _parse_offset(self, s):
|
||||
s = s.strip()
|
||||
if not s:
|
||||
raise ValueError("empty offset")
|
||||
if s[0] in ('+', '-'):
|
||||
signal = (-1, +1)[s[0] == '+']
|
||||
s = s[1:]
|
||||
else:
|
||||
signal = +1
|
||||
if len(s) == 4:
|
||||
return (int(s[:2])*3600+int(s[2:])*60)*signal
|
||||
elif len(s) == 6:
|
||||
return (int(s[:2])*3600+int(s[2:4])*60+int(s[4:]))*signal
|
||||
else:
|
||||
raise ValueError("invalid offset: "+s)
|
||||
|
||||
def _parse_rfc(self, s):
|
||||
lines = s.splitlines()
|
||||
if not lines:
|
||||
raise ValueError("empty string")
|
||||
|
||||
# Unfold
|
||||
i = 0
|
||||
while i < len(lines):
|
||||
line = lines[i].rstrip()
|
||||
if not line:
|
||||
del lines[i]
|
||||
elif i > 0 and line[0] == " ":
|
||||
lines[i-1] += line[1:]
|
||||
del lines[i]
|
||||
else:
|
||||
i += 1
|
||||
|
||||
tzid = None
|
||||
comps = []
|
||||
invtz = False
|
||||
comptype = None
|
||||
for line in lines:
|
||||
if not line:
|
||||
continue
|
||||
name, value = line.split(':', 1)
|
||||
parms = name.split(';')
|
||||
if not parms:
|
||||
raise ValueError("empty property name")
|
||||
name = parms[0].upper()
|
||||
parms = parms[1:]
|
||||
if invtz:
|
||||
if name == "BEGIN":
|
||||
if value in ("STANDARD", "DAYLIGHT"):
|
||||
# Process component
|
||||
pass
|
||||
else:
|
||||
raise ValueError("unknown component: "+value)
|
||||
comptype = value
|
||||
founddtstart = False
|
||||
tzoffsetfrom = None
|
||||
tzoffsetto = None
|
||||
rrulelines = []
|
||||
tzname = None
|
||||
elif name == "END":
|
||||
if value == "VTIMEZONE":
|
||||
if comptype:
|
||||
raise ValueError("component not closed: "+comptype)
|
||||
if not tzid:
|
||||
raise ValueError("mandatory TZID not found")
|
||||
if not comps:
|
||||
raise ValueError(
|
||||
"at least one component is needed")
|
||||
# Process vtimezone
|
||||
self._vtz[tzid] = _tzicalvtz(tzid, comps)
|
||||
invtz = False
|
||||
elif value == comptype:
|
||||
if not founddtstart:
|
||||
raise ValueError("mandatory DTSTART not found")
|
||||
if tzoffsetfrom is None:
|
||||
raise ValueError(
|
||||
"mandatory TZOFFSETFROM not found")
|
||||
if tzoffsetto is None:
|
||||
raise ValueError(
|
||||
"mandatory TZOFFSETFROM not found")
|
||||
# Process component
|
||||
rr = None
|
||||
if rrulelines:
|
||||
rr = rrule.rrulestr("\n".join(rrulelines),
|
||||
compatible=True,
|
||||
ignoretz=True,
|
||||
cache=True)
|
||||
comp = _tzicalvtzcomp(tzoffsetfrom, tzoffsetto,
|
||||
(comptype == "DAYLIGHT"),
|
||||
tzname, rr)
|
||||
comps.append(comp)
|
||||
comptype = None
|
||||
else:
|
||||
raise ValueError("invalid component end: "+value)
|
||||
elif comptype:
|
||||
if name == "DTSTART":
|
||||
rrulelines.append(line)
|
||||
founddtstart = True
|
||||
elif name in ("RRULE", "RDATE", "EXRULE", "EXDATE"):
|
||||
rrulelines.append(line)
|
||||
elif name == "TZOFFSETFROM":
|
||||
if parms:
|
||||
raise ValueError(
|
||||
"unsupported %s parm: %s " % (name, parms[0]))
|
||||
tzoffsetfrom = self._parse_offset(value)
|
||||
elif name == "TZOFFSETTO":
|
||||
if parms:
|
||||
raise ValueError(
|
||||
"unsupported TZOFFSETTO parm: "+parms[0])
|
||||
tzoffsetto = self._parse_offset(value)
|
||||
elif name == "TZNAME":
|
||||
if parms:
|
||||
raise ValueError(
|
||||
"unsupported TZNAME parm: "+parms[0])
|
||||
tzname = value
|
||||
elif name == "COMMENT":
|
||||
pass
|
||||
else:
|
||||
raise ValueError("unsupported property: "+name)
|
||||
else:
|
||||
if name == "TZID":
|
||||
if parms:
|
||||
raise ValueError(
|
||||
"unsupported TZID parm: "+parms[0])
|
||||
tzid = value
|
||||
elif name in ("TZURL", "LAST-MODIFIED", "COMMENT"):
|
||||
pass
|
||||
else:
|
||||
raise ValueError("unsupported property: "+name)
|
||||
elif name == "BEGIN" and value == "VTIMEZONE":
|
||||
tzid = None
|
||||
comps = []
|
||||
invtz = True
|
||||
|
||||
def __repr__(self):
|
||||
return "%s(%s)" % (self.__class__.__name__, repr(self._s))
|
||||
|
||||
if sys.platform != "win32":
|
||||
TZFILES = ["/etc/localtime", "localtime"]
|
||||
TZPATHS = ["/usr/share/zoneinfo", "/usr/lib/zoneinfo", "/etc/zoneinfo"]
|
||||
else:
|
||||
TZFILES = []
|
||||
TZPATHS = []
|
||||
|
||||
|
||||
def gettz(name=None):
|
||||
tz = None
|
||||
if not name:
|
||||
try:
|
||||
name = os.environ["TZ"]
|
||||
except KeyError:
|
||||
pass
|
||||
if name is None or name == ":":
|
||||
for filepath in TZFILES:
|
||||
if not os.path.isabs(filepath):
|
||||
filename = filepath
|
||||
for path in TZPATHS:
|
||||
filepath = os.path.join(path, filename)
|
||||
if os.path.isfile(filepath):
|
||||
break
|
||||
else:
|
||||
continue
|
||||
if os.path.isfile(filepath):
|
||||
try:
|
||||
tz = tzfile(filepath)
|
||||
break
|
||||
except (IOError, OSError, ValueError):
|
||||
pass
|
||||
else:
|
||||
tz = tzlocal()
|
||||
else:
|
||||
if name.startswith(":"):
|
||||
name = name[:-1]
|
||||
if os.path.isabs(name):
|
||||
if os.path.isfile(name):
|
||||
tz = tzfile(name)
|
||||
else:
|
||||
tz = None
|
||||
else:
|
||||
for path in TZPATHS:
|
||||
filepath = os.path.join(path, name)
|
||||
if not os.path.isfile(filepath):
|
||||
filepath = filepath.replace(' ', '_')
|
||||
if not os.path.isfile(filepath):
|
||||
continue
|
||||
try:
|
||||
tz = tzfile(filepath)
|
||||
break
|
||||
except (IOError, OSError, ValueError):
|
||||
pass
|
||||
else:
|
||||
tz = None
|
||||
if tzwin is not None:
|
||||
try:
|
||||
tz = tzwin(name)
|
||||
except WindowsError:
|
||||
tz = None
|
||||
if not tz:
|
||||
from dateutil.zoneinfo import gettz
|
||||
tz = gettz(name)
|
||||
if not tz:
|
||||
for c in name:
|
||||
# name must have at least one offset to be a tzstr
|
||||
if c in "0123456789":
|
||||
try:
|
||||
tz = tzstr(name)
|
||||
except ValueError:
|
||||
pass
|
||||
break
|
||||
else:
|
||||
if name in ("GMT", "UTC"):
|
||||
tz = tzutc()
|
||||
elif name in time.tzname:
|
||||
tz = tzlocal()
|
||||
return tz
|
||||
|
||||
# vim:ts=4:sw=4:et
|
184
pythonPackages/python-dateutil/dateutil/tzwin.py
Normal file
184
pythonPackages/python-dateutil/dateutil/tzwin.py
Normal file
|
@ -0,0 +1,184 @@
|
|||
# This code was originally contributed by Jeffrey Harris.
|
||||
import datetime
|
||||
import struct
|
||||
|
||||
from six.moves import winreg
|
||||
|
||||
__all__ = ["tzwin", "tzwinlocal"]
|
||||
|
||||
ONEWEEK = datetime.timedelta(7)
|
||||
|
||||
TZKEYNAMENT = r"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones"
|
||||
TZKEYNAME9X = r"SOFTWARE\Microsoft\Windows\CurrentVersion\Time Zones"
|
||||
TZLOCALKEYNAME = r"SYSTEM\CurrentControlSet\Control\TimeZoneInformation"
|
||||
|
||||
|
||||
def _settzkeyname():
|
||||
handle = winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE)
|
||||
try:
|
||||
winreg.OpenKey(handle, TZKEYNAMENT).Close()
|
||||
TZKEYNAME = TZKEYNAMENT
|
||||
except WindowsError:
|
||||
TZKEYNAME = TZKEYNAME9X
|
||||
handle.Close()
|
||||
return TZKEYNAME
|
||||
|
||||
TZKEYNAME = _settzkeyname()
|
||||
|
||||
|
||||
class tzwinbase(datetime.tzinfo):
|
||||
"""tzinfo class based on win32's timezones available in the registry."""
|
||||
|
||||
def utcoffset(self, dt):
|
||||
if self._isdst(dt):
|
||||
return datetime.timedelta(minutes=self._dstoffset)
|
||||
else:
|
||||
return datetime.timedelta(minutes=self._stdoffset)
|
||||
|
||||
def dst(self, dt):
|
||||
if self._isdst(dt):
|
||||
minutes = self._dstoffset - self._stdoffset
|
||||
return datetime.timedelta(minutes=minutes)
|
||||
else:
|
||||
return datetime.timedelta(0)
|
||||
|
||||
def tzname(self, dt):
|
||||
if self._isdst(dt):
|
||||
return self._dstname
|
||||
else:
|
||||
return self._stdname
|
||||
|
||||
def list():
|
||||
"""Return a list of all time zones known to the system."""
|
||||
handle = winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE)
|
||||
tzkey = winreg.OpenKey(handle, TZKEYNAME)
|
||||
result = [winreg.EnumKey(tzkey, i)
|
||||
for i in range(winreg.QueryInfoKey(tzkey)[0])]
|
||||
tzkey.Close()
|
||||
handle.Close()
|
||||
return result
|
||||
list = staticmethod(list)
|
||||
|
||||
def display(self):
|
||||
return self._display
|
||||
|
||||
def _isdst(self, dt):
|
||||
if not self._dstmonth:
|
||||
# dstmonth == 0 signals the zone has no daylight saving time
|
||||
return False
|
||||
dston = picknthweekday(dt.year, self._dstmonth, self._dstdayofweek,
|
||||
self._dsthour, self._dstminute,
|
||||
self._dstweeknumber)
|
||||
dstoff = picknthweekday(dt.year, self._stdmonth, self._stddayofweek,
|
||||
self._stdhour, self._stdminute,
|
||||
self._stdweeknumber)
|
||||
if dston < dstoff:
|
||||
return dston <= dt.replace(tzinfo=None) < dstoff
|
||||
else:
|
||||
return not dstoff <= dt.replace(tzinfo=None) < dston
|
||||
|
||||
|
||||
class tzwin(tzwinbase):
|
||||
|
||||
def __init__(self, name):
|
||||
self._name = name
|
||||
|
||||
# multiple contexts only possible in 2.7 and 3.1, we still support 2.6
|
||||
with winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) as handle:
|
||||
with winreg.OpenKey(handle,
|
||||
"%s\%s" % (TZKEYNAME, name)) as tzkey:
|
||||
keydict = valuestodict(tzkey)
|
||||
|
||||
self._stdname = keydict["Std"].encode("iso-8859-1")
|
||||
self._dstname = keydict["Dlt"].encode("iso-8859-1")
|
||||
|
||||
self._display = keydict["Display"]
|
||||
|
||||
# See http://ww_winreg.jsiinc.com/SUBA/tip0300/rh0398.htm
|
||||
tup = struct.unpack("=3l16h", keydict["TZI"])
|
||||
self._stdoffset = -tup[0]-tup[1] # Bias + StandardBias * -1
|
||||
self._dstoffset = self._stdoffset-tup[2] # + DaylightBias * -1
|
||||
|
||||
# for the meaning see the win32 TIME_ZONE_INFORMATION structure docs
|
||||
# http://msdn.microsoft.com/en-us/library/windows/desktop/ms725481(v=vs.85).aspx
|
||||
(self._stdmonth,
|
||||
self._stddayofweek, # Sunday = 0
|
||||
self._stdweeknumber, # Last = 5
|
||||
self._stdhour,
|
||||
self._stdminute) = tup[4:9]
|
||||
|
||||
(self._dstmonth,
|
||||
self._dstdayofweek, # Sunday = 0
|
||||
self._dstweeknumber, # Last = 5
|
||||
self._dsthour,
|
||||
self._dstminute) = tup[12:17]
|
||||
|
||||
def __repr__(self):
|
||||
return "tzwin(%s)" % repr(self._name)
|
||||
|
||||
def __reduce__(self):
|
||||
return (self.__class__, (self._name,))
|
||||
|
||||
|
||||
class tzwinlocal(tzwinbase):
|
||||
|
||||
def __init__(self):
|
||||
|
||||
with winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) as handle:
|
||||
|
||||
with winreg.OpenKey(handle, TZLOCALKEYNAME) as tzlocalkey:
|
||||
keydict = valuestodict(tzlocalkey)
|
||||
|
||||
self._stdname = keydict["StandardName"].encode("iso-8859-1")
|
||||
self._dstname = keydict["DaylightName"].encode("iso-8859-1")
|
||||
|
||||
try:
|
||||
with winreg.OpenKey(
|
||||
handle, "%s\%s" % (TZKEYNAME, self._stdname)) as tzkey:
|
||||
_keydict = valuestodict(tzkey)
|
||||
self._display = _keydict["Display"]
|
||||
except OSError:
|
||||
self._display = None
|
||||
|
||||
self._stdoffset = -keydict["Bias"]-keydict["StandardBias"]
|
||||
self._dstoffset = self._stdoffset-keydict["DaylightBias"]
|
||||
|
||||
# See http://ww_winreg.jsiinc.com/SUBA/tip0300/rh0398.htm
|
||||
tup = struct.unpack("=8h", keydict["StandardStart"])
|
||||
|
||||
(self._stdmonth,
|
||||
self._stddayofweek, # Sunday = 0
|
||||
self._stdweeknumber, # Last = 5
|
||||
self._stdhour,
|
||||
self._stdminute) = tup[1:6]
|
||||
|
||||
tup = struct.unpack("=8h", keydict["DaylightStart"])
|
||||
|
||||
(self._dstmonth,
|
||||
self._dstdayofweek, # Sunday = 0
|
||||
self._dstweeknumber, # Last = 5
|
||||
self._dsthour,
|
||||
self._dstminute) = tup[1:6]
|
||||
|
||||
def __reduce__(self):
|
||||
return (self.__class__, ())
|
||||
|
||||
|
||||
def picknthweekday(year, month, dayofweek, hour, minute, whichweek):
|
||||
"""dayofweek == 0 means Sunday, whichweek 5 means last instance"""
|
||||
first = datetime.datetime(year, month, 1, hour, minute)
|
||||
weekdayone = first.replace(day=((dayofweek-first.isoweekday()) % 7+1))
|
||||
for n in range(whichweek):
|
||||
dt = weekdayone+(whichweek-n)*ONEWEEK
|
||||
if dt.month == month:
|
||||
return dt
|
||||
|
||||
|
||||
def valuestodict(key):
|
||||
"""Convert a registry key's values to a dictionary."""
|
||||
dict = {}
|
||||
size = winreg.QueryInfoKey(key)[1]
|
||||
for i in range(size):
|
||||
data = winreg.EnumValue(key, i)
|
||||
dict[data[0]] = data[1]
|
||||
return dict
|
108
pythonPackages/python-dateutil/dateutil/zoneinfo/__init__.py
Normal file
108
pythonPackages/python-dateutil/dateutil/zoneinfo/__init__.py
Normal file
|
@ -0,0 +1,108 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
import logging
|
||||
import os
|
||||
import warnings
|
||||
import tempfile
|
||||
import shutil
|
||||
from subprocess import check_call
|
||||
from tarfile import TarFile
|
||||
from pkgutil import get_data
|
||||
from io import BytesIO
|
||||
from contextlib import closing
|
||||
|
||||
from dateutil.tz import tzfile
|
||||
|
||||
__all__ = ["gettz", "rebuild"]
|
||||
|
||||
_ZONEFILENAME = "dateutil-zoneinfo.tar.gz"
|
||||
|
||||
# python2.6 compatability. Note that TarFile.__exit__ != TarFile.close, but
|
||||
# it's close enough for python2.6
|
||||
_tar_open = TarFile.open
|
||||
if not hasattr(TarFile, '__exit__'):
|
||||
def _tar_open(*args, **kwargs):
|
||||
return closing(TarFile.open(*args, **kwargs))
|
||||
|
||||
|
||||
class tzfile(tzfile):
|
||||
def __reduce__(self):
|
||||
return (gettz, (self._filename,))
|
||||
|
||||
|
||||
def getzoneinfofile_stream():
|
||||
try:
|
||||
return BytesIO(get_data(__name__, _ZONEFILENAME))
|
||||
except IOError as e: # TODO switch to FileNotFoundError?
|
||||
warnings.warn("I/O error({0}): {1}".format(e.errno, e.strerror))
|
||||
return None
|
||||
|
||||
|
||||
class ZoneInfoFile(object):
|
||||
def __init__(self, zonefile_stream=None):
|
||||
if zonefile_stream is not None:
|
||||
with _tar_open(fileobj=zonefile_stream, mode='r') as tf:
|
||||
# dict comprehension does not work on python2.6
|
||||
# TODO: get back to the nicer syntax when we ditch python2.6
|
||||
# self.zones = {zf.name: tzfile(tf.extractfile(zf),
|
||||
# filename = zf.name)
|
||||
# for zf in tf.getmembers() if zf.isfile()}
|
||||
self.zones = dict((zf.name, tzfile(tf.extractfile(zf),
|
||||
filename=zf.name))
|
||||
for zf in tf.getmembers() if zf.isfile())
|
||||
# deal with links: They'll point to their parent object. Less
|
||||
# waste of memory
|
||||
# links = {zl.name: self.zones[zl.linkname]
|
||||
# for zl in tf.getmembers() if zl.islnk() or zl.issym()}
|
||||
links = dict((zl.name, self.zones[zl.linkname])
|
||||
for zl in tf.getmembers() if
|
||||
zl.islnk() or zl.issym())
|
||||
self.zones.update(links)
|
||||
else:
|
||||
self.zones = dict()
|
||||
|
||||
|
||||
# The current API has gettz as a module function, although in fact it taps into
|
||||
# a stateful class. So as a workaround for now, without changing the API, we
|
||||
# will create a new "global" class instance the first time a user requests a
|
||||
# timezone. Ugly, but adheres to the api.
|
||||
#
|
||||
# TODO: deprecate this.
|
||||
_CLASS_ZONE_INSTANCE = list()
|
||||
|
||||
|
||||
def gettz(name):
|
||||
if len(_CLASS_ZONE_INSTANCE) == 0:
|
||||
_CLASS_ZONE_INSTANCE.append(ZoneInfoFile(getzoneinfofile_stream()))
|
||||
return _CLASS_ZONE_INSTANCE[0].zones.get(name)
|
||||
|
||||
|
||||
def rebuild(filename, tag=None, format="gz", zonegroups=[]):
|
||||
"""Rebuild the internal timezone info in dateutil/zoneinfo/zoneinfo*tar*
|
||||
|
||||
filename is the timezone tarball from ftp.iana.org/tz.
|
||||
|
||||
"""
|
||||
tmpdir = tempfile.mkdtemp()
|
||||
zonedir = os.path.join(tmpdir, "zoneinfo")
|
||||
moduledir = os.path.dirname(__file__)
|
||||
try:
|
||||
with _tar_open(filename) as tf:
|
||||
for name in zonegroups:
|
||||
tf.extract(name, tmpdir)
|
||||
filepaths = [os.path.join(tmpdir, n) for n in zonegroups]
|
||||
try:
|
||||
check_call(["zic", "-d", zonedir] + filepaths)
|
||||
except OSError as e:
|
||||
if e.errno == 2:
|
||||
logging.error(
|
||||
"Could not find zic. Perhaps you need to install "
|
||||
"libc-bin or some other package that provides it, "
|
||||
"or it's not in your PATH?")
|
||||
raise
|
||||
target = os.path.join(moduledir, _ZONEFILENAME)
|
||||
with _tar_open(target, "w:%s" % format) as tf:
|
||||
for entry in os.listdir(zonedir):
|
||||
entrypath = os.path.join(zonedir, entry)
|
||||
tf.add(entrypath, entry)
|
||||
finally:
|
||||
shutil.rmtree(tmpdir)
|
Binary file not shown.
|
@ -0,0 +1,26 @@
|
|||
Metadata-Version: 1.1
|
||||
Name: python-dateutil
|
||||
Version: 2.4.2
|
||||
Summary: Extensions to the standard Python datetime module
|
||||
Home-page: https://dateutil.readthedocs.org
|
||||
Author: Yaron de Leeuw
|
||||
Author-email: me@jarondl.net
|
||||
License: Simplified BSD
|
||||
Description:
|
||||
The dateutil module provides powerful extensions to the
|
||||
datetime module available in the Python standard library.
|
||||
|
||||
Platform: UNKNOWN
|
||||
Classifier: Development Status :: 5 - Production/Stable
|
||||
Classifier: Intended Audience :: Developers
|
||||
Classifier: License :: OSI Approved :: BSD License
|
||||
Classifier: Programming Language :: Python
|
||||
Classifier: Programming Language :: Python :: 2
|
||||
Classifier: Programming Language :: Python :: 2.6
|
||||
Classifier: Programming Language :: Python :: 2.7
|
||||
Classifier: Programming Language :: Python :: 3
|
||||
Classifier: Programming Language :: Python :: 3.2
|
||||
Classifier: Programming Language :: Python :: 3.3
|
||||
Classifier: Programming Language :: Python :: 3.4
|
||||
Classifier: Topic :: Software Development :: Libraries
|
||||
Requires: six
|
|
@ -0,0 +1,25 @@
|
|||
LICENSE
|
||||
MANIFEST.in
|
||||
NEWS
|
||||
README.rst
|
||||
setup.cfg
|
||||
setup.py
|
||||
updatezinfo.py
|
||||
zonefile_metadata.json
|
||||
dateutil/__init__.py
|
||||
dateutil/easter.py
|
||||
dateutil/parser.py
|
||||
dateutil/relativedelta.py
|
||||
dateutil/rrule.py
|
||||
dateutil/tz.py
|
||||
dateutil/tzwin.py
|
||||
dateutil/test/__init__.py
|
||||
dateutil/test/test.py
|
||||
dateutil/zoneinfo/__init__.py
|
||||
dateutil/zoneinfo/dateutil-zoneinfo.tar.gz
|
||||
python_dateutil.egg-info/PKG-INFO
|
||||
python_dateutil.egg-info/SOURCES.txt
|
||||
python_dateutil.egg-info/dependency_links.txt
|
||||
python_dateutil.egg-info/requires.txt
|
||||
python_dateutil.egg-info/top_level.txt
|
||||
python_dateutil.egg-info/zip-safe
|
|
@ -0,0 +1 @@
|
|||
|
|
@ -0,0 +1 @@
|
|||
six >=1.5
|
|
@ -0,0 +1 @@
|
|||
dateutil
|
|
@ -0,0 +1 @@
|
|||
|
8
pythonPackages/python-dateutil/setup.cfg
Normal file
8
pythonPackages/python-dateutil/setup.cfg
Normal file
|
@ -0,0 +1,8 @@
|
|||
[bdist_wheel]
|
||||
universal = 1
|
||||
|
||||
[egg_info]
|
||||
tag_build =
|
||||
tag_date = 0
|
||||
tag_svn_revision = 0
|
||||
|
51
pythonPackages/python-dateutil/setup.py
Normal file
51
pythonPackages/python-dateutil/setup.py
Normal file
|
@ -0,0 +1,51 @@
|
|||
#!/usr/bin/python
|
||||
from os.path import isfile
|
||||
import codecs
|
||||
import os
|
||||
import re
|
||||
|
||||
from setuptools import setup
|
||||
|
||||
|
||||
if isfile("MANIFEST"):
|
||||
os.unlink("MANIFEST")
|
||||
|
||||
|
||||
TOPDIR = os.path.dirname(__file__) or "."
|
||||
VERSION = re.search('__version__ = "([^"]+)"',
|
||||
codecs.open(TOPDIR + "/dateutil/__init__.py",
|
||||
encoding='utf-8').read()).group(1)
|
||||
|
||||
|
||||
setup(name="python-dateutil",
|
||||
version=VERSION,
|
||||
description="Extensions to the standard Python datetime module",
|
||||
author="Yaron de Leeuw",
|
||||
author_email="me@jarondl.net",
|
||||
url="https://dateutil.readthedocs.org",
|
||||
license="Simplified BSD",
|
||||
long_description="""
|
||||
The dateutil module provides powerful extensions to the
|
||||
datetime module available in the Python standard library.
|
||||
""",
|
||||
packages=["dateutil", "dateutil.zoneinfo"],
|
||||
package_data={"dateutil.zoneinfo": ["dateutil-zoneinfo.tar.gz"]},
|
||||
zip_safe=True,
|
||||
requires=["six"],
|
||||
install_requires=["six >=1.5"], # XXX fix when packaging is sane again
|
||||
classifiers=[
|
||||
'Development Status :: 5 - Production/Stable',
|
||||
'Intended Audience :: Developers',
|
||||
'License :: OSI Approved :: BSD License',
|
||||
'Programming Language :: Python',
|
||||
'Programming Language :: Python :: 2',
|
||||
'Programming Language :: Python :: 2.6',
|
||||
'Programming Language :: Python :: 2.7',
|
||||
'Programming Language :: Python :: 3',
|
||||
'Programming Language :: Python :: 3.2',
|
||||
'Programming Language :: Python :: 3.3',
|
||||
'Programming Language :: Python :: 3.4',
|
||||
'Topic :: Software Development :: Libraries',
|
||||
],
|
||||
test_suite="dateutil.test.test"
|
||||
)
|
33
pythonPackages/python-dateutil/updatezinfo.py
Normal file
33
pythonPackages/python-dateutil/updatezinfo.py
Normal file
|
@ -0,0 +1,33 @@
|
|||
#!/usr/bin/env python
|
||||
import os
|
||||
import hashlib
|
||||
import json
|
||||
import io
|
||||
|
||||
from six.moves.urllib import request
|
||||
|
||||
from dateutil.zoneinfo import rebuild
|
||||
|
||||
METADATA_FILE = "zonefile_metadata.json"
|
||||
|
||||
|
||||
def main():
|
||||
with io.open(METADATA_FILE, 'r') as f:
|
||||
metadata = json.load(f)
|
||||
|
||||
if not os.path.isfile(metadata['tzdata_file']):
|
||||
print("Downloading tz file from iana")
|
||||
request.urlretrieve(os.path.join(metadata['releases_url'],
|
||||
metadata['tzdata_file']),
|
||||
metadata['tzdata_file'])
|
||||
with open(metadata['tzdata_file'], 'rb') as tzfile:
|
||||
sha_hasher = hashlib.sha512()
|
||||
sha_hasher.update(tzfile.read())
|
||||
sha_512_file = sha_hasher.hexdigest()
|
||||
assert metadata['tzdata_file_sha512'] == sha_512_file, "SHA failed for"
|
||||
print("Updating timezone information...")
|
||||
rebuild(metadata['tzdata_file'], zonegroups=metadata['zonegroups'])
|
||||
print("Done.")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
21
pythonPackages/python-dateutil/zonefile_metadata.json
Normal file
21
pythonPackages/python-dateutil/zonefile_metadata.json
Normal file
|
@ -0,0 +1,21 @@
|
|||
{
|
||||
"metadata_version" : 0.1,
|
||||
"releases_url" : "ftp://ftp.iana.org/tz/releases/",
|
||||
"tzdata_file" : "tzdata2015b.tar.gz",
|
||||
"tzdata_file_sha512" : "767782b87e62a8f7a4dbcae595d16a54197c9e04ca974d7016d11f90ebaf2537b804d111f204af9052c68d4670afe0af0af9e5b150867a357fc199bb541368d0",
|
||||
"zonegroups" : [
|
||||
"africa",
|
||||
"antarctica",
|
||||
"asia",
|
||||
"australasia",
|
||||
"europe",
|
||||
"northamerica",
|
||||
"southamerica",
|
||||
"pacificnew",
|
||||
"etcetera",
|
||||
"systemv",
|
||||
"factory",
|
||||
"backzone",
|
||||
"backward"]
|
||||
}
|
||||
|
31
pythonPackages/scipy-0.8.0/LICENSE.txt
Executable file
31
pythonPackages/scipy-0.8.0/LICENSE.txt
Executable file
|
@ -0,0 +1,31 @@
|
|||
Copyright (c) 2001, 2002 Enthought, Inc.
|
||||
All rights reserved.
|
||||
|
||||
Copyright (c) 2003-2009 SciPy Developers.
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
a. Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions and the following disclaimer.
|
||||
b. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
c. Neither the name of the Enthought nor the names of its contributors
|
||||
may be used to endorse or promote products derived from this software
|
||||
without specific prior written permission.
|
||||
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR
|
||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
|
||||
DAMAGE.
|
||||
|
19
pythonPackages/scipy-0.8.0/MANIFEST.in
Executable file
19
pythonPackages/scipy-0.8.0/MANIFEST.in
Executable file
|
@ -0,0 +1,19 @@
|
|||
# Use .add_data_files and .add_data_dir methods in a appropriate
|
||||
# setup.py files to include non-python files such as documentation,
|
||||
# data, etc files to distribution. Avoid using MANIFEST.in for that.
|
||||
#
|
||||
include MANIFEST.in
|
||||
include *.txt
|
||||
include setupscons.py
|
||||
include setupegg.py
|
||||
include setup.py
|
||||
include scipy/*.py
|
||||
# Adding scons build relateed files not found by distutils
|
||||
recursive-include scipy SConstruct SConscript
|
||||
# Add documentation: we don't use add_data_dir since we do not want to include
|
||||
# this at installation, only for sdist-generated tarballs
|
||||
include doc/Makefile doc/postprocess.py
|
||||
recursive-include doc/release *
|
||||
recursive-include doc/source *
|
||||
recursive-include doc/sphinxext *
|
||||
prune scipy/special/tests/data/boost
|
77
pythonPackages/scipy-0.8.0/THANKS.txt
Executable file
77
pythonPackages/scipy-0.8.0/THANKS.txt
Executable file
|
@ -0,0 +1,77 @@
|
|||
SciPy is an open source library of routines for science and engineering
|
||||
using Python. It is a community project sponsored by Enthought, Inc.
|
||||
SciPy originated with code contributions by Travis Oliphant, Pearu
|
||||
Peterson, and Eric Jones. Travis Oliphant and Eric Jones each contributed
|
||||
about half the initial code. Pearu Peterson developed f2py, which is the
|
||||
integral to wrapping the many Fortran libraries used in SciPy.
|
||||
|
||||
Since then many people have contributed to SciPy, both in code development,
|
||||
suggestions, and financial support. Below is a partial list. If you've
|
||||
been left off, please email the "SciPy Developers List" <scipy-dev@scipy.org>.
|
||||
|
||||
Please add names as needed so that we can keep up with all the contributors.
|
||||
|
||||
Kumar Appaiah for Dolph Chebyshev window.
|
||||
Nathan Bell for sparsetools, help with scipy.sparse and scipy.splinalg.
|
||||
Robert Cimrman for UMFpack wrapper for sparse matrix module.
|
||||
David M. Cooke for improvements to system_info, and LBFGSB wrapper.
|
||||
Aric Hagberg for ARPACK wrappers, help with splinalg.eigen.
|
||||
Chuck Harris for Zeros package in optimize (1d root-finding algorithms).
|
||||
Prabhu Ramachandran for improvements to gui_thread.
|
||||
Robert Kern for improvements to stats and bug-fixes.
|
||||
Jean-Sebastien Roy for fmin_tnc code which he adapted from Stephen Nash's
|
||||
original Fortran.
|
||||
Ed Schofield for Maximum entropy and Monte Carlo modules, help with
|
||||
sparse matrix module.
|
||||
Travis Vaught for numerous contributions to annual conference and community
|
||||
web-site and the initial work on stats module clean up.
|
||||
Jeff Whitaker for Mac OS X support.
|
||||
David Cournapeau for bug-fixes, refactoring of fftpack and cluster,
|
||||
implementing the numscons build, building Windows binaries and
|
||||
adding single precision FFT.
|
||||
Damian Eads for hierarchical clustering, dendrogram plotting,
|
||||
distance functions in spatial package, vq documentation.
|
||||
Anne Archibald for kd-trees and nearest neighbor in scipy.spatial.
|
||||
Pauli Virtanen for Sphinx documentation generation, online documentation
|
||||
framework and interpolation bugfixes.
|
||||
Josef Perktold for major improvements to scipy.stats and its test suite and
|
||||
fixes and tests to optimize.curve_fit and leastsq.
|
||||
David Morrill for getting the scoreboard test system up and running.
|
||||
Louis Luangkesorn for providing multiple tests for the stats module.
|
||||
Jochen Kupper for the zoom feature in the now-deprecated plt plotting module.
|
||||
Tiffany Kamm for working on the community web-site.
|
||||
Mark Koudritsky for maintaining the web-site.
|
||||
Andrew Straw for help with the web-page, documentation, packaging,
|
||||
testing and work on the linalg module.
|
||||
Stefan van der Walt for numerous bug-fixes, testing and documentation.
|
||||
Jarrod Millman for release management, community coordination, and code
|
||||
clean up.
|
||||
Pierre Gerard-Marchant for statistical masked array functionality.
|
||||
Alan McIntyre for updating SciPy tests to use the new NumPy test framework.
|
||||
Matthew Brett for work on the Matlab file IO, bug-fixes, and improvements
|
||||
to the testing framework.
|
||||
Gary Strangman for the scipy.stats package.
|
||||
Tiziano Zito for generalized symmetric and hermitian eigenvalue problem
|
||||
solver.
|
||||
Chris Burns for bug-fixes.
|
||||
Per Brodtkorb for improvements to stats distributions.
|
||||
Neilen Marais for testing and bug-fixing in the ARPACK wrappers.
|
||||
Johannes Loehnert and Bart Vandereycken for fixes in the linalg
|
||||
module.
|
||||
David Huard for improvements to the interpolation interface.
|
||||
David Warde-Farley for converting the ndimage docs to ReST.
|
||||
Uwe Schmitt for wrapping non-negative least-squares.
|
||||
Ondrej Certik for Debian packaging.
|
||||
Paul Ivanov for porting Numeric-style C code to the new NumPy API.
|
||||
Ariel Rokem for contributions on percentileofscore fixes and tests.
|
||||
Yosef Meller for tests in the optimization module.
|
||||
|
||||
Institutions
|
||||
------------
|
||||
|
||||
Enthought for providing resources and finances for development of SciPy.
|
||||
Brigham Young University for providing resources for students to work on SciPy.
|
||||
Agilent which gave a genereous donation for support of SciPy.
|
||||
UC Berkeley for providing travel money and hosting numerous sprints.
|
||||
The University of Stellenbosch for funding the development of
|
||||
the SciKits portal.
|
163
pythonPackages/scipy-0.8.0/doc/Makefile
Executable file
163
pythonPackages/scipy-0.8.0/doc/Makefile
Executable file
|
@ -0,0 +1,163 @@
|
|||
# Makefile for Sphinx documentation
|
||||
#
|
||||
|
||||
PYVER =
|
||||
PYTHON = python$(PYVER)
|
||||
|
||||
# You can set these variables from the command line.
|
||||
SPHINXOPTS =
|
||||
SPHINXBUILD = LANG=C sphinx-build
|
||||
PAPER =
|
||||
|
||||
NEED_AUTOSUMMARY = $(shell $(PYTHON) -c 'import sphinx; print sphinx.__version__ < "0.7" and "1" or ""')
|
||||
|
||||
# Internal variables.
|
||||
PAPEROPT_a4 = -D latex_paper_size=a4
|
||||
PAPEROPT_letter = -D latex_paper_size=letter
|
||||
ALLSPHINXOPTS = -d build/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source
|
||||
|
||||
.PHONY: help clean html web pickle htmlhelp latex changes linkcheck \
|
||||
dist dist-build
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
|
||||
help:
|
||||
@echo "Please use \`make <target>' where <target> is one of"
|
||||
@echo " html to make standalone HTML files"
|
||||
@echo " pickle to make pickle files (usable by e.g. sphinx-web)"
|
||||
@echo " htmlhelp to make HTML files and a HTML help project"
|
||||
@echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
|
||||
@echo " changes to make an overview over all changed/added/deprecated items"
|
||||
@echo " linkcheck to check all external links for integrity"
|
||||
@echo " dist PYVER=... to make a distribution-ready tree"
|
||||
@echo " upload USER=... to upload results to docs.scipy.org"
|
||||
|
||||
clean:
|
||||
-rm -rf build/* source/generated
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# Automated generation of all documents
|
||||
#------------------------------------------------------------------------------
|
||||
|
||||
# Build the current scipy version, and extract docs from it.
|
||||
# We have to be careful of some issues:
|
||||
#
|
||||
# - Everything must be done using the same Python version
|
||||
# - We must use eggs (otherwise they might override PYTHONPATH on import).
|
||||
# - Different versions of easy_install install to different directories (!)
|
||||
#
|
||||
|
||||
INSTALL_DIR = $(CURDIR)/build/inst-dist/
|
||||
INSTALL_PPH = $(INSTALL_DIR)/lib/python$(PYVER)/site-packages:$(INSTALL_DIR)/local/lib/python$(PYVER)/site-packages:$(INSTALL_DIR)/lib/python$(PYVER)/dist-packages:$(INSTALL_DIR)/local/lib/python$(PYVER)/dist-packages
|
||||
|
||||
DIST_VARS=PYTHON="PYTHONPATH=$(INSTALL_PPH):$$PYTHONPATH python$(PYVER)" SPHINXBUILD="LANG=C PYTHONPATH=$(INSTALL_PPH):$$PYTHONPATH python$(PYVER) `which sphinx-build`"
|
||||
|
||||
UPLOAD_TARGET = $(USER)@docs.scipy.org:/home/docserver/www-root/doc/scipy/
|
||||
|
||||
upload:
|
||||
@test -e build/dist || { echo "make dist is required first"; exit 1; }
|
||||
@test output-is-fine -nt build/dist || { \
|
||||
echo "Review the output in build/dist, and do 'touch output-is-fine' before uploading."; exit 1; }
|
||||
rsync -r -z --delete-after -p \
|
||||
$(if $(shell test -f build/dist/scipy-ref.pdf && echo "y"),, \
|
||||
--exclude '**-ref.pdf' --exclude '**-user.pdf') \
|
||||
$(if $(shell test -f build/dist/scipy-chm.zip && echo "y"),, \
|
||||
--exclude '**-chm.zip') \
|
||||
build/dist/ $(UPLOAD_TARGET)
|
||||
|
||||
dist:
|
||||
make $(DIST_VARS) real-dist
|
||||
|
||||
real-dist: dist-build html
|
||||
test -d build/latex || make latex
|
||||
make -C build/latex all-pdf
|
||||
-test -d build/htmlhelp || make htmlhelp-build
|
||||
-rm -rf build/dist
|
||||
mkdir -p build/dist
|
||||
cp -r build/html build/dist/reference
|
||||
touch build/dist/index.html
|
||||
perl -pi -e 's#^\s*(<li><a href=".*?">SciPy.*?Reference Guide.*?»</li>)\s*$$#<li><a href="/">Numpy and Scipy Documentation</a> »</li> $$1#;' build/dist/*.html build/dist/*/*.html build/dist/*/*/*.html
|
||||
(cd build/html && zip -9qr ../dist/scipy-html.zip .)
|
||||
cp build/latex/scipy*.pdf build/dist
|
||||
-zip build/dist/scipy-chm.zip build/htmlhelp/scipy.chm
|
||||
cd build/dist && tar czf ../dist.tar.gz *
|
||||
chmod ug=rwX,o=rX -R build/dist
|
||||
find build/dist -type d -print0 | xargs -0r chmod g+s
|
||||
|
||||
dist-build:
|
||||
rm -f ../dist/*.egg
|
||||
cd .. && $(PYTHON) setupegg.py bdist_egg
|
||||
install -d $(subst :, ,$(INSTALL_PPH))
|
||||
$(PYTHON) `which easy_install` --prefix=$(INSTALL_DIR) ../dist/*.egg
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# Basic Sphinx generation rules for different formats
|
||||
#------------------------------------------------------------------------------
|
||||
|
||||
generate: build/generate-stamp
|
||||
build/generate-stamp: $(wildcard source/*.rst)
|
||||
mkdir -p build
|
||||
ifeq ($(NEED_AUTOSUMMARY),1)
|
||||
$(PYTHON) \
|
||||
./sphinxext/autosummary_generate.py source/*.rst \
|
||||
-p dump.xml -o source/generated
|
||||
endif
|
||||
touch build/generate-stamp
|
||||
|
||||
html: generate
|
||||
mkdir -p build/html build/doctrees
|
||||
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) build/html
|
||||
$(PYTHON) postprocess.py html build/html/*.html
|
||||
@echo
|
||||
@echo "Build finished. The HTML pages are in build/html."
|
||||
|
||||
pickle: generate
|
||||
mkdir -p build/pickle build/doctrees
|
||||
$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) build/pickle
|
||||
@echo
|
||||
@echo "Build finished; now you can process the pickle files or run"
|
||||
@echo " sphinx-web build/pickle"
|
||||
@echo "to start the sphinx-web server."
|
||||
|
||||
web: pickle
|
||||
|
||||
htmlhelp: generate
|
||||
mkdir -p build/htmlhelp build/doctrees
|
||||
$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) build/htmlhelp
|
||||
@echo
|
||||
@echo "Build finished; now you can run HTML Help Workshop with the" \
|
||||
".hhp project file in build/htmlhelp."
|
||||
|
||||
htmlhelp-build: htmlhelp build/htmlhelp/scipy.chm
|
||||
%.chm: %.hhp
|
||||
-hhc.exe $^
|
||||
|
||||
latex: generate
|
||||
mkdir -p build/latex build/doctrees
|
||||
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) build/latex
|
||||
$(PYTHON) postprocess.py tex build/latex/*.tex
|
||||
perl -pi -e 's/\t(latex.*|pdflatex) (.*)/\t-$$1 -interaction batchmode $$2/' build/latex/Makefile
|
||||
@echo
|
||||
@echo "Build finished; the LaTeX files are in build/latex."
|
||||
@echo "Run \`make all-pdf' or \`make all-ps' in that directory to" \
|
||||
"run these through (pdf)latex."
|
||||
|
||||
coverage: build
|
||||
mkdir -p build/coverage build/doctrees
|
||||
$(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) build/coverage
|
||||
@echo "Coverage finished; see c.txt and python.txt in build/coverage"
|
||||
|
||||
changes: generate
|
||||
mkdir -p build/changes build/doctrees
|
||||
$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) build/changes
|
||||
@echo
|
||||
@echo "The overview file is in build/changes."
|
||||
|
||||
linkcheck: generate
|
||||
mkdir -p build/linkcheck build/doctrees
|
||||
$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) build/linkcheck
|
||||
@echo
|
||||
@echo "Link check complete; look for any errors in the above output " \
|
||||
"or in build/linkcheck/output.txt."
|
55
pythonPackages/scipy-0.8.0/doc/postprocess.py
Executable file
55
pythonPackages/scipy-0.8.0/doc/postprocess.py
Executable file
|
@ -0,0 +1,55 @@
|
|||
#!/usr/bin/env python
|
||||
"""
|
||||
%prog MODE FILES...
|
||||
|
||||
Post-processes HTML and Latex files output by Sphinx.
|
||||
MODE is either 'html' or 'tex'.
|
||||
|
||||
"""
|
||||
import re, optparse
|
||||
|
||||
def main():
|
||||
p = optparse.OptionParser(__doc__)
|
||||
options, args = p.parse_args()
|
||||
|
||||
if len(args) < 1:
|
||||
p.error('no mode given')
|
||||
|
||||
mode = args.pop(0)
|
||||
|
||||
if mode not in ('html', 'tex'):
|
||||
p.error('unknown mode %s' % mode)
|
||||
|
||||
for fn in args:
|
||||
f = open(fn, 'r')
|
||||
try:
|
||||
if mode == 'html':
|
||||
lines = process_html(fn, f.readlines())
|
||||
elif mode == 'tex':
|
||||
lines = process_tex(f.readlines())
|
||||
finally:
|
||||
f.close()
|
||||
|
||||
f = open(fn, 'w')
|
||||
f.write("".join(lines))
|
||||
f.close()
|
||||
|
||||
def process_html(fn, lines):
|
||||
return lines
|
||||
|
||||
def process_tex(lines):
|
||||
"""
|
||||
Remove unnecessary section titles from the LaTeX file,
|
||||
and convert UTF-8 non-breaking spaces to Latex nbsps.
|
||||
|
||||
"""
|
||||
new_lines = []
|
||||
for line in lines:
|
||||
if re.match(r'^\\(section|subsection|subsubsection|paragraph|subparagraph){(numpy|scipy)\.', line):
|
||||
pass # skip!
|
||||
else:
|
||||
new_lines.append(line)
|
||||
return new_lines
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
348
pythonPackages/scipy-0.8.0/doc/release/0.7.0-notes.rst
Executable file
348
pythonPackages/scipy-0.8.0/doc/release/0.7.0-notes.rst
Executable file
|
@ -0,0 +1,348 @@
|
|||
=========================
|
||||
SciPy 0.7.0 Release Notes
|
||||
=========================
|
||||
|
||||
.. contents::
|
||||
|
||||
SciPy 0.7.0 is the culmination of 16 months of hard work. It contains
|
||||
many new features, numerous bug-fixes, improved test coverage and
|
||||
better documentation. There have been a number of deprecations and
|
||||
API changes in this release, which are documented below. All users
|
||||
are encouraged to upgrade to this release, as there are a large number
|
||||
of bug-fixes and optimizations. Moreover, our development attention
|
||||
will now shift to bug-fix releases on the 0.7.x branch, and on adding
|
||||
new features on the development trunk. This release requires Python
|
||||
2.4 or 2.5 and NumPy 1.2 or greater.
|
||||
|
||||
Please note that SciPy is still considered to have "Beta" status, as
|
||||
we work toward a SciPy 1.0.0 release. The 1.0.0 release will mark a
|
||||
major milestone in the development of SciPy, after which changing the
|
||||
package structure or API will be much more difficult. Whilst these
|
||||
pre-1.0 releases are considered to have "Beta" status, we are
|
||||
committed to making them as bug-free as possible. For example, in
|
||||
addition to fixing numerous bugs in this release, we have also doubled
|
||||
the number of unit tests since the last release.
|
||||
|
||||
However, until the 1.0 release, we are aggressively reviewing and
|
||||
refining the functionality, organization, and interface. This is being
|
||||
done in an effort to make the package as coherent, intuitive, and
|
||||
useful as possible. To achieve this, we need help from the community
|
||||
of users. Specifically, we need feedback regarding all aspects of the
|
||||
project - everything - from which algorithms we implement, to details
|
||||
about our function's call signatures.
|
||||
|
||||
Over the last year, we have seen a rapid increase in community
|
||||
involvement, and numerous infrastructure improvements to lower the
|
||||
barrier to contributions (e.g., more explicit coding standards,
|
||||
improved testing infrastructure, better documentation tools). Over
|
||||
the next year, we hope to see this trend continue and invite everyone
|
||||
to become more involved.
|
||||
|
||||
Python 2.6 and 3.0
|
||||
------------------
|
||||
|
||||
A significant amount of work has gone into making SciPy compatible
|
||||
with Python 2.6; however, there are still some issues in this regard.
|
||||
The main issue with 2.6 support is NumPy. On UNIX (including Mac OS
|
||||
X), NumPy 1.2.1 mostly works, with a few caveats. On Windows, there
|
||||
are problems related to the compilation process. The upcoming NumPy
|
||||
1.3 release will fix these problems. Any remaining issues with 2.6
|
||||
support for SciPy 0.7 will be addressed in a bug-fix release.
|
||||
|
||||
Python 3.0 is not supported at all; it requires NumPy to be ported to
|
||||
Python 3.0. This requires immense effort, since a lot of C code has
|
||||
to be ported. The transition to 3.0 is still under consideration;
|
||||
currently, we don't have any timeline or roadmap for this transition.
|
||||
|
||||
Major documentation improvements
|
||||
--------------------------------
|
||||
|
||||
SciPy documentation is greatly improved; you can view a HTML reference
|
||||
manual `online <http://docs.scipy.org/>`__ or download it as a PDF
|
||||
file. The new reference guide was built using the popular `Sphinx tool
|
||||
<http://sphinx.pocoo.org/>`__.
|
||||
|
||||
This release also includes an updated tutorial, which hadn't been
|
||||
available since SciPy was ported to NumPy in 2005. Though not
|
||||
comprehensive, the tutorial shows how to use several essential parts
|
||||
of Scipy. It also includes the ``ndimage`` documentation from the
|
||||
``numarray`` manual.
|
||||
|
||||
Nevertheless, more effort is needed on the documentation front.
|
||||
Luckily, contributing to Scipy documentation is now easier than
|
||||
before: if you find that a part of it requires improvements, and want
|
||||
to help us out, please register a user name in our web-based
|
||||
documentation editor at http://docs.scipy.org/ and correct the issues.
|
||||
|
||||
Running Tests
|
||||
-------------
|
||||
|
||||
NumPy 1.2 introduced a new testing framework based on `nose
|
||||
<http://somethingaboutorange.com/mrl/projects/nose/>`__. Starting with
|
||||
this release, SciPy now uses the new NumPy test framework as well.
|
||||
Taking advantage of the new testing framework requires ``nose``
|
||||
version 0.10, or later. One major advantage of the new framework is
|
||||
that it greatly simplifies writing unit tests - which has all ready
|
||||
paid off, given the rapid increase in tests. To run the full test
|
||||
suite::
|
||||
|
||||
>>> import scipy
|
||||
>>> scipy.test('full')
|
||||
|
||||
For more information, please see `The NumPy/SciPy Testing Guide
|
||||
<http://projects.scipy.org/scipy/numpy/wiki/TestingGuidelines>`__.
|
||||
|
||||
We have also greatly improved our test coverage. There were just over
|
||||
2,000 unit tests in the 0.6.0 release; this release nearly doubles
|
||||
that number, with just over 4,000 unit tests.
|
||||
|
||||
Building SciPy
|
||||
--------------
|
||||
|
||||
Support for NumScons has been added. NumScons is a tentative new build
|
||||
system for NumPy/SciPy, using `SCons <http://www.scons.org/>`__ at its
|
||||
core.
|
||||
|
||||
SCons is a next-generation build system, intended to replace the
|
||||
venerable ``Make`` with the integrated functionality of
|
||||
``autoconf``/``automake`` and ``ccache``. Scons is written in Python
|
||||
and its configuration files are Python scripts. NumScons is meant to
|
||||
replace NumPy's custom version of ``distutils`` providing more
|
||||
advanced functionality, such as ``autoconf``, improved fortran
|
||||
support, more tools, and support for ``numpy.distutils``/``scons``
|
||||
cooperation.
|
||||
|
||||
Sandbox Removed
|
||||
---------------
|
||||
|
||||
While porting SciPy to NumPy in 2005, several packages and modules
|
||||
were moved into ``scipy.sandbox``. The sandbox was a staging ground
|
||||
for packages that were undergoing rapid development and whose APIs
|
||||
were in flux. It was also a place where broken code could live. The
|
||||
sandbox has served its purpose well, but was starting to create
|
||||
confusion. Thus ``scipy.sandbox`` was removed. Most of the code was
|
||||
moved into ``scipy``, some code was made into a ``scikit``, and the
|
||||
remaining code was just deleted, as the functionality had been
|
||||
replaced by other code.
|
||||
|
||||
Sparse Matrices
|
||||
---------------
|
||||
|
||||
Sparse matrices have seen extensive improvements. There is now
|
||||
support for integer dtypes such ``int8``, ``uint32``, etc. Two new
|
||||
sparse formats were added:
|
||||
|
||||
* new class ``dia_matrix`` : the sparse DIAgonal format
|
||||
* new class ``bsr_matrix`` : the Block CSR format
|
||||
|
||||
Several new sparse matrix construction functions were added:
|
||||
|
||||
* ``sparse.kron`` : sparse Kronecker product
|
||||
* ``sparse.bmat`` : sparse version of ``numpy.bmat``
|
||||
* ``sparse.vstack`` : sparse version of ``numpy.vstack``
|
||||
* ``sparse.hstack`` : sparse version of ``numpy.hstack``
|
||||
|
||||
Extraction of submatrices and nonzero values have been added:
|
||||
|
||||
* ``sparse.tril`` : extract lower triangle
|
||||
* ``sparse.triu`` : extract upper triangle
|
||||
* ``sparse.find`` : nonzero values and their indices
|
||||
|
||||
``csr_matrix`` and ``csc_matrix`` now support slicing and fancy
|
||||
indexing (e.g., ``A[1:3, 4:7]`` and ``A[[3,2,6,8],:]``). Conversions
|
||||
among all sparse formats are now possible:
|
||||
|
||||
* using member functions such as ``.tocsr()`` and ``.tolil()``
|
||||
* using the ``.asformat()`` member function, e.g. ``A.asformat('csr')``
|
||||
* using constructors ``A = lil_matrix([[1,2]]); B = csr_matrix(A)``
|
||||
|
||||
All sparse constructors now accept dense matrices and lists of lists.
|
||||
For example:
|
||||
|
||||
* ``A = csr_matrix( rand(3,3) )`` and ``B = lil_matrix( [[1,2],[3,4]] )``
|
||||
|
||||
The handling of diagonals in the ``spdiags`` function has been changed.
|
||||
It now agrees with the MATLAB(TM) function of the same name.
|
||||
|
||||
Numerous efficiency improvements to format conversions and sparse
|
||||
matrix arithmetic have been made. Finally, this release contains
|
||||
numerous bugfixes.
|
||||
|
||||
Statistics package
|
||||
------------------
|
||||
|
||||
Statistical functions for masked arrays have been added, and are
|
||||
accessible through ``scipy.stats.mstats``. The functions are similar
|
||||
to their counterparts in ``scipy.stats`` but they have not yet been
|
||||
verified for identical interfaces and algorithms.
|
||||
|
||||
Several bugs were fixed for statistical functions, of those,
|
||||
``kstest`` and ``percentileofscore`` gained new keyword arguments.
|
||||
|
||||
Added deprecation warning for ``mean``, ``median``, ``var``, ``std``,
|
||||
``cov``, and ``corrcoef``. These functions should be replaced by their
|
||||
numpy counterparts. Note, however, that some of the default options
|
||||
differ between the ``scipy.stats`` and numpy versions of these
|
||||
functions.
|
||||
|
||||
Numerous bug fixes to ``stats.distributions``: all generic methods now
|
||||
work correctly, several methods in individual distributions were
|
||||
corrected. However, a few issues remain with higher moments (``skew``,
|
||||
``kurtosis``) and entropy. The maximum likelihood estimator, ``fit``,
|
||||
does not work out-of-the-box for some distributions - in some cases,
|
||||
starting values have to be carefully chosen, in other cases, the
|
||||
generic implementation of the maximum likelihood method might not be
|
||||
the numerically appropriate estimation method.
|
||||
|
||||
We expect more bugfixes, increases in numerical precision and
|
||||
enhancements in the next release of scipy.
|
||||
|
||||
Reworking of IO package
|
||||
-----------------------
|
||||
|
||||
The IO code in both NumPy and SciPy is being extensively
|
||||
reworked. NumPy will be where basic code for reading and writing NumPy
|
||||
arrays is located, while SciPy will house file readers and writers for
|
||||
various data formats (data, audio, video, images, matlab, etc.).
|
||||
|
||||
Several functions in ``scipy.io`` have been deprecated and will be
|
||||
removed in the 0.8.0 release including ``npfile``, ``save``, ``load``,
|
||||
``create_module``, ``create_shelf``, ``objload``, ``objsave``,
|
||||
``fopen``, ``read_array``, ``write_array``, ``fread``, ``fwrite``,
|
||||
``bswap``, ``packbits``, ``unpackbits``, and ``convert_objectarray``.
|
||||
Some of these functions have been replaced by NumPy's raw reading and
|
||||
writing capabilities, memory-mapping capabilities, or array methods.
|
||||
Others have been moved from SciPy to NumPy, since basic array reading
|
||||
and writing capability is now handled by NumPy.
|
||||
|
||||
The Matlab (TM) file readers/writers have a number of improvements:
|
||||
|
||||
* default version 5
|
||||
* v5 writers for structures, cell arrays, and objects
|
||||
* v5 readers/writers for function handles and 64-bit integers
|
||||
* new struct_as_record keyword argument to ``loadmat``, which loads
|
||||
struct arrays in matlab as record arrays in numpy
|
||||
* string arrays have ``dtype='U...'`` instead of ``dtype=object``
|
||||
* ``loadmat`` no longer squeezes singleton dimensions, i.e.
|
||||
``squeeze_me=False`` by default
|
||||
|
||||
New Hierarchical Clustering module
|
||||
----------------------------------
|
||||
|
||||
This module adds new hierarchical clustering functionality to the
|
||||
``scipy.cluster`` package. The function interfaces are similar to the
|
||||
functions provided MATLAB(TM)'s Statistics Toolbox to help facilitate
|
||||
easier migration to the NumPy/SciPy framework. Linkage methods
|
||||
implemented include single, complete, average, weighted, centroid,
|
||||
median, and ward.
|
||||
|
||||
In addition, several functions are provided for computing
|
||||
inconsistency statistics, cophenetic distance, and maximum distance
|
||||
between descendants. The ``fcluster`` and ``fclusterdata`` functions
|
||||
transform a hierarchical clustering into a set of flat clusters. Since
|
||||
these flat clusters are generated by cutting the tree into a forest of
|
||||
trees, the ``leaders`` function takes a linkage and a flat clustering,
|
||||
and finds the root of each tree in the forest. The ``ClusterNode``
|
||||
class represents a hierarchical clusterings as a field-navigable tree
|
||||
object. ``to_tree`` converts a matrix-encoded hierarchical clustering
|
||||
to a ``ClusterNode`` object. Routines for converting between MATLAB
|
||||
and SciPy linkage encodings are provided. Finally, a ``dendrogram``
|
||||
function plots hierarchical clusterings as a dendrogram, using
|
||||
matplotlib.
|
||||
|
||||
New Spatial package
|
||||
-------------------
|
||||
|
||||
The new spatial package contains a collection of spatial algorithms
|
||||
and data structures, useful for spatial statistics and clustering
|
||||
applications. It includes rapidly compiled code for computing exact
|
||||
and approximate nearest neighbors, as well as a pure-python kd-tree
|
||||
with the same interface, but that supports annotation and a variety of
|
||||
other algorithms. The API for both modules may change somewhat, as
|
||||
user requirements become clearer.
|
||||
|
||||
It also includes a ``distance`` module, containing a collection of
|
||||
distance and dissimilarity functions for computing distances between
|
||||
vectors, which is useful for spatial statistics, clustering, and
|
||||
kd-trees. Distance and dissimilarity functions provided include
|
||||
Bray-Curtis, Canberra, Chebyshev, City Block, Cosine, Dice, Euclidean,
|
||||
Hamming, Jaccard, Kulsinski, Mahalanobis, Matching, Minkowski,
|
||||
Rogers-Tanimoto, Russell-Rao, Squared Euclidean, Standardized
|
||||
Euclidean, Sokal-Michener, Sokal-Sneath, and Yule.
|
||||
|
||||
The ``pdist`` function computes pairwise distance between all
|
||||
unordered pairs of vectors in a set of vectors. The ``cdist`` computes
|
||||
the distance on all pairs of vectors in the Cartesian product of two
|
||||
sets of vectors. Pairwise distance matrices are stored in condensed
|
||||
form; only the upper triangular is stored. ``squareform`` converts
|
||||
distance matrices between square and condensed forms.
|
||||
|
||||
Reworked fftpack package
|
||||
------------------------
|
||||
|
||||
FFTW2, FFTW3, MKL and DJBFFT wrappers have been removed. Only (NETLIB)
|
||||
fftpack remains. By focusing on one backend, we hope to add new
|
||||
features - like float32 support - more easily.
|
||||
|
||||
New Constants package
|
||||
---------------------
|
||||
|
||||
``scipy.constants`` provides a collection of physical constants and
|
||||
conversion factors. These constants are taken from CODATA Recommended
|
||||
Values of the Fundamental Physical Constants: 2002. They may be found
|
||||
at physics.nist.gov/constants. The values are stored in the dictionary
|
||||
physical_constants as a tuple containing the value, the units, and the
|
||||
relative precision - in that order. All constants are in SI units,
|
||||
unless otherwise stated. Several helper functions are provided.
|
||||
|
||||
New Radial Basis Function module
|
||||
--------------------------------
|
||||
|
||||
``scipy.interpolate`` now contains a Radial Basis Function module.
|
||||
Radial basis functions can be used for smoothing/interpolating
|
||||
scattered data in n-dimensions, but should be used with caution for
|
||||
extrapolation outside of the observed data range.
|
||||
|
||||
New complex ODE integrator
|
||||
--------------------------
|
||||
|
||||
``scipy.integrate.ode`` now contains a wrapper for the ZVODE
|
||||
complex-valued ordinary differential equation solver (by Peter
|
||||
N. Brown, Alan C. Hindmarsh, and George D. Byrne).
|
||||
|
||||
New generalized symmetric and hermitian eigenvalue problem solver
|
||||
-----------------------------------------------------------------
|
||||
|
||||
``scipy.linalg.eigh`` now contains wrappers for more LAPACK symmetric
|
||||
and hermitian eigenvalue problem solvers. Users can now solve
|
||||
generalized problems, select a range of eigenvalues only, and choose
|
||||
to use a faster algorithm at the expense of increased memory
|
||||
usage. The signature of the ``scipy.linalg.eigh`` changed accordingly.
|
||||
|
||||
Bug fixes in the interpolation package
|
||||
--------------------------------------
|
||||
|
||||
The shape of return values from ``scipy.interpolate.interp1d`` used to
|
||||
be incorrect, if interpolated data had more than 2 dimensions and the
|
||||
axis keyword was set to a non-default value. This has been fixed.
|
||||
Moreover, ``interp1d`` returns now a scalar (0D-array) if the input
|
||||
is a scalar. Users of ``scipy.interpolate.interp1d`` may need to
|
||||
revise their code if it relies on the previous behavior.
|
||||
|
||||
Weave clean up
|
||||
--------------
|
||||
|
||||
There were numerous improvements to ``scipy.weave``. ``blitz++`` was
|
||||
relicensed by the author to be compatible with the SciPy license.
|
||||
``wx_spec.py`` was removed.
|
||||
|
||||
Known problems
|
||||
--------------
|
||||
|
||||
Here are known problems with scipy 0.7.0:
|
||||
|
||||
* weave test failures on windows: those are known, and are being revised.
|
||||
* weave test failure with gcc 4.3 (std::labs): this is a gcc 4.3 bug. A
|
||||
workaround is to add #include <cstdlib> in
|
||||
scipy/weave/blitz/blitz/funcs.h (line 27). You can make the change in
|
||||
the installed scipy (in site-packages).
|
263
pythonPackages/scipy-0.8.0/doc/release/0.8.0-notes.rst
Executable file
263
pythonPackages/scipy-0.8.0/doc/release/0.8.0-notes.rst
Executable file
|
@ -0,0 +1,263 @@
|
|||
=========================
|
||||
SciPy 0.8.0 Release Notes
|
||||
=========================
|
||||
|
||||
.. contents::
|
||||
|
||||
SciPy 0.8.0 is the culmination of 17 months of hard work. It contains
|
||||
many new features, numerous bug-fixes, improved test coverage and
|
||||
better documentation. There have been a number of deprecations and
|
||||
API changes in this release, which are documented below. All users
|
||||
are encouraged to upgrade to this release, as there are a large number
|
||||
of bug-fixes and optimizations. Moreover, our development attention
|
||||
will now shift to bug-fix releases on the 0.8.x branch, and on adding
|
||||
new features on the development trunk. This release requires Python
|
||||
2.4 - 2.6 and NumPy 1.4.1 or greater.
|
||||
|
||||
Please note that SciPy is still considered to have "Beta" status, as
|
||||
we work toward a SciPy 1.0.0 release. The 1.0.0 release will mark a
|
||||
major milestone in the development of SciPy, after which changing the
|
||||
package structure or API will be much more difficult. Whilst these
|
||||
pre-1.0 releases are considered to have "Beta" status, we are
|
||||
committed to making them as bug-free as possible.
|
||||
|
||||
However, until the 1.0 release, we are aggressively reviewing and
|
||||
refining the functionality, organization, and interface. This is being
|
||||
done in an effort to make the package as coherent, intuitive, and
|
||||
useful as possible. To achieve this, we need help from the community
|
||||
of users. Specifically, we need feedback regarding all aspects of the
|
||||
project - everything - from which algorithms we implement, to details
|
||||
about our function's call signatures.
|
||||
|
||||
Python 3
|
||||
========
|
||||
|
||||
Python 3 compatibility is planned and is currently technically
|
||||
feasible, since Numpy has been ported. However, since the Python 3
|
||||
compatible Numpy 1.5 has not been released yet, support for Python 3
|
||||
in Scipy is not yet included in Scipy 0.8. SciPy 0.9, planned for fall
|
||||
2010, will very likely include experimental support for Python 3.
|
||||
|
||||
Major documentation improvements
|
||||
================================
|
||||
|
||||
SciPy documentation is greatly improved.
|
||||
|
||||
Deprecated features
|
||||
===================
|
||||
|
||||
Swapping inputs for correlation functions (scipy.signal)
|
||||
--------------------------------------------------------
|
||||
|
||||
Concern correlate, correlate2d, convolve and convolve2d. If the second input is
|
||||
larger than the first input, the inputs are swapped before calling the
|
||||
underlying computation routine. This behavior is deprecated, and will be
|
||||
removed in scipy 0.9.0.
|
||||
|
||||
Obsolete code deprecated (scipy.misc)
|
||||
-------------------------------------
|
||||
|
||||
The modules `helpmod`, `ppimport` and `pexec` from `scipy.misc` are deprecated.
|
||||
They will be removed from SciPy in version 0.9.
|
||||
|
||||
Additional deprecations
|
||||
-----------------------
|
||||
|
||||
* linalg: The function `solveh_banded` currently returns a tuple containing
|
||||
the Cholesky factorization and the solution to the linear system. In
|
||||
SciPy 0.9, the return value will be just the solution.
|
||||
* The function `constants.codata.find` will generate a DeprecationWarning.
|
||||
In Scipy version 0.8.0, the keyword argument 'disp' was added to the
|
||||
function, with the default value 'True'. In 0.9.0, the default will be
|
||||
'False'.
|
||||
* The `qshape` keyword argument of `signal.chirp` is deprecated. Use
|
||||
the argument `vertex_zero` instead.
|
||||
* Passing the coefficients of a polynomial as the argument `f0` to
|
||||
`signal.chirp` is deprecated. Use the function `signal.sweep_poly`
|
||||
instead.
|
||||
* The `io.recaster` module has been deprecated and will be removed in 0.9.0.
|
||||
|
||||
New features
|
||||
============
|
||||
|
||||
DCT support (scipy.fftpack)
|
||||
---------------------------
|
||||
|
||||
New realtransforms have been added, namely dct and idct for Discrete Cosine
|
||||
Transform; type I, II and III are available.
|
||||
|
||||
Single precision support for fft functions (scipy.fftpack)
|
||||
----------------------------------------------------------
|
||||
|
||||
fft functions can now handle single precision inputs as well: fft(x) will
|
||||
return a single precision array if x is single precision.
|
||||
|
||||
At the moment, for FFT sizes that are not composites of 2, 3, and 5, the
|
||||
transform is computed internally in double precision to avoid rounding error in
|
||||
FFTPACK.
|
||||
|
||||
Correlation functions now implement the usual definition (scipy.signal)
|
||||
-----------------------------------------------------------------------
|
||||
|
||||
The outputs should now correspond to their matlab and R counterparts, and do
|
||||
what most people expect if the old_behavior=False argument is passed:
|
||||
|
||||
* correlate, convolve and their 2d counterparts do not swap their inputs
|
||||
depending on their relative shape anymore;
|
||||
* correlation functions now conjugate their second argument while computing
|
||||
the slided sum-products, which correspond to the usual definition of
|
||||
correlation.
|
||||
|
||||
Additions and modification to LTI functions (scipy.signal)
|
||||
----------------------------------------------------------
|
||||
|
||||
* The functions `impulse2` and `step2` were added to `scipy.signal`.
|
||||
They use the function `scipy.signal.lsim2` to compute the impulse and
|
||||
step response of a system, respectively.
|
||||
* The function `scipy.signal.lsim2` was changed to pass any additional
|
||||
keyword arguments to the ODE solver.
|
||||
|
||||
Improved waveform generators (scipy.signal)
|
||||
-------------------------------------------
|
||||
|
||||
Several improvements to the `chirp` function in `scipy.signal` were made:
|
||||
|
||||
* The waveform generated when `method="logarithmic"` was corrected; it
|
||||
now generates a waveform that is also known as an "exponential" or
|
||||
"geometric" chirp. (See http://en.wikipedia.org/wiki/Chirp.)
|
||||
* A new `chirp` method, "hyperbolic", was added.
|
||||
* Instead of the keyword `qshape`, `chirp` now uses the keyword
|
||||
`vertex_zero`, a boolean.
|
||||
* `chirp` no longer handles an arbitrary polynomial. This functionality
|
||||
has been moved to a new function, `sweep_poly`.
|
||||
|
||||
A new function, `sweep_poly`, was added.
|
||||
|
||||
New functions and other changes in scipy.linalg
|
||||
-----------------------------------------------
|
||||
|
||||
The functions `cho_solve_banded`, `circulant`, `companion`, `hadamard` and
|
||||
`leslie` were added to `scipy.linalg`.
|
||||
|
||||
The function `block_diag` was enhanced to accept scalar and 1D arguments,
|
||||
along with the usual 2D arguments.
|
||||
|
||||
New function and changes in scipy.optimize
|
||||
------------------------------------------
|
||||
|
||||
The `curve_fit` function has been added; it takes a function and uses
|
||||
non-linear least squares to fit that to the provided data.
|
||||
|
||||
The `leastsq` and `fsolve` functions now return an array of size one instead of
|
||||
a scalar when solving for a single parameter.
|
||||
|
||||
New sparse least squares solver
|
||||
-------------------------------
|
||||
|
||||
The `lsqr` function was added to `scipy.sparse`. `This routine
|
||||
<http://www.stanford.edu/group/SOL/software/lsqr.html>`_ finds a
|
||||
least-squares solution to a large, sparse, linear system of equations.
|
||||
|
||||
ARPACK-based sparse SVD
|
||||
-----------------------
|
||||
|
||||
A naive implementation of SVD for sparse matrices is available in
|
||||
scipy.sparse.linalg.eigen.arpack. It is based on using an symmetric solver on
|
||||
<A, A>, and as such may not be very precise.
|
||||
|
||||
Alternative behavior available for `scipy.constants.find`
|
||||
---------------------------------------------------------
|
||||
|
||||
The keyword argument `disp` was added to the function `scipy.constants.find`,
|
||||
with the default value `True`. When `disp` is `True`, the behavior is the
|
||||
same as in Scipy version 0.7. When `False`, the function returns the list of
|
||||
keys instead of printing them. (In SciPy version 0.9, the default will be
|
||||
reversed.)
|
||||
|
||||
Incomplete sparse LU decompositions
|
||||
-----------------------------------
|
||||
|
||||
Scipy now wraps SuperLU version 4.0, which supports incomplete sparse LU
|
||||
decompositions. These can be accessed via `scipy.sparse.linalg.spilu`.
|
||||
Upgrade to SuperLU 4.0 also fixes some known bugs.
|
||||
|
||||
Faster matlab file reader and default behavior change
|
||||
------------------------------------------------------
|
||||
|
||||
We've rewritten the matlab file reader in Cython and it should now read
|
||||
matlab files at around the same speed that Matlab does.
|
||||
|
||||
The reader reads matlab named and anonymous functions, but it can't
|
||||
write them.
|
||||
|
||||
Until scipy 0.8.0 we have returned arrays of matlab structs as numpy
|
||||
object arrays, where the objects have attributes named for the struct
|
||||
fields. As of 0.8.0, we return matlab structs as numpy structured
|
||||
arrays. You can get the older behavior by using the optional
|
||||
``struct_as_record=False`` keyword argument to `scipy.io.loadmat` and
|
||||
friends.
|
||||
|
||||
There is an inconsistency in the matlab file writer, in that it writes
|
||||
numpy 1D arrays as column vectors in matlab 5 files, and row vectors in
|
||||
matlab 4 files. We will change this in the next version, so both write
|
||||
row vectors. There is a `FutureWarning` when calling the writer to warn
|
||||
of this change; for now we suggest using the ``oned_as='row'`` keyword
|
||||
argument to `scipy.io.savemat` and friends.
|
||||
|
||||
Faster evaluation of orthogonal polynomials
|
||||
-------------------------------------------
|
||||
|
||||
Values of orthogonal polynomials can be evaluated with new vectorized functions
|
||||
in `scipy.special`: `eval_legendre`, `eval_chebyt`, `eval_chebyu`,
|
||||
`eval_chebyc`, `eval_chebys`, `eval_jacobi`, `eval_laguerre`,
|
||||
`eval_genlaguerre`, `eval_hermite`, `eval_hermitenorm`,
|
||||
`eval_gegenbauer`, `eval_sh_legendre`, `eval_sh_chebyt`,
|
||||
`eval_sh_chebyu`, `eval_sh_jacobi`. This is faster than constructing the
|
||||
full coefficient representation of the polynomials, which was previously the
|
||||
only available way.
|
||||
|
||||
Note that the previous orthogonal polynomial routines will now also invoke this
|
||||
feature, when possible.
|
||||
|
||||
Lambert W function
|
||||
------------------
|
||||
|
||||
`scipy.special.lambertw` can now be used for evaluating the Lambert W
|
||||
function.
|
||||
|
||||
Improved hypergeometric 2F1 function
|
||||
------------------------------------
|
||||
|
||||
Implementation of `scipy.special.hyp2f1` for real parameters was revised.
|
||||
The new version should produce accurate values for all real parameters.
|
||||
|
||||
More flexible interface for Radial basis function interpolation
|
||||
---------------------------------------------------------------
|
||||
|
||||
The `scipy.interpolate.Rbf` class now accepts a callable as input for the
|
||||
"function" argument, in addition to the built-in radial basis functions which
|
||||
can be selected with a string argument.
|
||||
|
||||
Removed features
|
||||
================
|
||||
|
||||
scipy.stsci: the package was removed
|
||||
|
||||
The module `scipy.misc.limits` was removed.
|
||||
|
||||
scipy.io
|
||||
--------
|
||||
|
||||
The IO code in both NumPy and SciPy is being extensively
|
||||
reworked. NumPy will be where basic code for reading and writing NumPy
|
||||
arrays is located, while SciPy will house file readers and writers for
|
||||
various data formats (data, audio, video, images, matlab, etc.).
|
||||
|
||||
Several functions in `scipy.io` are removed in the 0.8.0 release including:
|
||||
`npfile`, `save`, `load`, `create_module`, `create_shelf`,
|
||||
`objload`, `objsave`, `fopen`, `read_array`, `write_array`,
|
||||
`fread`, `fwrite`, `bswap`, `packbits`, `unpackbits`, and
|
||||
`convert_objectarray`. Some of these functions have been replaced by NumPy's
|
||||
raw reading and writing capabilities, memory-mapping capabilities, or array
|
||||
methods. Others have been moved from SciPy to NumPy, since basic array reading
|
||||
and writing capability is now handled by NumPy.
|
BIN
pythonPackages/scipy-0.8.0/doc/source/_static/scipyshiny_small.png
Executable file
BIN
pythonPackages/scipy-0.8.0/doc/source/_static/scipyshiny_small.png
Executable file
Binary file not shown.
After Width: | Height: | Size: 18 KiB |
23
pythonPackages/scipy-0.8.0/doc/source/_templates/autosummary/class.rst
Executable file
23
pythonPackages/scipy-0.8.0/doc/source/_templates/autosummary/class.rst
Executable file
|
@ -0,0 +1,23 @@
|
|||
{% extends "!autosummary/class.rst" %}
|
||||
|
||||
{% block methods %}
|
||||
{% if methods %}
|
||||
.. HACK
|
||||
.. autosummary::
|
||||
:toctree:
|
||||
{% for item in methods %}
|
||||
{{ name }}.{{ item }}
|
||||
{%- endfor %}
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
|
||||
{% block attributes %}
|
||||
{% if attributes %}
|
||||
.. HACK
|
||||
.. autosummary::
|
||||
:toctree:
|
||||
{% for item in attributes %}
|
||||
{{ name }}.{{ item }}
|
||||
{%- endfor %}
|
||||
{% endif %}
|
||||
{% endblock %}
|
5
pythonPackages/scipy-0.8.0/doc/source/_templates/indexsidebar.html
Executable file
5
pythonPackages/scipy-0.8.0/doc/source/_templates/indexsidebar.html
Executable file
|
@ -0,0 +1,5 @@
|
|||
<h3>Resources</h3>
|
||||
<ul>
|
||||
<li><a href="http://scipy.org/">Scipy.org website</a></li>
|
||||
<li> </li>
|
||||
</ul>
|
14
pythonPackages/scipy-0.8.0/doc/source/_templates/layout.html
Executable file
14
pythonPackages/scipy-0.8.0/doc/source/_templates/layout.html
Executable file
|
@ -0,0 +1,14 @@
|
|||
{% extends "!layout.html" %}
|
||||
|
||||
{% block sidebarsearch %}
|
||||
{%- if sourcename %}
|
||||
<ul class="this-page-menu">
|
||||
{%- if 'generated/' in sourcename %}
|
||||
<li><a href="/scipy/docs/{{ sourcename.replace('generated/', '').replace('.txt', '') |e }}">{{_('Edit page')}}</a></li>
|
||||
{%- else %}
|
||||
<li><a href="/scipy/docs/scipy-docs/{{ sourcename.replace('.txt', '.rst') |e }}">{{_('Edit page')}}</a></li>
|
||||
{%- endif %}
|
||||
</ul>
|
||||
{%- endif %}
|
||||
{{ super() }}
|
||||
{% endblock %}
|
10
pythonPackages/scipy-0.8.0/doc/source/cluster.hierarchy.rst
Executable file
10
pythonPackages/scipy-0.8.0/doc/source/cluster.hierarchy.rst
Executable file
|
@ -0,0 +1,10 @@
|
|||
========================================================
|
||||
Hierarchical clustering (:mod:`scipy.cluster.hierarchy`)
|
||||
========================================================
|
||||
|
||||
.. warning::
|
||||
|
||||
This documentation is work-in-progress and unorganized.
|
||||
|
||||
.. automodule:: scipy.cluster.hierarchy
|
||||
:members:
|
10
pythonPackages/scipy-0.8.0/doc/source/cluster.rst
Executable file
10
pythonPackages/scipy-0.8.0/doc/source/cluster.rst
Executable file
|
@ -0,0 +1,10 @@
|
|||
=========================================
|
||||
Clustering package (:mod:`scipy.cluster`)
|
||||
=========================================
|
||||
|
||||
.. toctree::
|
||||
|
||||
cluster.hierarchy
|
||||
cluster.vq
|
||||
|
||||
.. automodule:: scipy.cluster
|
6
pythonPackages/scipy-0.8.0/doc/source/cluster.vq.rst
Executable file
6
pythonPackages/scipy-0.8.0/doc/source/cluster.vq.rst
Executable file
|
@ -0,0 +1,6 @@
|
|||
====================================================================
|
||||
K-means clustering and vector quantization (:mod:`scipy.cluster.vq`)
|
||||
====================================================================
|
||||
|
||||
.. automodule:: scipy.cluster.vq
|
||||
:members:
|
286
pythonPackages/scipy-0.8.0/doc/source/conf.py
Executable file
286
pythonPackages/scipy-0.8.0/doc/source/conf.py
Executable file
|
@ -0,0 +1,286 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
import sys, os, re
|
||||
|
||||
# If your extensions are in another directory, add it here. If the directory
|
||||
# is relative to the documentation root, use os.path.abspath to make it
|
||||
# absolute, like shown here.
|
||||
sys.path.insert(0, os.path.abspath('../sphinxext'))
|
||||
|
||||
# Check Sphinx version
|
||||
import sphinx
|
||||
if sphinx.__version__ < "0.5":
|
||||
raise RuntimeError("Sphinx 0.5.dev or newer required")
|
||||
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# General configuration
|
||||
# -----------------------------------------------------------------------------
|
||||
|
||||
# Add any Sphinx extension module names here, as strings. They can be extensions
|
||||
# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
|
||||
extensions = ['sphinx.ext.autodoc', 'sphinx.ext.pngmath', 'numpydoc',
|
||||
'sphinx.ext.intersphinx', 'sphinx.ext.coverage', 'plot_directive']
|
||||
|
||||
if sphinx.__version__ >= "0.7":
|
||||
extensions.append('sphinx.ext.autosummary')
|
||||
else:
|
||||
extensions.append('autosummary')
|
||||
extensions.append('only_directives')
|
||||
|
||||
|
||||
# Add any paths that contain templates here, relative to this directory.
|
||||
templates_path = ['_templates']
|
||||
|
||||
# The suffix of source filenames.
|
||||
source_suffix = '.rst'
|
||||
|
||||
# The master toctree document.
|
||||
master_doc = 'index'
|
||||
|
||||
# General substitutions.
|
||||
project = 'SciPy'
|
||||
copyright = '2008-2009, The Scipy community'
|
||||
|
||||
# The default replacements for |version| and |release|, also used in various
|
||||
# other places throughout the built documents.
|
||||
#
|
||||
import scipy
|
||||
# The short X.Y version (including the .devXXXX suffix if present)
|
||||
version = re.sub(r'^(\d+\.\d+)\.\d+(.*)', r'\1\2', scipy.__version__)
|
||||
if 'dev' in version:
|
||||
# retain the .dev suffix, but clean it up
|
||||
version = re.sub(r'(\.dev\d*).*?$', r'\1', version)
|
||||
else:
|
||||
# strip all other suffixes
|
||||
version = re.sub(r'^(\d+\.\d+).*?$', r'\1', version)
|
||||
# The full version, including alpha/beta/rc tags.
|
||||
release = scipy.__version__
|
||||
|
||||
print "Scipy (VERSION %s) (RELEASE %s)" % (version, release)
|
||||
|
||||
# There are two options for replacing |today|: either, you set today to some
|
||||
# non-false value, then it is used:
|
||||
#today = ''
|
||||
# Else, today_fmt is used as the format for a strftime call.
|
||||
today_fmt = '%B %d, %Y'
|
||||
|
||||
# List of documents that shouldn't be included in the build.
|
||||
#unused_docs = []
|
||||
|
||||
# The reST default role (used for this markup: `text`) to use for all documents.
|
||||
default_role = "autolink"
|
||||
|
||||
# List of directories, relative to source directories, that shouldn't be searched
|
||||
# for source files.
|
||||
exclude_dirs = []
|
||||
|
||||
# If true, '()' will be appended to :func: etc. cross-reference text.
|
||||
add_function_parentheses = False
|
||||
|
||||
# If true, the current module name will be prepended to all description
|
||||
# unit titles (such as .. function::).
|
||||
#add_module_names = True
|
||||
|
||||
# If true, sectionauthor and moduleauthor directives will be shown in the
|
||||
# output. They are ignored by default.
|
||||
show_authors = False
|
||||
|
||||
# The name of the Pygments (syntax highlighting) style to use.
|
||||
pygments_style = 'sphinx'
|
||||
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# HTML output
|
||||
# -----------------------------------------------------------------------------
|
||||
|
||||
# The style sheet to use for HTML and HTML Help pages. A file of that name
|
||||
# must exist either in Sphinx' static/ path, or in one of the custom paths
|
||||
# given in html_static_path.
|
||||
html_style = 'scipy.css'
|
||||
|
||||
# The name for this set of Sphinx documents. If None, it defaults to
|
||||
# "<project> v<release> documentation".
|
||||
html_title = "%s v%s Reference Guide (DRAFT)" % (project, version)
|
||||
|
||||
# The name of an image file (within the static path) to place at the top of
|
||||
# the sidebar.
|
||||
html_logo = '_static/scipyshiny_small.png'
|
||||
|
||||
# Add any paths that contain custom static files (such as style sheets) here,
|
||||
# relative to this directory. They are copied after the builtin static files,
|
||||
# so a file named "default.css" will overwrite the builtin "default.css".
|
||||
html_static_path = ['_static']
|
||||
|
||||
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
|
||||
# using the given strftime format.
|
||||
html_last_updated_fmt = '%b %d, %Y'
|
||||
|
||||
# Correct index page
|
||||
#html_index = "index"
|
||||
|
||||
# If true, SmartyPants will be used to convert quotes and dashes to
|
||||
# typographically correct entities.
|
||||
#html_use_smartypants = True
|
||||
|
||||
# Custom sidebar templates, maps document names to template names.
|
||||
html_sidebars = {
|
||||
'index': 'indexsidebar.html'
|
||||
}
|
||||
|
||||
# Additional templates that should be rendered to pages, maps page names to
|
||||
# template names.
|
||||
html_additional_pages = {}
|
||||
|
||||
# If false, no module index is generated.
|
||||
html_use_modindex = True
|
||||
|
||||
# If true, the reST sources are included in the HTML build as _sources/<name>.
|
||||
#html_copy_source = True
|
||||
|
||||
# If true, an OpenSearch description file will be output, and all pages will
|
||||
# contain a <link> tag referring to it. The value of this option must be the
|
||||
# base URL from which the finished HTML is served.
|
||||
#html_use_opensearch = ''
|
||||
|
||||
# If nonempty, this is the file name suffix for HTML files (e.g. ".html").
|
||||
html_file_suffix = '.html'
|
||||
|
||||
# Output file base name for HTML help builder.
|
||||
htmlhelp_basename = 'scipy'
|
||||
|
||||
# Pngmath should try to align formulas properly
|
||||
pngmath_use_preview = True
|
||||
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# LaTeX output
|
||||
# -----------------------------------------------------------------------------
|
||||
|
||||
# The paper size ('letter' or 'a4').
|
||||
#latex_paper_size = 'letter'
|
||||
|
||||
# The font size ('10pt', '11pt' or '12pt').
|
||||
#latex_font_size = '10pt'
|
||||
|
||||
# Grouping the document tree into LaTeX files. List of tuples
|
||||
# (source start file, target name, title, author, document class [howto/manual]).
|
||||
_stdauthor = 'Written by the SciPy community'
|
||||
latex_documents = [
|
||||
('index', 'scipy-ref.tex', 'SciPy Reference Guide', _stdauthor, 'manual'),
|
||||
# ('user/index', 'scipy-user.tex', 'SciPy User Guide',
|
||||
# _stdauthor, 'manual'),
|
||||
]
|
||||
|
||||
# The name of an image file (relative to this directory) to place at the top of
|
||||
# the title page.
|
||||
#latex_logo = None
|
||||
|
||||
# For "manual" documents, if this is true, then toplevel headings are parts,
|
||||
# not chapters.
|
||||
#latex_use_parts = False
|
||||
|
||||
# Additional stuff for the LaTeX preamble.
|
||||
latex_preamble = r'''
|
||||
\usepackage{amsmath}
|
||||
\DeclareUnicodeCharacter{00A0}{\nobreakspace}
|
||||
|
||||
% In the parameters section, place a newline after the Parameters
|
||||
% header
|
||||
\usepackage{expdlist}
|
||||
\let\latexdescription=\description
|
||||
\def\description{\latexdescription{}{} \breaklabel}
|
||||
|
||||
% Make Examples/etc section headers smaller and more compact
|
||||
\makeatletter
|
||||
\titleformat{\paragraph}{\normalsize\py@HeaderFamily}%
|
||||
{\py@TitleColor}{0em}{\py@TitleColor}{\py@NormalColor}
|
||||
\titlespacing*{\paragraph}{0pt}{1ex}{0pt}
|
||||
\makeatother
|
||||
|
||||
% Fix footer/header
|
||||
\renewcommand{\chaptermark}[1]{\markboth{\MakeUppercase{\thechapter.\ #1}}{}}
|
||||
\renewcommand{\sectionmark}[1]{\markright{\MakeUppercase{\thesection.\ #1}}}
|
||||
'''
|
||||
|
||||
# Documents to append as an appendix to all manuals.
|
||||
#latex_appendices = []
|
||||
|
||||
# If false, no module index is generated.
|
||||
latex_use_modindex = False
|
||||
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# Intersphinx configuration
|
||||
# -----------------------------------------------------------------------------
|
||||
intersphinx_mapping = {
|
||||
'http://docs.python.org/dev': None,
|
||||
'http://docs.scipy.org/doc/numpy': None,
|
||||
}
|
||||
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# Numpy extensions
|
||||
# -----------------------------------------------------------------------------
|
||||
|
||||
# If we want to do a phantom import from an XML file for all autodocs
|
||||
phantom_import_file = 'dump.xml'
|
||||
|
||||
# Edit links
|
||||
#numpydoc_edit_link = '`Edit </pydocweb/doc/%(full_name)s/>`__'
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# Autosummary
|
||||
# -----------------------------------------------------------------------------
|
||||
|
||||
if sphinx.__version__ >= "0.7":
|
||||
import glob
|
||||
autosummary_generate = glob.glob("*.rst")
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# Coverage checker
|
||||
# -----------------------------------------------------------------------------
|
||||
coverage_ignore_modules = r"""
|
||||
""".split()
|
||||
coverage_ignore_functions = r"""
|
||||
test($|_) (some|all)true bitwise_not cumproduct pkgload
|
||||
generic\.
|
||||
""".split()
|
||||
coverage_ignore_classes = r"""
|
||||
""".split()
|
||||
|
||||
coverage_c_path = []
|
||||
coverage_c_regexes = {}
|
||||
coverage_ignore_c_items = {}
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# Plot
|
||||
#------------------------------------------------------------------------------
|
||||
plot_pre_code = """
|
||||
import numpy as np
|
||||
import scipy as sp
|
||||
np.random.seed(123)
|
||||
"""
|
||||
plot_include_source = True
|
||||
plot_formats = [('png', 100), 'pdf']
|
||||
|
||||
import math
|
||||
phi = (math.sqrt(5) + 1)/2
|
||||
|
||||
import matplotlib
|
||||
matplotlib.rcParams.update({
|
||||
'font.size': 8,
|
||||
'axes.titlesize': 8,
|
||||
'axes.labelsize': 8,
|
||||
'xtick.labelsize': 8,
|
||||
'ytick.labelsize': 8,
|
||||
'legend.fontsize': 8,
|
||||
'figure.figsize': (3*phi, 3),
|
||||
'figure.subplot.bottom': 0.2,
|
||||
'figure.subplot.left': 0.2,
|
||||
'figure.subplot.right': 0.9,
|
||||
'figure.subplot.top': 0.85,
|
||||
'figure.subplot.wspace': 0.4,
|
||||
'text.usetex': False,
|
||||
})
|
582
pythonPackages/scipy-0.8.0/doc/source/constants.rst
Executable file
582
pythonPackages/scipy-0.8.0/doc/source/constants.rst
Executable file
|
@ -0,0 +1,582 @@
|
|||
==================================
|
||||
Constants (:mod:`scipy.constants`)
|
||||
==================================
|
||||
|
||||
.. module:: scipy.constants
|
||||
|
||||
Physical and mathematical constants and units.
|
||||
|
||||
Mathematical constants
|
||||
======================
|
||||
|
||||
============ =================================================================
|
||||
``pi`` Pi
|
||||
``golden`` Golden ratio
|
||||
============ =================================================================
|
||||
|
||||
Physical constants
|
||||
==================
|
||||
|
||||
============= =================================================================
|
||||
``c`` speed of light in vacuum
|
||||
``mu_0`` the magnetic constant :math:`\mu_0`
|
||||
``epsilon_0`` the electric constant (vacuum permittivity), :math:`\epsilon_0`
|
||||
``h`` the Planck constant :math:`h`
|
||||
``hbar`` :math:`\hbar = h/(2\pi)`
|
||||
``G`` Newtonian constant of gravitation
|
||||
``g`` standard acceleration of gravity
|
||||
``e`` elementary charge
|
||||
``R`` molar gas constant
|
||||
``alpha`` fine-structure constant
|
||||
``N_A`` Avogadro constant
|
||||
``k`` Boltzmann constant
|
||||
``sigma`` Stefan-Boltzmann constant :math:`\sigma`
|
||||
``Wien`` Wien displacement law constant
|
||||
``Rydberg`` Rydberg constant
|
||||
``m_e`` electron mass
|
||||
``m_p`` proton mass
|
||||
``m_n`` neutron mass
|
||||
============= =================================================================
|
||||
|
||||
|
||||
Constants database
|
||||
==================
|
||||
|
||||
In addition to the above variables containing physical constants,
|
||||
:mod:`scipy.constants` also contains a database of additional physical
|
||||
constants.
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
value
|
||||
unit
|
||||
precision
|
||||
find
|
||||
|
||||
.. data:: physical_constants
|
||||
|
||||
Dictionary of physical constants, of the format
|
||||
``physical_constants[name] = (value, unit, uncertainty)``.
|
||||
|
||||
Available constants:
|
||||
|
||||
====================================================================== ====
|
||||
``alpha particle mass``
|
||||
``alpha particle mass energy equivalent``
|
||||
``alpha particle mass energy equivalent in MeV``
|
||||
``alpha particle mass in u``
|
||||
``alpha particle molar mass``
|
||||
``alpha particle-electron mass ratio``
|
||||
``alpha particle-proton mass ratio``
|
||||
``Angstrom star``
|
||||
``atomic mass constant``
|
||||
``atomic mass constant energy equivalent``
|
||||
``atomic mass constant energy equivalent in MeV``
|
||||
``atomic mass unit-electron volt relationship``
|
||||
``atomic mass unit-hartree relationship``
|
||||
``atomic mass unit-hertz relationship``
|
||||
``atomic mass unit-inverse meter relationship``
|
||||
``atomic mass unit-joule relationship``
|
||||
``atomic mass unit-kelvin relationship``
|
||||
``atomic mass unit-kilogram relationship``
|
||||
``atomic unit of 1st hyperpolarizablity``
|
||||
``atomic unit of 2nd hyperpolarizablity``
|
||||
``atomic unit of action``
|
||||
``atomic unit of charge``
|
||||
``atomic unit of charge density``
|
||||
``atomic unit of current``
|
||||
``atomic unit of electric dipole moment``
|
||||
``atomic unit of electric field``
|
||||
``atomic unit of electric field gradient``
|
||||
``atomic unit of electric polarizablity``
|
||||
``atomic unit of electric potential``
|
||||
``atomic unit of electric quadrupole moment``
|
||||
``atomic unit of energy``
|
||||
``atomic unit of force``
|
||||
``atomic unit of length``
|
||||
``atomic unit of magnetic dipole moment``
|
||||
``atomic unit of magnetic flux density``
|
||||
``atomic unit of magnetizability``
|
||||
``atomic unit of mass``
|
||||
``atomic unit of momentum``
|
||||
``atomic unit of permittivity``
|
||||
``atomic unit of time``
|
||||
``atomic unit of velocity``
|
||||
``Avogadro constant``
|
||||
``Bohr magneton``
|
||||
``Bohr magneton in eV/T``
|
||||
``Bohr magneton in Hz/T``
|
||||
``Bohr magneton in inverse meters per tesla``
|
||||
``Bohr magneton in K/T``
|
||||
``Bohr radius``
|
||||
``Boltzmann constant``
|
||||
``Boltzmann constant in eV/K``
|
||||
``Boltzmann constant in Hz/K``
|
||||
``Boltzmann constant in inverse meters per kelvin``
|
||||
``characteristic impedance of vacuum``
|
||||
``classical electron radius``
|
||||
``Compton wavelength``
|
||||
``Compton wavelength over 2 pi``
|
||||
``conductance quantum``
|
||||
``conventional value of Josephson constant``
|
||||
``conventional value of von Klitzing constant``
|
||||
``Cu x unit``
|
||||
``deuteron magnetic moment``
|
||||
``deuteron magnetic moment to Bohr magneton ratio``
|
||||
``deuteron magnetic moment to nuclear magneton ratio``
|
||||
``deuteron mass``
|
||||
``deuteron mass energy equivalent``
|
||||
``deuteron mass energy equivalent in MeV``
|
||||
``deuteron mass in u``
|
||||
``deuteron molar mass``
|
||||
``deuteron rms charge radius``
|
||||
``deuteron-electron magnetic moment ratio``
|
||||
``deuteron-electron mass ratio``
|
||||
``deuteron-neutron magnetic moment ratio``
|
||||
``deuteron-proton magnetic moment ratio``
|
||||
``deuteron-proton mass ratio``
|
||||
``electric constant``
|
||||
``electron charge to mass quotient``
|
||||
``electron g factor``
|
||||
``electron gyromagnetic ratio``
|
||||
``electron gyromagnetic ratio over 2 pi``
|
||||
``electron magnetic moment``
|
||||
``electron magnetic moment anomaly``
|
||||
``electron magnetic moment to Bohr magneton ratio``
|
||||
``electron magnetic moment to nuclear magneton ratio``
|
||||
``electron mass``
|
||||
``electron mass energy equivalent``
|
||||
``electron mass energy equivalent in MeV``
|
||||
``electron mass in u``
|
||||
``electron molar mass``
|
||||
``electron to alpha particle mass ratio``
|
||||
``electron to shielded helion magnetic moment ratio``
|
||||
``electron to shielded proton magnetic moment ratio``
|
||||
``electron volt``
|
||||
``electron volt-atomic mass unit relationship``
|
||||
``electron volt-hartree relationship``
|
||||
``electron volt-hertz relationship``
|
||||
``electron volt-inverse meter relationship``
|
||||
``electron volt-joule relationship``
|
||||
``electron volt-kelvin relationship``
|
||||
``electron volt-kilogram relationship``
|
||||
``electron-deuteron magnetic moment ratio``
|
||||
``electron-deuteron mass ratio``
|
||||
``electron-muon magnetic moment ratio``
|
||||
``electron-muon mass ratio``
|
||||
``electron-neutron magnetic moment ratio``
|
||||
``electron-neutron mass ratio``
|
||||
``electron-proton magnetic moment ratio``
|
||||
``electron-proton mass ratio``
|
||||
``electron-tau mass ratio``
|
||||
``elementary charge``
|
||||
``elementary charge over h``
|
||||
``Faraday constant``
|
||||
``Faraday constant for conventional electric current``
|
||||
``Fermi coupling constant``
|
||||
``fine-structure constant``
|
||||
``first radiation constant``
|
||||
``first radiation constant for spectral radiance``
|
||||
``Hartree energy``
|
||||
``Hartree energy in eV``
|
||||
``hartree-atomic mass unit relationship``
|
||||
``hartree-electron volt relationship``
|
||||
``hartree-hertz relationship``
|
||||
``hartree-inverse meter relationship``
|
||||
``hartree-joule relationship``
|
||||
``hartree-kelvin relationship``
|
||||
``hartree-kilogram relationship``
|
||||
``helion mass``
|
||||
``helion mass energy equivalent``
|
||||
``helion mass energy equivalent in MeV``
|
||||
``helion mass in u``
|
||||
``helion molar mass``
|
||||
``helion-electron mass ratio``
|
||||
``helion-proton mass ratio``
|
||||
``hertz-atomic mass unit relationship``
|
||||
``hertz-electron volt relationship``
|
||||
``hertz-hartree relationship``
|
||||
``hertz-inverse meter relationship``
|
||||
``hertz-joule relationship``
|
||||
``hertz-kelvin relationship``
|
||||
``hertz-kilogram relationship``
|
||||
``inverse fine-structure constant``
|
||||
``inverse meter-atomic mass unit relationship``
|
||||
``inverse meter-electron volt relationship``
|
||||
``inverse meter-hartree relationship``
|
||||
``inverse meter-hertz relationship``
|
||||
``inverse meter-joule relationship``
|
||||
``inverse meter-kelvin relationship``
|
||||
``inverse meter-kilogram relationship``
|
||||
``inverse of conductance quantum``
|
||||
``Josephson constant``
|
||||
``joule-atomic mass unit relationship``
|
||||
``joule-electron volt relationship``
|
||||
``joule-hartree relationship``
|
||||
``joule-hertz relationship``
|
||||
``joule-inverse meter relationship``
|
||||
``joule-kelvin relationship``
|
||||
``joule-kilogram relationship``
|
||||
``kelvin-atomic mass unit relationship``
|
||||
``kelvin-electron volt relationship``
|
||||
``kelvin-hartree relationship``
|
||||
``kelvin-hertz relationship``
|
||||
``kelvin-inverse meter relationship``
|
||||
``kelvin-joule relationship``
|
||||
``kelvin-kilogram relationship``
|
||||
``kilogram-atomic mass unit relationship``
|
||||
``kilogram-electron volt relationship``
|
||||
``kilogram-hartree relationship``
|
||||
``kilogram-hertz relationship``
|
||||
``kilogram-inverse meter relationship``
|
||||
``kilogram-joule relationship``
|
||||
``kilogram-kelvin relationship``
|
||||
``lattice parameter of silicon``
|
||||
``Loschmidt constant (273.15 K, 101.325 kPa)``
|
||||
``magnetic constant``
|
||||
``magnetic flux quantum``
|
||||
``Mo x unit``
|
||||
``molar gas constant``
|
||||
``molar mass constant``
|
||||
``molar mass of carbon-12``
|
||||
``molar Planck constant``
|
||||
``molar Planck constant times c``
|
||||
``molar volume of ideal gas (273.15 K, 100 kPa)``
|
||||
``molar volume of ideal gas (273.15 K, 101.325 kPa)``
|
||||
``molar volume of silicon``
|
||||
``muon Compton wavelength``
|
||||
``muon Compton wavelength over 2 pi``
|
||||
``muon g factor``
|
||||
``muon magnetic moment``
|
||||
``muon magnetic moment anomaly``
|
||||
``muon magnetic moment to Bohr magneton ratio``
|
||||
``muon magnetic moment to nuclear magneton ratio``
|
||||
``muon mass``
|
||||
``muon mass energy equivalent``
|
||||
``muon mass energy equivalent in MeV``
|
||||
``muon mass in u``
|
||||
``muon molar mass``
|
||||
``muon-electron mass ratio``
|
||||
``muon-neutron mass ratio``
|
||||
``muon-proton magnetic moment ratio``
|
||||
``muon-proton mass ratio``
|
||||
``muon-tau mass ratio``
|
||||
``natural unit of action``
|
||||
``natural unit of action in eV s``
|
||||
``natural unit of energy``
|
||||
``natural unit of energy in MeV``
|
||||
``natural unit of length``
|
||||
``natural unit of mass``
|
||||
``natural unit of momentum``
|
||||
``natural unit of momentum in MeV/c``
|
||||
``natural unit of time``
|
||||
``natural unit of velocity``
|
||||
``neutron Compton wavelength``
|
||||
``neutron Compton wavelength over 2 pi``
|
||||
``neutron g factor``
|
||||
``neutron gyromagnetic ratio``
|
||||
``neutron gyromagnetic ratio over 2 pi``
|
||||
``neutron magnetic moment``
|
||||
``neutron magnetic moment to Bohr magneton ratio``
|
||||
``neutron magnetic moment to nuclear magneton ratio``
|
||||
``neutron mass``
|
||||
``neutron mass energy equivalent``
|
||||
``neutron mass energy equivalent in MeV``
|
||||
``neutron mass in u``
|
||||
``neutron molar mass``
|
||||
``neutron to shielded proton magnetic moment ratio``
|
||||
``neutron-electron magnetic moment ratio``
|
||||
``neutron-electron mass ratio``
|
||||
``neutron-muon mass ratio``
|
||||
``neutron-proton magnetic moment ratio``
|
||||
``neutron-proton mass ratio``
|
||||
``neutron-tau mass ratio``
|
||||
``Newtonian constant of gravitation``
|
||||
``Newtonian constant of gravitation over h-bar c``
|
||||
``nuclear magneton``
|
||||
``nuclear magneton in eV/T``
|
||||
``nuclear magneton in inverse meters per tesla``
|
||||
``nuclear magneton in K/T``
|
||||
``nuclear magneton in MHz/T``
|
||||
``Planck constant``
|
||||
``Planck constant in eV s``
|
||||
``Planck constant over 2 pi``
|
||||
``Planck constant over 2 pi in eV s``
|
||||
``Planck constant over 2 pi times c in MeV fm``
|
||||
``Planck length``
|
||||
``Planck mass``
|
||||
``Planck temperature``
|
||||
``Planck time``
|
||||
``proton charge to mass quotient``
|
||||
``proton Compton wavelength``
|
||||
``proton Compton wavelength over 2 pi``
|
||||
``proton g factor``
|
||||
``proton gyromagnetic ratio``
|
||||
``proton gyromagnetic ratio over 2 pi``
|
||||
``proton magnetic moment``
|
||||
``proton magnetic moment to Bohr magneton ratio``
|
||||
``proton magnetic moment to nuclear magneton ratio``
|
||||
``proton magnetic shielding correction``
|
||||
``proton mass``
|
||||
``proton mass energy equivalent``
|
||||
``proton mass energy equivalent in MeV``
|
||||
``proton mass in u``
|
||||
``proton molar mass``
|
||||
``proton rms charge radius``
|
||||
``proton-electron mass ratio``
|
||||
``proton-muon mass ratio``
|
||||
``proton-neutron magnetic moment ratio``
|
||||
``proton-neutron mass ratio``
|
||||
``proton-tau mass ratio``
|
||||
``quantum of circulation``
|
||||
``quantum of circulation times 2``
|
||||
``Rydberg constant``
|
||||
``Rydberg constant times c in Hz``
|
||||
``Rydberg constant times hc in eV``
|
||||
``Rydberg constant times hc in J``
|
||||
``Sackur-Tetrode constant (1 K, 100 kPa)``
|
||||
``Sackur-Tetrode constant (1 K, 101.325 kPa)``
|
||||
``second radiation constant``
|
||||
``shielded helion gyromagnetic ratio``
|
||||
``shielded helion gyromagnetic ratio over 2 pi``
|
||||
``shielded helion magnetic moment``
|
||||
``shielded helion magnetic moment to Bohr magneton ratio``
|
||||
``shielded helion magnetic moment to nuclear magneton ratio``
|
||||
``shielded helion to proton magnetic moment ratio``
|
||||
``shielded helion to shielded proton magnetic moment ratio``
|
||||
``shielded proton gyromagnetic ratio``
|
||||
``shielded proton gyromagnetic ratio over 2 pi``
|
||||
``shielded proton magnetic moment``
|
||||
``shielded proton magnetic moment to Bohr magneton ratio``
|
||||
``shielded proton magnetic moment to nuclear magneton ratio``
|
||||
``speed of light in vacuum``
|
||||
``standard acceleration of gravity``
|
||||
``standard atmosphere``
|
||||
``Stefan-Boltzmann constant``
|
||||
``tau Compton wavelength``
|
||||
``tau Compton wavelength over 2 pi``
|
||||
``tau mass``
|
||||
``tau mass energy equivalent``
|
||||
``tau mass energy equivalent in MeV``
|
||||
``tau mass in u``
|
||||
``tau molar mass``
|
||||
``tau-electron mass ratio``
|
||||
``tau-muon mass ratio``
|
||||
``tau-neutron mass ratio``
|
||||
``tau-proton mass ratio``
|
||||
``Thomson cross section``
|
||||
``unified atomic mass unit``
|
||||
``von Klitzing constant``
|
||||
``weak mixing angle``
|
||||
``Wien displacement law constant``
|
||||
``{220} lattice spacing of silicon``
|
||||
====================================================================== ====
|
||||
|
||||
|
||||
Unit prefixes
|
||||
=============
|
||||
|
||||
SI
|
||||
--
|
||||
|
||||
============ =================================================================
|
||||
``yotta`` :math:`10^{24}`
|
||||
``zetta`` :math:`10^{21}`
|
||||
``exa`` :math:`10^{18}`
|
||||
``peta`` :math:`10^{15}`
|
||||
``tera`` :math:`10^{12}`
|
||||
``giga`` :math:`10^{9}`
|
||||
``mega`` :math:`10^{6}`
|
||||
``kilo`` :math:`10^{3}`
|
||||
``hecto`` :math:`10^{2}`
|
||||
``deka`` :math:`10^{1}`
|
||||
``deci`` :math:`10^{-1}`
|
||||
``centi`` :math:`10^{-2}`
|
||||
``milli`` :math:`10^{-3}`
|
||||
``micro`` :math:`10^{-6}`
|
||||
``nano`` :math:`10^{-9}`
|
||||
``pico`` :math:`10^{-12}`
|
||||
``femto`` :math:`10^{-15}`
|
||||
``atto`` :math:`10^{-18}`
|
||||
``zepto`` :math:`10^{-21}`
|
||||
============ =================================================================
|
||||
|
||||
|
||||
Binary
|
||||
------
|
||||
|
||||
============ =================================================================
|
||||
``kibi`` :math:`2^{10}`
|
||||
``mebi`` :math:`2^{20}`
|
||||
``gibi`` :math:`2^{30}`
|
||||
``tebi`` :math:`2^{40}`
|
||||
``pebi`` :math:`2^{50}`
|
||||
``exbi`` :math:`2^{60}`
|
||||
``zebi`` :math:`2^{70}`
|
||||
``yobi`` :math:`2^{80}`
|
||||
============ =================================================================
|
||||
|
||||
Units
|
||||
=====
|
||||
|
||||
Weight
|
||||
------
|
||||
|
||||
================= ============================================================
|
||||
``gram`` :math:`10^{-3}` kg
|
||||
``metric_ton`` :math:`10^{3}` kg
|
||||
``grain`` one grain in kg
|
||||
``lb`` one pound (avoirdupous) in kg
|
||||
``oz`` one ounce in kg
|
||||
``stone`` one stone in kg
|
||||
``grain`` one grain in kg
|
||||
``long_ton`` one long ton in kg
|
||||
``short_ton`` one short ton in kg
|
||||
``troy_ounce`` one Troy ounce in kg
|
||||
``troy_pound`` one Troy pound in kg
|
||||
``carat`` one carat in kg
|
||||
``m_u`` atomic mass constant (in kg)
|
||||
================= ============================================================
|
||||
|
||||
Angle
|
||||
-----
|
||||
|
||||
================= ============================================================
|
||||
``degree`` degree in radians
|
||||
``arcmin`` arc minute in radians
|
||||
``arcsec`` arc second in radians
|
||||
================= ============================================================
|
||||
|
||||
|
||||
Time
|
||||
----
|
||||
|
||||
================= ============================================================
|
||||
``minute`` one minute in seconds
|
||||
``hour`` one hour in seconds
|
||||
``day`` one day in seconds
|
||||
``week`` one week in seconds
|
||||
``year`` one year (365 days) in seconds
|
||||
``Julian_year`` one Julian year (365.25 days) in seconds
|
||||
================= ============================================================
|
||||
|
||||
|
||||
Length
|
||||
------
|
||||
|
||||
================= ============================================================
|
||||
``inch`` one inch in meters
|
||||
``foot`` one foot in meters
|
||||
``yard`` one yard in meters
|
||||
``mile`` one mile in meters
|
||||
``mil`` one mil in meters
|
||||
``pt`` one point in meters
|
||||
``survey_foot`` one survey foot in meters
|
||||
``survey_mile`` one survey mile in meters
|
||||
``nautical_mile`` one nautical mile in meters
|
||||
``fermi`` one Fermi in meters
|
||||
``angstrom`` one Ångström in meters
|
||||
``micron`` one micron in meters
|
||||
``au`` one astronomical unit in meters
|
||||
``light_year`` one light year in meters
|
||||
``parsec`` one parsec in meters
|
||||
================= ============================================================
|
||||
|
||||
Pressure
|
||||
--------
|
||||
|
||||
================= ============================================================
|
||||
``atm`` standard atmosphere in pascals
|
||||
``bar`` one bar in pascals
|
||||
``torr`` one torr (mmHg) in pascals
|
||||
``psi`` one psi in pascals
|
||||
================= ============================================================
|
||||
|
||||
Area
|
||||
----
|
||||
|
||||
================= ============================================================
|
||||
``hectare`` one hectare in square meters
|
||||
``acre`` one acre in square meters
|
||||
================= ============================================================
|
||||
|
||||
|
||||
Volume
|
||||
------
|
||||
|
||||
=================== ========================================================
|
||||
``liter`` one liter in cubic meters
|
||||
``gallon`` one gallon (US) in cubic meters
|
||||
``gallon_imp`` one gallon (UK) in cubic meters
|
||||
``fluid_ounce`` one fluid ounce (US) in cubic meters
|
||||
``fluid_ounce_imp`` one fluid ounce (UK) in cubic meters
|
||||
``bbl`` one barrel in cubic meters
|
||||
=================== ========================================================
|
||||
|
||||
Speed
|
||||
-----
|
||||
|
||||
================= ==========================================================
|
||||
``kmh`` kilometers per hour in meters per second
|
||||
``mph`` miles per hour in meters per second
|
||||
``mach`` one Mach (approx., at 15 °C, 1 atm) in meters per second
|
||||
``knot`` one knot in meters per second
|
||||
================= ==========================================================
|
||||
|
||||
|
||||
Temperature
|
||||
-----------
|
||||
|
||||
===================== =======================================================
|
||||
``zero_Celsius`` zero of Celsius scale in Kelvin
|
||||
``degree_Fahrenheit`` one Fahrenheit (only differences) in Kelvins
|
||||
===================== =======================================================
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
C2K
|
||||
K2C
|
||||
F2C
|
||||
C2F
|
||||
F2K
|
||||
K2F
|
||||
|
||||
Energy
|
||||
------
|
||||
|
||||
==================== =======================================================
|
||||
``eV`` one electron volt in Joules
|
||||
``calorie`` one calorie (thermochemical) in Joules
|
||||
``calorie_IT`` one calorie (International Steam Table calorie, 1956) in Joules
|
||||
``erg`` one erg in Joules
|
||||
``Btu`` one British thermal unit (International Steam Table) in Joules
|
||||
``Btu_th`` one British thermal unit (thermochemical) in Joules
|
||||
``ton_TNT`` one ton of TNT in Joules
|
||||
==================== =======================================================
|
||||
|
||||
Power
|
||||
-----
|
||||
|
||||
==================== =======================================================
|
||||
``hp`` one horsepower in watts
|
||||
==================== =======================================================
|
||||
|
||||
Force
|
||||
-----
|
||||
|
||||
==================== =======================================================
|
||||
``dyn`` one dyne in newtons
|
||||
``lbf`` one pound force in newtons
|
||||
``kgf`` one kilogram force in newtons
|
||||
==================== =======================================================
|
||||
|
||||
Optics
|
||||
------
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
lambda2nu
|
||||
nu2lambda
|
77
pythonPackages/scipy-0.8.0/doc/source/fftpack.rst
Executable file
77
pythonPackages/scipy-0.8.0/doc/source/fftpack.rst
Executable file
|
@ -0,0 +1,77 @@
|
|||
Fourier transforms (:mod:`scipy.fftpack`)
|
||||
=========================================
|
||||
|
||||
.. module:: scipy.fftpack
|
||||
|
||||
Fast Fourier transforms
|
||||
-----------------------
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
fft
|
||||
ifft
|
||||
fftn
|
||||
ifftn
|
||||
fft2
|
||||
ifft2
|
||||
rfft
|
||||
irfft
|
||||
|
||||
Differential and pseudo-differential operators
|
||||
----------------------------------------------
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
diff
|
||||
tilbert
|
||||
itilbert
|
||||
hilbert
|
||||
ihilbert
|
||||
cs_diff
|
||||
sc_diff
|
||||
ss_diff
|
||||
cc_diff
|
||||
shift
|
||||
|
||||
Helper functions
|
||||
----------------
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
fftshift
|
||||
ifftshift
|
||||
dftfreq
|
||||
rfftfreq
|
||||
|
||||
Convolutions (:mod:`scipy.fftpack.convolve`)
|
||||
--------------------------------------------
|
||||
|
||||
.. module:: scipy.fftpack.convolve
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
convolve
|
||||
convolve_z
|
||||
init_convolution_kernel
|
||||
destroy_convolve_cache
|
||||
|
||||
|
||||
Other (:mod:`scipy.fftpack._fftpack`)
|
||||
-------------------------------------
|
||||
|
||||
.. module:: scipy.fftpack._fftpack
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
drfft
|
||||
zfft
|
||||
zrfft
|
||||
zfftnd
|
||||
destroy_drfft_cache
|
||||
destroy_zfft_cache
|
||||
destroy_zfftnd_cache
|
44
pythonPackages/scipy-0.8.0/doc/source/index.rst
Executable file
44
pythonPackages/scipy-0.8.0/doc/source/index.rst
Executable file
|
@ -0,0 +1,44 @@
|
|||
SciPy
|
||||
=====
|
||||
|
||||
:Release: |version|
|
||||
:Date: |today|
|
||||
|
||||
SciPy (pronounced "Sigh Pie") is open-source software for mathematics,
|
||||
science, and engineering.
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
|
||||
tutorial/index
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
|
||||
release
|
||||
|
||||
Reference
|
||||
---------
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
|
||||
cluster
|
||||
constants
|
||||
fftpack
|
||||
integrate
|
||||
interpolate
|
||||
io
|
||||
linalg
|
||||
maxentropy
|
||||
misc
|
||||
ndimage
|
||||
odr
|
||||
optimize
|
||||
signal
|
||||
sparse
|
||||
sparse.linalg
|
||||
spatial
|
||||
special
|
||||
stats
|
||||
weave
|
44
pythonPackages/scipy-0.8.0/doc/source/integrate.rst
Executable file
44
pythonPackages/scipy-0.8.0/doc/source/integrate.rst
Executable file
|
@ -0,0 +1,44 @@
|
|||
=============================================
|
||||
Integration and ODEs (:mod:`scipy.integrate`)
|
||||
=============================================
|
||||
|
||||
.. module:: scipy.integrate
|
||||
|
||||
|
||||
Integrating functions, given function object
|
||||
============================================
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
quad
|
||||
dblquad
|
||||
tplquad
|
||||
fixed_quad
|
||||
quadrature
|
||||
romberg
|
||||
|
||||
Integrating functions, given fixed samples
|
||||
==========================================
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
trapz
|
||||
cumtrapz
|
||||
simps
|
||||
romb
|
||||
|
||||
.. seealso::
|
||||
|
||||
:mod:`scipy.special` for orthogonal polynomials (special) for Gaussian
|
||||
quadrature roots and weights for other weighting factors and regions.
|
||||
|
||||
Integrators of ODE systems
|
||||
==========================
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
odeint
|
||||
ode
|
100
pythonPackages/scipy-0.8.0/doc/source/interpolate.rst
Executable file
100
pythonPackages/scipy-0.8.0/doc/source/interpolate.rst
Executable file
|
@ -0,0 +1,100 @@
|
|||
========================================
|
||||
Interpolation (:mod:`scipy.interpolate`)
|
||||
========================================
|
||||
|
||||
.. module:: scipy.interpolate
|
||||
|
||||
Univariate interpolation
|
||||
========================
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
interp1d
|
||||
BarycentricInterpolator
|
||||
KroghInterpolator
|
||||
PiecewisePolynomial
|
||||
barycentric_interpolate
|
||||
krogh_interpolate
|
||||
piecewise_polynomial_interpolate
|
||||
|
||||
|
||||
Multivariate interpolation
|
||||
==========================
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
interp2d
|
||||
Rbf
|
||||
|
||||
|
||||
1-D Splines
|
||||
===========
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
UnivariateSpline
|
||||
InterpolatedUnivariateSpline
|
||||
LSQUnivariateSpline
|
||||
|
||||
The above univariate spline classes have the following methods:
|
||||
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
UnivariateSpline.__call__
|
||||
UnivariateSpline.derivatives
|
||||
UnivariateSpline.integral
|
||||
UnivariateSpline.roots
|
||||
UnivariateSpline.get_coeffs
|
||||
UnivariateSpline.get_knots
|
||||
UnivariateSpline.get_residual
|
||||
UnivariateSpline.set_smoothing_factor
|
||||
|
||||
|
||||
Low-level interface to FITPACK functions:
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
splrep
|
||||
splprep
|
||||
splev
|
||||
splint
|
||||
sproot
|
||||
spalde
|
||||
bisplrep
|
||||
bisplev
|
||||
|
||||
|
||||
2-D Splines
|
||||
===========
|
||||
|
||||
.. seealso:: scipy.ndimage.map_coordinates
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
BivariateSpline
|
||||
SmoothBivariateSpline
|
||||
LSQBivariateSpline
|
||||
|
||||
Low-level interface to FITPACK functions:
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
bisplrep
|
||||
bisplev
|
||||
|
||||
Additional tools
|
||||
================
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
lagrange
|
||||
approximate_taylor_polynomial
|
67
pythonPackages/scipy-0.8.0/doc/source/io.rst
Executable file
67
pythonPackages/scipy-0.8.0/doc/source/io.rst
Executable file
|
@ -0,0 +1,67 @@
|
|||
==================================
|
||||
Input and output (:mod:`scipy.io`)
|
||||
==================================
|
||||
|
||||
.. seealso:: :ref:`numpy-reference.routines.io` (in Numpy)
|
||||
|
||||
.. module:: scipy.io
|
||||
|
||||
MATLAB® files
|
||||
=============
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
loadmat
|
||||
savemat
|
||||
|
||||
Matrix Market files
|
||||
===================
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
mminfo
|
||||
mmread
|
||||
mmwrite
|
||||
|
||||
Other
|
||||
=====
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
save_as_module
|
||||
npfile
|
||||
|
||||
Wav sound files (:mod:`scipy.io.wavfile`)
|
||||
=========================================
|
||||
|
||||
.. module:: scipy.io.wavfile
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
read
|
||||
write
|
||||
|
||||
Arff files (:mod:`scipy.io.arff`)
|
||||
=================================
|
||||
|
||||
.. automodule:: scipy.io.arff
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
loadarff
|
||||
|
||||
Netcdf (:mod:`scipy.io.netcdf`)
|
||||
===============================
|
||||
|
||||
.. module:: scipy.io.netcdf
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
netcdf_file
|
||||
netcdf_variable
|
95
pythonPackages/scipy-0.8.0/doc/source/linalg.rst
Executable file
95
pythonPackages/scipy-0.8.0/doc/source/linalg.rst
Executable file
|
@ -0,0 +1,95 @@
|
|||
====================================
|
||||
Linear algebra (:mod:`scipy.linalg`)
|
||||
====================================
|
||||
|
||||
.. module:: scipy.linalg
|
||||
|
||||
Basics
|
||||
======
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
inv
|
||||
solve
|
||||
solve_banded
|
||||
solveh_banded
|
||||
det
|
||||
norm
|
||||
lstsq
|
||||
pinv
|
||||
pinv2
|
||||
|
||||
Eigenvalue Problem
|
||||
==================
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
eig
|
||||
eigvals
|
||||
eigh
|
||||
eigvalsh
|
||||
eig_banded
|
||||
eigvals_banded
|
||||
|
||||
Decompositions
|
||||
==============
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
lu
|
||||
lu_factor
|
||||
lu_solve
|
||||
svd
|
||||
svdvals
|
||||
diagsvd
|
||||
orth
|
||||
cholesky
|
||||
cholesky_banded
|
||||
cho_factor
|
||||
cho_solve
|
||||
cho_solve_banded
|
||||
qr
|
||||
schur
|
||||
rsf2csf
|
||||
hessenberg
|
||||
|
||||
Matrix Functions
|
||||
================
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
expm
|
||||
expm2
|
||||
expm3
|
||||
logm
|
||||
cosm
|
||||
sinm
|
||||
tanm
|
||||
coshm
|
||||
sinhm
|
||||
tanhm
|
||||
signm
|
||||
sqrtm
|
||||
funm
|
||||
|
||||
Special Matrices
|
||||
================
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
block_diag
|
||||
circulant
|
||||
companion
|
||||
hadamard
|
||||
hankel
|
||||
kron
|
||||
leslie
|
||||
toeplitz
|
||||
tri
|
||||
tril
|
||||
triu
|
10
pythonPackages/scipy-0.8.0/doc/source/misc.rst
Executable file
10
pythonPackages/scipy-0.8.0/doc/source/misc.rst
Executable file
|
@ -0,0 +1,10 @@
|
|||
==========================================
|
||||
Miscellaneous routines (:mod:`scipy.misc`)
|
||||
==========================================
|
||||
|
||||
.. warning::
|
||||
|
||||
This documentation is work-in-progress and unorganized.
|
||||
|
||||
.. automodule:: scipy.misc
|
||||
:members:
|
122
pythonPackages/scipy-0.8.0/doc/source/ndimage.rst
Executable file
122
pythonPackages/scipy-0.8.0/doc/source/ndimage.rst
Executable file
|
@ -0,0 +1,122 @@
|
|||
=========================================================
|
||||
Multi-dimensional image processing (:mod:`scipy.ndimage`)
|
||||
=========================================================
|
||||
|
||||
.. module:: scipy.ndimage
|
||||
|
||||
Functions for multi-dimensional image processing.
|
||||
|
||||
Filters :mod:`scipy.ndimage.filters`
|
||||
====================================
|
||||
|
||||
.. module:: scipy.ndimage.filters
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
convolve
|
||||
convolve1d
|
||||
correlate
|
||||
correlate1d
|
||||
gaussian_filter
|
||||
gaussian_filter1d
|
||||
gaussian_gradient_magnitude
|
||||
gaussian_laplace
|
||||
generic_filter
|
||||
generic_filter1d
|
||||
generic_gradient_magnitude
|
||||
generic_laplace
|
||||
laplace
|
||||
maximum_filter
|
||||
maximum_filter1d
|
||||
median_filter
|
||||
minimum_filter
|
||||
minimum_filter1d
|
||||
percentile_filter
|
||||
prewitt
|
||||
rank_filter
|
||||
sobel
|
||||
uniform_filter
|
||||
uniform_filter1d
|
||||
|
||||
Fourier filters :mod:`scipy.ndimage.fourier`
|
||||
============================================
|
||||
|
||||
.. module:: scipy.ndimage.fourier
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
fourier_ellipsoid
|
||||
fourier_gaussian
|
||||
fourier_shift
|
||||
fourier_uniform
|
||||
|
||||
Interpolation :mod:`scipy.ndimage.interpolation`
|
||||
================================================
|
||||
|
||||
.. module:: scipy.ndimage.interpolation
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
affine_transform
|
||||
geometric_transform
|
||||
map_coordinates
|
||||
rotate
|
||||
shift
|
||||
spline_filter
|
||||
spline_filter1d
|
||||
zoom
|
||||
|
||||
Measurements :mod:`scipy.ndimage.measurements`
|
||||
==============================================
|
||||
|
||||
.. module:: scipy.ndimage.measurements
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
center_of_mass
|
||||
extrema
|
||||
find_objects
|
||||
histogram
|
||||
label
|
||||
maximum
|
||||
maximum_position
|
||||
mean
|
||||
minimum
|
||||
minimum_position
|
||||
standard_deviation
|
||||
sum
|
||||
variance
|
||||
watershed_ift
|
||||
|
||||
Morphology :mod:`scipy.ndimage.morphology`
|
||||
==========================================
|
||||
|
||||
.. module:: scipy.ndimage.morphology
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
binary_closing
|
||||
binary_dilation
|
||||
binary_erosion
|
||||
binary_fill_holes
|
||||
binary_hit_or_miss
|
||||
binary_opening
|
||||
binary_propagation
|
||||
black_tophat
|
||||
distance_transform_bf
|
||||
distance_transform_cdt
|
||||
distance_transform_edt
|
||||
generate_binary_structure
|
||||
grey_closing
|
||||
grey_dilation
|
||||
grey_erosion
|
||||
grey_opening
|
||||
iterate_structure
|
||||
morphological_gradient
|
||||
morphological_laplace
|
||||
white_tophat
|
33
pythonPackages/scipy-0.8.0/doc/source/odr.rst
Executable file
33
pythonPackages/scipy-0.8.0/doc/source/odr.rst
Executable file
|
@ -0,0 +1,33 @@
|
|||
=================================================
|
||||
Orthogonal distance regression (:mod:`scipy.odr`)
|
||||
=================================================
|
||||
|
||||
.. automodule:: scipy.odr
|
||||
|
||||
.. autoclass:: Data
|
||||
|
||||
.. automethod:: set_meta
|
||||
|
||||
.. autoclass:: Model
|
||||
|
||||
.. automethod:: set_meta
|
||||
|
||||
.. autoclass:: ODR
|
||||
|
||||
.. automethod:: restart
|
||||
|
||||
.. automethod:: run
|
||||
|
||||
.. automethod:: set_iprint
|
||||
|
||||
.. automethod:: set_job
|
||||
|
||||
.. autoclass:: Output
|
||||
|
||||
.. automethod:: pprint
|
||||
|
||||
.. autoexception:: odr_error
|
||||
|
||||
.. autoexception:: odr_stop
|
||||
|
||||
.. autofunction:: odr
|
111
pythonPackages/scipy-0.8.0/doc/source/optimize.rst
Executable file
111
pythonPackages/scipy-0.8.0/doc/source/optimize.rst
Executable file
|
@ -0,0 +1,111 @@
|
|||
=====================================================
|
||||
Optimization and root finding (:mod:`scipy.optimize`)
|
||||
=====================================================
|
||||
|
||||
.. module:: scipy.optimize
|
||||
|
||||
Optimization
|
||||
============
|
||||
|
||||
General-purpose
|
||||
---------------
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
fmin
|
||||
fmin_powell
|
||||
fmin_cg
|
||||
fmin_bfgs
|
||||
fmin_ncg
|
||||
leastsq
|
||||
|
||||
|
||||
Constrained (multivariate)
|
||||
--------------------------
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
fmin_l_bfgs_b
|
||||
fmin_tnc
|
||||
fmin_cobyla
|
||||
fmin_slsqp
|
||||
nnls
|
||||
|
||||
Global
|
||||
------
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
anneal
|
||||
brute
|
||||
|
||||
Scalar function minimizers
|
||||
--------------------------
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
fminbound
|
||||
golden
|
||||
bracket
|
||||
brent
|
||||
|
||||
Fitting
|
||||
=======
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
curve_fit
|
||||
|
||||
Root finding
|
||||
============
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
fsolve
|
||||
|
||||
Scalar function solvers
|
||||
-----------------------
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
brentq
|
||||
brenth
|
||||
ridder
|
||||
bisect
|
||||
newton
|
||||
|
||||
Fixed point finding:
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
fixed_point
|
||||
|
||||
General-purpose nonlinear (multidimensional)
|
||||
--------------------------------------------
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
broyden1
|
||||
broyden2
|
||||
broyden3
|
||||
broyden_generalized
|
||||
anderson
|
||||
anderson2
|
||||
|
||||
Utility Functions
|
||||
=================
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
line_search
|
||||
check_grad
|
5
pythonPackages/scipy-0.8.0/doc/source/release.rst
Executable file
5
pythonPackages/scipy-0.8.0/doc/source/release.rst
Executable file
|
@ -0,0 +1,5 @@
|
|||
*************
|
||||
Release Notes
|
||||
*************
|
||||
|
||||
.. include:: ../release/0.8.0-notes.rst
|
168
pythonPackages/scipy-0.8.0/doc/source/signal.rst
Executable file
168
pythonPackages/scipy-0.8.0/doc/source/signal.rst
Executable file
|
@ -0,0 +1,168 @@
|
|||
=======================================
|
||||
Signal processing (:mod:`scipy.signal`)
|
||||
=======================================
|
||||
|
||||
.. module:: scipy.signal
|
||||
|
||||
Convolution
|
||||
===========
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
convolve
|
||||
correlate
|
||||
fftconvolve
|
||||
convolve2d
|
||||
correlate2d
|
||||
sepfir2d
|
||||
|
||||
B-splines
|
||||
=========
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
bspline
|
||||
gauss_spline
|
||||
cspline1d
|
||||
qspline1d
|
||||
cspline2d
|
||||
qspline2d
|
||||
spline_filter
|
||||
|
||||
Filtering
|
||||
=========
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
order_filter
|
||||
medfilt
|
||||
medfilt2d
|
||||
wiener
|
||||
|
||||
symiirorder1
|
||||
symiirorder2
|
||||
lfilter
|
||||
lfiltic
|
||||
|
||||
deconvolve
|
||||
|
||||
hilbert
|
||||
get_window
|
||||
|
||||
decimate
|
||||
detrend
|
||||
resample
|
||||
|
||||
Filter design
|
||||
=============
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
bilinear
|
||||
firwin
|
||||
freqs
|
||||
freqz
|
||||
iirdesign
|
||||
iirfilter
|
||||
kaiserord
|
||||
remez
|
||||
|
||||
unique_roots
|
||||
residue
|
||||
residuez
|
||||
invres
|
||||
|
||||
Matlab-style IIR filter design
|
||||
==============================
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
butter
|
||||
buttord
|
||||
cheby1
|
||||
cheb1ord
|
||||
cheby2
|
||||
cheb2ord
|
||||
ellip
|
||||
ellipord
|
||||
bessel
|
||||
|
||||
Linear Systems
|
||||
==============
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
lti
|
||||
lsim
|
||||
lsim2
|
||||
impulse
|
||||
impulse2
|
||||
step
|
||||
step2
|
||||
|
||||
LTI Representations
|
||||
===================
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
tf2zpk
|
||||
zpk2tf
|
||||
tf2ss
|
||||
ss2tf
|
||||
zpk2ss
|
||||
ss2zpk
|
||||
|
||||
Waveforms
|
||||
=========
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
chirp
|
||||
gausspulse
|
||||
sawtooth
|
||||
square
|
||||
sweep_poly
|
||||
|
||||
Window functions
|
||||
================
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
get_window
|
||||
barthann
|
||||
bartlett
|
||||
blackman
|
||||
blackmanharris
|
||||
bohman
|
||||
boxcar
|
||||
chebwin
|
||||
flattop
|
||||
gaussian
|
||||
general_gaussian
|
||||
hamming
|
||||
hann
|
||||
kaiser
|
||||
nuttall
|
||||
parzen
|
||||
slepian
|
||||
triang
|
||||
|
||||
Wavelets
|
||||
========
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
cascade
|
||||
daub
|
||||
morlet
|
||||
qmf
|
10
pythonPackages/scipy-0.8.0/doc/source/sparse.linalg.rst
Executable file
10
pythonPackages/scipy-0.8.0/doc/source/sparse.linalg.rst
Executable file
|
@ -0,0 +1,10 @@
|
|||
==================================================
|
||||
Sparse linear algebra (:mod:`scipy.sparse.linalg`)
|
||||
==================================================
|
||||
|
||||
.. warning::
|
||||
|
||||
This documentation is work-in-progress and unorganized.
|
||||
|
||||
.. automodule:: scipy.sparse.linalg
|
||||
:members:
|
64
pythonPackages/scipy-0.8.0/doc/source/sparse.rst
Executable file
64
pythonPackages/scipy-0.8.0/doc/source/sparse.rst
Executable file
|
@ -0,0 +1,64 @@
|
|||
=====================================
|
||||
Sparse matrices (:mod:`scipy.sparse`)
|
||||
=====================================
|
||||
|
||||
.. automodule:: scipy.sparse
|
||||
|
||||
|
||||
Sparse matrix classes
|
||||
=====================
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
csc_matrix
|
||||
csr_matrix
|
||||
bsr_matrix
|
||||
lil_matrix
|
||||
dok_matrix
|
||||
coo_matrix
|
||||
dia_matrix
|
||||
|
||||
|
||||
Functions
|
||||
=========
|
||||
|
||||
Building sparse matrices:
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
eye
|
||||
identity
|
||||
kron
|
||||
kronsum
|
||||
lil_eye
|
||||
lil_diags
|
||||
spdiags
|
||||
tril
|
||||
triu
|
||||
bmat
|
||||
hstack
|
||||
vstack
|
||||
|
||||
Identifying sparse matrices:
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
issparse
|
||||
isspmatrix
|
||||
isspmatrix_csc
|
||||
isspmatrix_csr
|
||||
isspmatrix_bsr
|
||||
isspmatrix_lil
|
||||
isspmatrix_dok
|
||||
isspmatrix_coo
|
||||
isspmatrix_dia
|
||||
|
||||
Exceptions
|
||||
==========
|
||||
|
||||
.. autoexception:: SparseEfficiencyWarning
|
||||
|
||||
.. autoexception:: SparseWarning
|
6
pythonPackages/scipy-0.8.0/doc/source/spatial.distance.rst
Executable file
6
pythonPackages/scipy-0.8.0/doc/source/spatial.distance.rst
Executable file
|
@ -0,0 +1,6 @@
|
|||
=====================================================
|
||||
Distance computations (:mod:`scipy.spatial.distance`)
|
||||
=====================================================
|
||||
|
||||
.. automodule:: scipy.spatial.distance
|
||||
:members:
|
14
pythonPackages/scipy-0.8.0/doc/source/spatial.rst
Executable file
14
pythonPackages/scipy-0.8.0/doc/source/spatial.rst
Executable file
|
@ -0,0 +1,14 @@
|
|||
=============================================================
|
||||
Spatial algorithms and data structures (:mod:`scipy.spatial`)
|
||||
=============================================================
|
||||
|
||||
.. warning::
|
||||
|
||||
This documentation is work-in-progress and unorganized.
|
||||
|
||||
.. toctree::
|
||||
|
||||
spatial.distance
|
||||
|
||||
.. automodule:: scipy.spatial
|
||||
:members:
|
512
pythonPackages/scipy-0.8.0/doc/source/special.rst
Executable file
512
pythonPackages/scipy-0.8.0/doc/source/special.rst
Executable file
|
@ -0,0 +1,512 @@
|
|||
========================================
|
||||
Special functions (:mod:`scipy.special`)
|
||||
========================================
|
||||
|
||||
.. module:: scipy.special
|
||||
|
||||
Nearly all of the functions below are universal functions and follow
|
||||
broadcasting and automatic array-looping rules. Exceptions are noted.
|
||||
|
||||
Error handling
|
||||
==============
|
||||
|
||||
Errors are handled by returning nans, or other appropriate values.
|
||||
Some of the special function routines will print an error message
|
||||
when an error occurs. By default this printing
|
||||
is disabled. To enable such messages use errprint(1)
|
||||
To disable such messages use errprint(0).
|
||||
|
||||
Example:
|
||||
>>> print scipy.special.bdtr(-1,10,0.3)
|
||||
>>> scipy.special.errprint(1)
|
||||
>>> print scipy.special.bdtr(-1,10,0.3)
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
errprint
|
||||
errstate
|
||||
|
||||
Available functions
|
||||
===================
|
||||
|
||||
Airy functions
|
||||
--------------
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
airy
|
||||
airye
|
||||
ai_zeros
|
||||
bi_zeros
|
||||
|
||||
|
||||
Elliptic Functions and Integrals
|
||||
--------------------------------
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
ellipj
|
||||
ellipk
|
||||
ellipkinc
|
||||
ellipe
|
||||
ellipeinc
|
||||
|
||||
Bessel Functions
|
||||
----------------
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
jn
|
||||
jv
|
||||
jve
|
||||
yn
|
||||
yv
|
||||
yve
|
||||
kn
|
||||
kv
|
||||
kve
|
||||
iv
|
||||
ive
|
||||
hankel1
|
||||
hankel1e
|
||||
hankel2
|
||||
hankel2e
|
||||
|
||||
The following is not an universal function:
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
lmbda
|
||||
|
||||
Zeros of Bessel Functions
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
These are not universal functions:
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
jnjnp_zeros
|
||||
jnyn_zeros
|
||||
jn_zeros
|
||||
jnp_zeros
|
||||
yn_zeros
|
||||
ynp_zeros
|
||||
y0_zeros
|
||||
y1_zeros
|
||||
y1p_zeros
|
||||
|
||||
Faster versions of common Bessel Functions
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
j0
|
||||
j1
|
||||
y0
|
||||
y1
|
||||
i0
|
||||
i0e
|
||||
i1
|
||||
i1e
|
||||
k0
|
||||
k0e
|
||||
k1
|
||||
k1e
|
||||
|
||||
Integrals of Bessel Functions
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
itj0y0
|
||||
it2j0y0
|
||||
iti0k0
|
||||
it2i0k0
|
||||
besselpoly
|
||||
|
||||
Derivatives of Bessel Functions
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
jvp
|
||||
yvp
|
||||
kvp
|
||||
ivp
|
||||
h1vp
|
||||
h2vp
|
||||
|
||||
Spherical Bessel Functions
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
These are not universal functions:
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
sph_jn
|
||||
sph_yn
|
||||
sph_jnyn
|
||||
sph_in
|
||||
sph_kn
|
||||
sph_inkn
|
||||
|
||||
Riccati-Bessel Functions
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
These are not universal functions:
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
riccati_jn
|
||||
riccati_yn
|
||||
|
||||
Struve Functions
|
||||
----------------
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
struve
|
||||
modstruve
|
||||
itstruve0
|
||||
it2struve0
|
||||
itmodstruve0
|
||||
|
||||
|
||||
Raw Statistical Functions
|
||||
-------------------------
|
||||
|
||||
.. seealso:: :mod:`scipy.stats`: Friendly versions of these functions.
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
bdtr
|
||||
bdtrc
|
||||
bdtri
|
||||
btdtr
|
||||
btdtri
|
||||
fdtr
|
||||
fdtrc
|
||||
fdtri
|
||||
gdtr
|
||||
gdtrc
|
||||
gdtria
|
||||
gdtrib
|
||||
gdtrix
|
||||
nbdtr
|
||||
nbdtrc
|
||||
nbdtri
|
||||
pdtr
|
||||
pdtrc
|
||||
pdtri
|
||||
stdtr
|
||||
stdtridf
|
||||
stdtrit
|
||||
chdtr
|
||||
chdtrc
|
||||
chdtri
|
||||
ndtr
|
||||
ndtri
|
||||
smirnov
|
||||
smirnovi
|
||||
kolmogorov
|
||||
kolmogi
|
||||
tklmbda
|
||||
|
||||
Gamma and Related Functions
|
||||
---------------------------
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
gamma
|
||||
gammaln
|
||||
gammainc
|
||||
gammaincinv
|
||||
gammaincc
|
||||
gammainccinv
|
||||
beta
|
||||
betaln
|
||||
betainc
|
||||
betaincinv
|
||||
psi
|
||||
rgamma
|
||||
polygamma
|
||||
multigammaln
|
||||
|
||||
|
||||
Error Function and Fresnel Integrals
|
||||
------------------------------------
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
erf
|
||||
erfc
|
||||
erfinv
|
||||
erfcinv
|
||||
erf_zeros
|
||||
fresnel
|
||||
fresnel_zeros
|
||||
modfresnelp
|
||||
modfresnelm
|
||||
|
||||
These are not universal functions:
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
fresnelc_zeros
|
||||
fresnels_zeros
|
||||
|
||||
Legendre Functions
|
||||
------------------
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
lpmv
|
||||
sph_harm
|
||||
|
||||
These are not universal functions:
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
lpn
|
||||
lqn
|
||||
lpmn
|
||||
lqmn
|
||||
|
||||
Orthogonal polynomials
|
||||
----------------------
|
||||
|
||||
The following functions evaluate values of orthogonal polynomials:
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
eval_legendre
|
||||
eval_chebyt
|
||||
eval_chebyu
|
||||
eval_chebyc
|
||||
eval_chebys
|
||||
eval_jacobi
|
||||
eval_laguerre
|
||||
eval_genlaguerre
|
||||
eval_hermite
|
||||
eval_hermitenorm
|
||||
eval_gegenbauer
|
||||
eval_sh_legendre
|
||||
eval_sh_chebyt
|
||||
eval_sh_chebyu
|
||||
eval_sh_jacobi
|
||||
|
||||
The functions below, in turn, return :ref:`orthopoly1d` objects, which
|
||||
functions similarly as :ref:`numpy.poly1d`. The :ref:`orthopoly1d`
|
||||
class also has an attribute ``weights`` which returns the roots, weights,
|
||||
and total weights for the appropriate form of Gaussian quadrature.
|
||||
These are returned in an ``n x 3`` array with roots in the first column,
|
||||
weights in the second column, and total weights in the final column.
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
legendre
|
||||
chebyt
|
||||
chebyu
|
||||
chebyc
|
||||
chebys
|
||||
jacobi
|
||||
laguerre
|
||||
genlaguerre
|
||||
hermite
|
||||
hermitenorm
|
||||
gegenbauer
|
||||
sh_legendre
|
||||
sh_chebyt
|
||||
sh_chebyu
|
||||
sh_jacobi
|
||||
|
||||
.. warning::
|
||||
|
||||
Large-order polynomials obtained from these functions
|
||||
are numerically unstable.
|
||||
|
||||
``orthopoly1d`` objects are converted to ``poly1d``, when doing
|
||||
arithmetic. ``numpy.poly1d`` works in power basis and cannot
|
||||
represent high-order polynomials accurately, which can cause
|
||||
significant inaccuracy.
|
||||
|
||||
|
||||
Hypergeometric Functions
|
||||
------------------------
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
hyp2f1
|
||||
hyp1f1
|
||||
hyperu
|
||||
hyp0f1
|
||||
hyp2f0
|
||||
hyp1f2
|
||||
hyp3f0
|
||||
|
||||
|
||||
Parabolic Cylinder Functions
|
||||
----------------------------
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
pbdv
|
||||
pbvv
|
||||
pbwa
|
||||
|
||||
These are not universal functions:
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
pbdv_seq
|
||||
pbvv_seq
|
||||
pbdn_seq
|
||||
|
||||
Mathieu and Related Functions
|
||||
-----------------------------
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
mathieu_a
|
||||
mathieu_b
|
||||
|
||||
These are not universal functions:
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
mathieu_even_coef
|
||||
mathieu_odd_coef
|
||||
|
||||
The following return both function and first derivative:
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
mathieu_cem
|
||||
mathieu_sem
|
||||
mathieu_modcem1
|
||||
mathieu_modcem2
|
||||
mathieu_modsem1
|
||||
mathieu_modsem2
|
||||
|
||||
Spheroidal Wave Functions
|
||||
-------------------------
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
pro_ang1
|
||||
pro_rad1
|
||||
pro_rad2
|
||||
obl_ang1
|
||||
obl_rad1
|
||||
obl_rad2
|
||||
pro_cv
|
||||
obl_cv
|
||||
pro_cv_seq
|
||||
obl_cv_seq
|
||||
|
||||
The following functions require pre-computed characteristic value:
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
pro_ang1_cv
|
||||
pro_rad1_cv
|
||||
pro_rad2_cv
|
||||
obl_ang1_cv
|
||||
obl_rad1_cv
|
||||
obl_rad2_cv
|
||||
|
||||
Kelvin Functions
|
||||
----------------
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
kelvin
|
||||
kelvin_zeros
|
||||
ber
|
||||
bei
|
||||
berp
|
||||
beip
|
||||
ker
|
||||
kei
|
||||
kerp
|
||||
keip
|
||||
|
||||
These are not universal functions:
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
ber_zeros
|
||||
bei_zeros
|
||||
berp_zeros
|
||||
beip_zeros
|
||||
ker_zeros
|
||||
kei_zeros
|
||||
kerp_zeros
|
||||
keip_zeros
|
||||
|
||||
Other Special Functions
|
||||
-----------------------
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
expn
|
||||
exp1
|
||||
expi
|
||||
wofz
|
||||
dawsn
|
||||
shichi
|
||||
sici
|
||||
spence
|
||||
lambertw
|
||||
zeta
|
||||
zetac
|
||||
|
||||
Convenience Functions
|
||||
---------------------
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
cbrt
|
||||
exp10
|
||||
exp2
|
||||
radian
|
||||
cosdg
|
||||
sindg
|
||||
tandg
|
||||
cotdg
|
||||
log1p
|
||||
expm1
|
||||
cosm1
|
||||
round
|
81
pythonPackages/scipy-0.8.0/doc/source/stats.mstats.rst
Executable file
81
pythonPackages/scipy-0.8.0/doc/source/stats.mstats.rst
Executable file
|
@ -0,0 +1,81 @@
|
|||
.. module:: scipy.stats.mstats
|
||||
|
||||
===================================================================
|
||||
Statistical functions for masked arrays (:mod:`scipy.stats.mstats`)
|
||||
===================================================================
|
||||
|
||||
This module contains a large number of statistical functions that can
|
||||
be used with masked arrays.
|
||||
|
||||
Most of these functions are similar to those in scipy.stats but might
|
||||
have small differences in the API or in the algorithm used. Since this
|
||||
is a relatively new package, some API changes are still possible.
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
argstoarray
|
||||
betai
|
||||
chisquare
|
||||
count_tied_groups
|
||||
describe
|
||||
f_oneway
|
||||
f_value_wilks_lambda
|
||||
find_repeats
|
||||
friedmanchisquare
|
||||
gmean
|
||||
hmean
|
||||
kendalltau
|
||||
kendalltau_seasonal
|
||||
kruskalwallis
|
||||
kruskalwallis
|
||||
ks_twosamp
|
||||
ks_twosamp
|
||||
kurtosis
|
||||
kurtosistest
|
||||
linregress
|
||||
mannwhitneyu
|
||||
plotting_positions
|
||||
mode
|
||||
moment
|
||||
mquantiles
|
||||
msign
|
||||
normaltest
|
||||
obrientransform
|
||||
pearsonr
|
||||
plotting_positions
|
||||
pointbiserialr
|
||||
rankdata
|
||||
samplestd
|
||||
samplevar
|
||||
scoreatpercentile
|
||||
sem
|
||||
signaltonoise
|
||||
skew
|
||||
skewtest
|
||||
spearmanr
|
||||
std
|
||||
stderr
|
||||
theilslopes
|
||||
threshold
|
||||
tmax
|
||||
tmean
|
||||
tmin
|
||||
trim
|
||||
trima
|
||||
trimboth
|
||||
trimmed_stde
|
||||
trimr
|
||||
trimtail
|
||||
tsem
|
||||
ttest_onesamp
|
||||
ttest_ind
|
||||
ttest_onesamp
|
||||
ttest_rel
|
||||
tvar
|
||||
var
|
||||
variation
|
||||
winsorize
|
||||
z
|
||||
zmap
|
||||
zs
|
284
pythonPackages/scipy-0.8.0/doc/source/stats.rst
Executable file
284
pythonPackages/scipy-0.8.0/doc/source/stats.rst
Executable file
|
@ -0,0 +1,284 @@
|
|||
.. module:: scipy.stats
|
||||
|
||||
==========================================
|
||||
Statistical functions (:mod:`scipy.stats`)
|
||||
==========================================
|
||||
|
||||
This module contains a large number of probability distributions as
|
||||
well as a growing library of statistical functions.
|
||||
|
||||
Each included continuous distribution is an instance of the class rv_continous:
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
rv_continuous
|
||||
rv_continuous.pdf
|
||||
rv_continuous.cdf
|
||||
rv_continuous.sf
|
||||
rv_continuous.ppf
|
||||
rv_continuous.isf
|
||||
rv_continuous.stats
|
||||
|
||||
Each discrete distribution is an instance of the class rv_discrete:
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
rv_discrete
|
||||
rv_discrete.pmf
|
||||
rv_discrete.cdf
|
||||
rv_discrete.sf
|
||||
rv_discrete.ppf
|
||||
rv_discrete.isf
|
||||
rv_discrete.stats
|
||||
|
||||
Continuous distributions
|
||||
========================
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
norm
|
||||
alpha
|
||||
anglit
|
||||
arcsine
|
||||
beta
|
||||
betaprime
|
||||
bradford
|
||||
burr
|
||||
fisk
|
||||
cauchy
|
||||
chi
|
||||
chi2
|
||||
cosine
|
||||
dgamma
|
||||
dweibull
|
||||
erlang
|
||||
expon
|
||||
exponweib
|
||||
exponpow
|
||||
fatiguelife
|
||||
foldcauchy
|
||||
f
|
||||
foldnorm
|
||||
fretchet_r
|
||||
fretcher_l
|
||||
genlogistic
|
||||
genpareto
|
||||
genexpon
|
||||
genextreme
|
||||
gausshyper
|
||||
gamma
|
||||
gengamma
|
||||
genhalflogistic
|
||||
gompertz
|
||||
gumbel_r
|
||||
gumbel_l
|
||||
halfcauchy
|
||||
halflogistic
|
||||
halfnorm
|
||||
hypsecant
|
||||
invgamma
|
||||
invnorm
|
||||
invweibull
|
||||
johnsonsb
|
||||
johnsonsu
|
||||
laplace
|
||||
logistic
|
||||
loggamma
|
||||
loglaplace
|
||||
lognorm
|
||||
gilbrat
|
||||
lomax
|
||||
maxwell
|
||||
mielke
|
||||
nakagami
|
||||
ncx2
|
||||
ncf
|
||||
t
|
||||
nct
|
||||
pareto
|
||||
powerlaw
|
||||
powerlognorm
|
||||
powernorm
|
||||
rdist
|
||||
reciprocal
|
||||
rayleigh
|
||||
rice
|
||||
recipinvgauss
|
||||
semicircular
|
||||
triang
|
||||
truncexpon
|
||||
truncnorm
|
||||
tukeylambda
|
||||
uniform
|
||||
von_mises
|
||||
wald
|
||||
weibull_min
|
||||
weibull_max
|
||||
wrapcauchy
|
||||
ksone
|
||||
kstwobign
|
||||
|
||||
Discrete distributions
|
||||
======================
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
binom
|
||||
bernoulli
|
||||
nbinom
|
||||
geom
|
||||
hypergeom
|
||||
logser
|
||||
poisson
|
||||
planck
|
||||
boltzmann
|
||||
randint
|
||||
zipf
|
||||
dlaplace
|
||||
|
||||
Statistical functions
|
||||
=====================
|
||||
|
||||
Several of these functions have a similar version in scipy.stats.mstats
|
||||
which work for masked arrays.
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
gmean
|
||||
hmean
|
||||
mean
|
||||
cmedian
|
||||
median
|
||||
mode
|
||||
tmean
|
||||
tvar
|
||||
tmin
|
||||
tmax
|
||||
tstd
|
||||
tsem
|
||||
moment
|
||||
variation
|
||||
skew
|
||||
kurtosis
|
||||
describe
|
||||
skewtest
|
||||
kurtosistest
|
||||
normaltest
|
||||
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
itemfreq
|
||||
scoreatpercentile
|
||||
percentileofscore
|
||||
histogram2
|
||||
histogram
|
||||
cumfreq
|
||||
relfreq
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
obrientransform
|
||||
samplevar
|
||||
samplestd
|
||||
signaltonoise
|
||||
bayes_mvs
|
||||
var
|
||||
std
|
||||
stderr
|
||||
sem
|
||||
z
|
||||
zs
|
||||
zmap
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
threshold
|
||||
trimboth
|
||||
trim1
|
||||
cov
|
||||
corrcoef
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
f_oneway
|
||||
pearsonr
|
||||
spearmanr
|
||||
pointbiserialr
|
||||
kendalltau
|
||||
linregress
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
ttest_1samp
|
||||
ttest_ind
|
||||
ttest_rel
|
||||
kstest
|
||||
chisquare
|
||||
ks_2samp
|
||||
mannwhitneyu
|
||||
tiecorrect
|
||||
ranksums
|
||||
wilcoxon
|
||||
kruskal
|
||||
friedmanchisquare
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
ansari
|
||||
bartlett
|
||||
levene
|
||||
shapiro
|
||||
anderson
|
||||
binom_test
|
||||
fligner
|
||||
mood
|
||||
oneway
|
||||
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
glm
|
||||
anova
|
||||
|
||||
Plot-tests
|
||||
==========
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
probplot
|
||||
ppcc_max
|
||||
ppcc_plot
|
||||
|
||||
|
||||
Masked statistics functions
|
||||
===========================
|
||||
|
||||
.. toctree::
|
||||
|
||||
stats.mstats
|
||||
|
||||
|
||||
Univariate and multivariate kernel density estimation (:mod:`scipy.stats.kde`)
|
||||
==============================================================================
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
gaussian_kde
|
||||
|
||||
For many more stat related functions install the software R and the
|
||||
interface package rpy.
|
302
pythonPackages/scipy-0.8.0/doc/source/tutorial/basic.rst
Executable file
302
pythonPackages/scipy-0.8.0/doc/source/tutorial/basic.rst
Executable file
|
@ -0,0 +1,302 @@
|
|||
Basic functions in Numpy (and top-level scipy)
|
||||
==============================================
|
||||
|
||||
.. sectionauthor:: Travis E. Oliphant
|
||||
|
||||
.. currentmodule:: numpy
|
||||
|
||||
.. contents::
|
||||
|
||||
Interaction with Numpy
|
||||
------------------------
|
||||
|
||||
To begin with, all of the Numpy functions have been subsumed into the
|
||||
:mod:`scipy` namespace so that all of those functions are available
|
||||
without additionally importing Numpy. In addition, the universal
|
||||
functions (addition, subtraction, division) have been altered to not
|
||||
raise exceptions if floating-point errors are encountered; instead,
|
||||
NaN's and Inf's are returned in the arrays. To assist in detection of
|
||||
these events, several functions (:func:`sp.isnan`, :func:`sp.isfinite`,
|
||||
:func:`sp.isinf`) are available.
|
||||
|
||||
Finally, some of the basic functions like log, sqrt, and inverse trig
|
||||
functions have been modified to return complex numbers instead of
|
||||
NaN's where appropriate (*i.e.* ``sp.sqrt(-1)`` returns ``1j``).
|
||||
|
||||
|
||||
Top-level scipy routines
|
||||
------------------------
|
||||
|
||||
The purpose of the top level of scipy is to collect general-purpose
|
||||
routines that the other sub-packages can use and to provide a simple
|
||||
replacement for Numpy. Anytime you might think to import Numpy, you
|
||||
can import scipy instead and remove yourself from direct dependence on
|
||||
Numpy. These routines are divided into several files for
|
||||
organizational purposes, but they are all available under the numpy
|
||||
namespace (and the scipy namespace). There are routines for type
|
||||
handling and type checking, shape and matrix manipulation, polynomial
|
||||
processing, and other useful functions. Rather than giving a detailed
|
||||
description of each of these functions (which is available in the
|
||||
Numpy Reference Guide or by using the :func:`help`, :func:`info` and
|
||||
:func:`source` commands), this tutorial will discuss some of the more
|
||||
useful commands which require a little introduction to use to their
|
||||
full potential.
|
||||
|
||||
|
||||
Type handling
|
||||
^^^^^^^^^^^^^
|
||||
|
||||
Note the difference between :func:`sp.iscomplex`/:func:`sp.isreal` and
|
||||
:func:`sp.iscomplexobj`/:func:`sp.isrealobj`. The former command is
|
||||
array based and returns byte arrays of ones and zeros providing the
|
||||
result of the element-wise test. The latter command is object based
|
||||
and returns a scalar describing the result of the test on the entire
|
||||
object.
|
||||
|
||||
Often it is required to get just the real and/or imaginary part of a
|
||||
complex number. While complex numbers and arrays have attributes that
|
||||
return those values, if one is not sure whether or not the object will
|
||||
be complex-valued, it is better to use the functional forms
|
||||
:func:`sp.real` and :func:`sp.imag` . These functions succeed for anything
|
||||
that can be turned into a Numpy array. Consider also the function
|
||||
:func:`sp.real_if_close` which transforms a complex-valued number with
|
||||
tiny imaginary part into a real number.
|
||||
|
||||
Occasionally the need to check whether or not a number is a scalar
|
||||
(Python (long)int, Python float, Python complex, or rank-0 array)
|
||||
occurs in coding. This functionality is provided in the convenient
|
||||
function :func:`sp.isscalar` which returns a 1 or a 0.
|
||||
|
||||
Finally, ensuring that objects are a certain Numpy type occurs often
|
||||
enough that it has been given a convenient interface in SciPy through
|
||||
the use of the :obj:`sp.cast` dictionary. The dictionary is keyed by the
|
||||
type it is desired to cast to and the dictionary stores functions to
|
||||
perform the casting. Thus, ``sp.cast['f'](d)`` returns an array
|
||||
of :class:`sp.float32` from *d*. This function is also useful as an easy
|
||||
way to get a scalar of a certain type::
|
||||
|
||||
>>> sp.cast['f'](sp.pi)
|
||||
array(3.1415927410125732, dtype=float32)
|
||||
|
||||
Index Tricks
|
||||
^^^^^^^^^^^^
|
||||
|
||||
There are some class instances that make special use of the slicing
|
||||
functionality to provide efficient means for array construction. This
|
||||
part will discuss the operation of :obj:`sp.mgrid` , :obj:`sp.ogrid` ,
|
||||
:obj:`sp.r_` , and :obj:`sp.c_` for quickly constructing arrays.
|
||||
|
||||
One familiar with Matlab may complain that it is difficult to
|
||||
construct arrays from the interactive session with Python. Suppose,
|
||||
for example that one wants to construct an array that begins with 3
|
||||
followed by 5 zeros and then contains 10 numbers spanning the range -1
|
||||
to 1 (inclusive on both ends). Before SciPy, you would need to enter
|
||||
something like the following
|
||||
|
||||
>>> concatenate(([3],[0]*5,arange(-1,1.002,2/9.0)))
|
||||
|
||||
With the :obj:`r_` command one can enter this as
|
||||
|
||||
>>> r_[3,[0]*5,-1:1:10j]
|
||||
|
||||
which can ease typing and make for more readable code. Notice how
|
||||
objects are concatenated, and the slicing syntax is (ab)used to
|
||||
construct ranges. The other term that deserves a little explanation is
|
||||
the use of the complex number 10j as the step size in the slicing
|
||||
syntax. This non-standard use allows the number to be interpreted as
|
||||
the number of points to produce in the range rather than as a step
|
||||
size (note we would have used the long integer notation, 10L, but this
|
||||
notation may go away in Python as the integers become unified). This
|
||||
non-standard usage may be unsightly to some, but it gives the user the
|
||||
ability to quickly construct complicated vectors in a very readable
|
||||
fashion. When the number of points is specified in this way, the end-
|
||||
point is inclusive.
|
||||
|
||||
The "r" stands for row concatenation because if the objects between
|
||||
commas are 2 dimensional arrays, they are stacked by rows (and thus
|
||||
must have commensurate columns). There is an equivalent command
|
||||
:obj:`c_` that stacks 2d arrays by columns but works identically to
|
||||
:obj:`r_` for 1d arrays.
|
||||
|
||||
Another very useful class instance which makes use of extended slicing
|
||||
notation is the function :obj:`mgrid`. In the simplest case, this
|
||||
function can be used to construct 1d ranges as a convenient substitute
|
||||
for arange. It also allows the use of complex-numbers in the step-size
|
||||
to indicate the number of points to place between the (inclusive)
|
||||
end-points. The real purpose of this function however is to produce N,
|
||||
N-d arrays which provide coordinate arrays for an N-dimensional
|
||||
volume. The easiest way to understand this is with an example of its
|
||||
usage:
|
||||
|
||||
>>> mgrid[0:5,0:5]
|
||||
array([[[0, 0, 0, 0, 0],
|
||||
[1, 1, 1, 1, 1],
|
||||
[2, 2, 2, 2, 2],
|
||||
[3, 3, 3, 3, 3],
|
||||
[4, 4, 4, 4, 4]],
|
||||
[[0, 1, 2, 3, 4],
|
||||
[0, 1, 2, 3, 4],
|
||||
[0, 1, 2, 3, 4],
|
||||
[0, 1, 2, 3, 4],
|
||||
[0, 1, 2, 3, 4]]])
|
||||
>>> mgrid[0:5:4j,0:5:4j]
|
||||
array([[[ 0. , 0. , 0. , 0. ],
|
||||
[ 1.6667, 1.6667, 1.6667, 1.6667],
|
||||
[ 3.3333, 3.3333, 3.3333, 3.3333],
|
||||
[ 5. , 5. , 5. , 5. ]],
|
||||
[[ 0. , 1.6667, 3.3333, 5. ],
|
||||
[ 0. , 1.6667, 3.3333, 5. ],
|
||||
[ 0. , 1.6667, 3.3333, 5. ],
|
||||
[ 0. , 1.6667, 3.3333, 5. ]]])
|
||||
|
||||
Having meshed arrays like this is sometimes very useful. However, it
|
||||
is not always needed just to evaluate some N-dimensional function over
|
||||
a grid due to the array-broadcasting rules of Numpy and SciPy. If this
|
||||
is the only purpose for generating a meshgrid, you should instead use
|
||||
the function :obj:`ogrid` which generates an "open "grid using NewAxis
|
||||
judiciously to create N, N-d arrays where only one dimension in each
|
||||
array has length greater than 1. This will save memory and create the
|
||||
same result if the only purpose for the meshgrid is to generate sample
|
||||
points for evaluation of an N-d function.
|
||||
|
||||
|
||||
Shape manipulation
|
||||
^^^^^^^^^^^^^^^^^^
|
||||
|
||||
In this category of functions are routines for squeezing out length-
|
||||
one dimensions from N-dimensional arrays, ensuring that an array is at
|
||||
least 1-, 2-, or 3-dimensional, and stacking (concatenating) arrays by
|
||||
rows, columns, and "pages "(in the third dimension). Routines for
|
||||
splitting arrays (roughly the opposite of stacking arrays) are also
|
||||
available.
|
||||
|
||||
|
||||
Polynomials
|
||||
^^^^^^^^^^^
|
||||
|
||||
There are two (interchangeable) ways to deal with 1-d polynomials in
|
||||
SciPy. The first is to use the :class:`poly1d` class from Numpy. This
|
||||
class accepts coefficients or polynomial roots to initialize a
|
||||
polynomial. The polynomial object can then be manipulated in algebraic
|
||||
expressions, integrated, differentiated, and evaluated. It even prints
|
||||
like a polynomial:
|
||||
|
||||
>>> p = poly1d([3,4,5])
|
||||
>>> print p
|
||||
2
|
||||
3 x + 4 x + 5
|
||||
>>> print p*p
|
||||
4 3 2
|
||||
9 x + 24 x + 46 x + 40 x + 25
|
||||
>>> print p.integ(k=6)
|
||||
3 2
|
||||
x + 2 x + 5 x + 6
|
||||
>>> print p.deriv()
|
||||
6 x + 4
|
||||
>>> p([4,5])
|
||||
array([ 69, 100])
|
||||
|
||||
The other way to handle polynomials is as an array of coefficients
|
||||
with the first element of the array giving the coefficient of the
|
||||
highest power. There are explicit functions to add, subtract,
|
||||
multiply, divide, integrate, differentiate, and evaluate polynomials
|
||||
represented as sequences of coefficients.
|
||||
|
||||
|
||||
Vectorizing functions (vectorize)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
One of the features that NumPy provides is a class :obj:`vectorize` to
|
||||
convert an ordinary Python function which accepts scalars and returns
|
||||
scalars into a "vectorized-function" with the same broadcasting rules
|
||||
as other Numpy functions (*i.e.* the Universal functions, or
|
||||
ufuncs). For example, suppose you have a Python function named
|
||||
:obj:`addsubtract` defined as:
|
||||
|
||||
>>> def addsubtract(a,b):
|
||||
... if a > b:
|
||||
... return a - b
|
||||
... else:
|
||||
... return a + b
|
||||
|
||||
which defines a function of two scalar variables and returns a scalar
|
||||
result. The class vectorize can be used to "vectorize "this function so that ::
|
||||
|
||||
>>> vec_addsubtract = vectorize(addsubtract)
|
||||
|
||||
returns a function which takes array arguments and returns an array
|
||||
result:
|
||||
|
||||
>>> vec_addsubtract([0,3,6,9],[1,3,5,7])
|
||||
array([1, 6, 1, 2])
|
||||
|
||||
This particular function could have been written in vector form
|
||||
without the use of :obj:`vectorize` . But, what if the function you have written is the result of some
|
||||
optimization or integration routine. Such functions can likely only be
|
||||
vectorized using ``vectorize.``
|
||||
|
||||
|
||||
Other useful functions
|
||||
^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
There are several other functions in the scipy_base package including
|
||||
most of the other functions that are also in the Numpy package. The
|
||||
reason for duplicating these functions is to allow SciPy to
|
||||
potentially alter their original interface and make it easier for
|
||||
users to know how to get access to functions
|
||||
|
||||
>>> from scipy import *
|
||||
|
||||
Functions which should be mentioned are :obj:`mod(x,y)` which can
|
||||
replace ``x % y`` when it is desired that the result take the sign of
|
||||
*y* instead of *x* . Also included is :obj:`fix` which always rounds
|
||||
to the nearest integer towards zero. For doing phase processing, the
|
||||
functions :func:`angle`, and :obj:`unwrap` are also useful. Also, the
|
||||
:obj:`linspace` and :obj:`logspace` functions return equally spaced samples
|
||||
in a linear or log scale. Finally, it's useful to be aware of the indexing
|
||||
capabilities of Numpy. Mention should be made of the new
|
||||
function :obj:`select` which extends the functionality of :obj:`where` to
|
||||
include multiple conditions and multiple choices. The calling
|
||||
convention is ``select(condlist,choicelist,default=0).`` :obj:`select` is
|
||||
a vectorized form of the multiple if-statement. It allows rapid
|
||||
construction of a function which returns an array of results based on
|
||||
a list of conditions. Each element of the return array is taken from
|
||||
the array in a ``choicelist`` corresponding to the first condition in
|
||||
``condlist`` that is true. For example
|
||||
|
||||
>>> x = r_[-2:3]
|
||||
>>> x
|
||||
array([-2, -1, 0, 1, 2])
|
||||
>>> select([x > 3, x >= 0],[0,x+2])
|
||||
array([0, 0, 2, 3, 4])
|
||||
|
||||
|
||||
Common functions
|
||||
----------------
|
||||
|
||||
Some functions depend on sub-packages of SciPy but should be available
|
||||
from the top-level of SciPy due to their common use. These are
|
||||
functions that might have been placed in scipy_base except for their
|
||||
dependence on other sub-packages of SciPy. For example the
|
||||
:obj:`factorial` and :obj:`comb` functions compute :math:`n!` and
|
||||
:math:`n!/k!(n-k)!` using either exact integer arithmetic (thanks to
|
||||
Python's Long integer object), or by using floating-point precision
|
||||
and the gamma function. The functions :obj:`rand` and :obj:`randn`
|
||||
are used so often that they warranted a place at the top level. There
|
||||
are convenience functions for the interactive use: :obj:`disp`
|
||||
(similar to print), and :obj:`who` (returns a list of defined
|
||||
variables and memory consumption--upper bounded). Another function
|
||||
returns a common image used in image processing: :obj:`lena`.
|
||||
|
||||
Finally, two functions are provided that are useful for approximating
|
||||
derivatives of functions using discrete-differences. The function
|
||||
:obj:`central_diff_weights` returns weighting coefficients for an
|
||||
equally-spaced :math:`N`-point approximation to the derivative of
|
||||
order *o*. These weights must be multiplied by the function
|
||||
corresponding to these points and the results added to obtain the
|
||||
derivative approximation. This function is intended for use when only
|
||||
samples of the function are avaiable. When the function is an object
|
||||
that can be handed to a routine and evaluated, the function
|
||||
:obj:`derivative` can be used to automatically evaluate the object at
|
||||
the correct points to obtain an N-point approximation to the *o*-th
|
||||
derivative at a given point.
|
55
pythonPackages/scipy-0.8.0/doc/source/tutorial/examples/1-1
Executable file
55
pythonPackages/scipy-0.8.0/doc/source/tutorial/examples/1-1
Executable file
|
@ -0,0 +1,55 @@
|
|||
>>> sp.info(optimize.fmin)
|
||||
fmin(func, x0, args=(), xtol=0.0001, ftol=0.0001, maxiter=None, maxfun=None,
|
||||
full_output=0, disp=1, retall=0, callback=None)
|
||||
|
||||
Minimize a function using the downhill simplex algorithm.
|
||||
|
||||
:Parameters:
|
||||
|
||||
func : callable func(x,*args)
|
||||
The objective function to be minimized.
|
||||
x0 : ndarray
|
||||
Initial guess.
|
||||
args : tuple
|
||||
Extra arguments passed to func, i.e. ``f(x,*args)``.
|
||||
callback : callable
|
||||
Called after each iteration, as callback(xk), where xk is the
|
||||
current parameter vector.
|
||||
|
||||
:Returns: (xopt, {fopt, iter, funcalls, warnflag})
|
||||
|
||||
xopt : ndarray
|
||||
Parameter that minimizes function.
|
||||
fopt : float
|
||||
Value of function at minimum: ``fopt = func(xopt)``.
|
||||
iter : int
|
||||
Number of iterations performed.
|
||||
funcalls : int
|
||||
Number of function calls made.
|
||||
warnflag : int
|
||||
1 : Maximum number of function evaluations made.
|
||||
2 : Maximum number of iterations reached.
|
||||
allvecs : list
|
||||
Solution at each iteration.
|
||||
|
||||
*Other Parameters*:
|
||||
|
||||
xtol : float
|
||||
Relative error in xopt acceptable for convergence.
|
||||
ftol : number
|
||||
Relative error in func(xopt) acceptable for convergence.
|
||||
maxiter : int
|
||||
Maximum number of iterations to perform.
|
||||
maxfun : number
|
||||
Maximum number of function evaluations to make.
|
||||
full_output : bool
|
||||
Set to True if fval and warnflag outputs are desired.
|
||||
disp : bool
|
||||
Set to True to print convergence messages.
|
||||
retall : bool
|
||||
Set to True to return list of solutions at each iteration.
|
||||
|
||||
:Notes:
|
||||
|
||||
Uses a Nelder-Mead simplex algorithm to find the minimum of
|
||||
function of one or more variables.
|
25
pythonPackages/scipy-0.8.0/doc/source/tutorial/examples/4-1
Executable file
25
pythonPackages/scipy-0.8.0/doc/source/tutorial/examples/4-1
Executable file
|
@ -0,0 +1,25 @@
|
|||
>>> help(integrate)
|
||||
Methods for Integrating Functions given function object.
|
||||
|
||||
quad -- General purpose integration.
|
||||
dblquad -- General purpose double integration.
|
||||
tplquad -- General purpose triple integration.
|
||||
fixed_quad -- Integrate func(x) using Gaussian quadrature of order n.
|
||||
quadrature -- Integrate with given tolerance using Gaussian quadrature.
|
||||
romberg -- Integrate func using Romberg integration.
|
||||
|
||||
Methods for Integrating Functions given fixed samples.
|
||||
|
||||
trapz -- Use trapezoidal rule to compute integral from samples.
|
||||
cumtrapz -- Use trapezoidal rule to cumulatively compute integral.
|
||||
simps -- Use Simpson's rule to compute integral from samples.
|
||||
romb -- Use Romberg Integration to compute integral from
|
||||
(2**k + 1) evenly-spaced samples.
|
||||
|
||||
See the special module's orthogonal polynomials (special) for Gaussian
|
||||
quadrature roots and weights for other weighting factors and regions.
|
||||
|
||||
Interface to numerical integrators of ODE systems.
|
||||
|
||||
odeint -- General integration of ordinary differential equations.
|
||||
ode -- Integrate ODE using VODE and ZVODE routines.
|
91
pythonPackages/scipy-0.8.0/doc/source/tutorial/examples/5-1
Executable file
91
pythonPackages/scipy-0.8.0/doc/source/tutorial/examples/5-1
Executable file
|
@ -0,0 +1,91 @@
|
|||
from scipy import optimize
|
||||
>>> info(optimize)
|
||||
Optimization Tools
|
||||
==================
|
||||
|
||||
A collection of general-purpose optimization routines.
|
||||
|
||||
fmin -- Nelder-Mead Simplex algorithm
|
||||
(uses only function calls)
|
||||
fmin_powell -- Powell's (modified) level set method (uses only
|
||||
function calls)
|
||||
fmin_cg -- Non-linear (Polak-Ribiere) conjugate gradient algorithm
|
||||
(can use function and gradient).
|
||||
fmin_bfgs -- Quasi-Newton method (Broydon-Fletcher-Goldfarb-Shanno);
|
||||
(can use function and gradient)
|
||||
fmin_ncg -- Line-search Newton Conjugate Gradient (can use
|
||||
function, gradient and Hessian).
|
||||
leastsq -- Minimize the sum of squares of M equations in
|
||||
N unknowns given a starting estimate.
|
||||
|
||||
|
||||
Constrained Optimizers (multivariate)
|
||||
|
||||
fmin_l_bfgs_b -- Zhu, Byrd, and Nocedal's L-BFGS-B constrained optimizer
|
||||
(if you use this please quote their papers -- see help)
|
||||
|
||||
fmin_tnc -- Truncated Newton Code originally written by Stephen Nash and
|
||||
adapted to C by Jean-Sebastien Roy.
|
||||
|
||||
fmin_cobyla -- Constrained Optimization BY Linear Approximation
|
||||
|
||||
|
||||
Global Optimizers
|
||||
|
||||
anneal -- Simulated Annealing
|
||||
brute -- Brute force searching optimizer
|
||||
|
||||
|
||||
Scalar function minimizers
|
||||
|
||||
fminbound -- Bounded minimization of a scalar function.
|
||||
brent -- 1-D function minimization using Brent method.
|
||||
golden -- 1-D function minimization using Golden Section method
|
||||
bracket -- Bracket a minimum (given two starting points)
|
||||
|
||||
|
||||
Also a collection of general-purpose root-finding routines.
|
||||
|
||||
fsolve -- Non-linear multi-variable equation solver.
|
||||
|
||||
|
||||
Scalar function solvers
|
||||
|
||||
brentq -- quadratic interpolation Brent method
|
||||
brenth -- Brent method (modified by Harris with hyperbolic
|
||||
extrapolation)
|
||||
ridder -- Ridder's method
|
||||
bisect -- Bisection method
|
||||
newton -- Secant method or Newton's method
|
||||
|
||||
fixed_point -- Single-variable fixed-point solver.
|
||||
|
||||
A collection of general-purpose nonlinear multidimensional solvers.
|
||||
|
||||
broyden1 -- Broyden's first method - is a quasi-Newton-Raphson
|
||||
method for updating an approximate Jacobian and then
|
||||
inverting it
|
||||
broyden2 -- Broyden's second method - the same as broyden1, but
|
||||
updates the inverse Jacobian directly
|
||||
broyden3 -- Broyden's second method - the same as broyden2, but
|
||||
instead of directly computing the inverse Jacobian,
|
||||
it remembers how to construct it using vectors, and
|
||||
when computing inv(J)*F, it uses those vectors to
|
||||
compute this product, thus avoding the expensive NxN
|
||||
matrix multiplication.
|
||||
broyden_generalized -- Generalized Broyden's method, the same as broyden2,
|
||||
but instead of approximating the full NxN Jacobian,
|
||||
it construct it at every iteration in a way that
|
||||
avoids the NxN matrix multiplication. This is not
|
||||
as precise as broyden3.
|
||||
anderson -- extended Anderson method, the same as the
|
||||
broyden_generalized, but added w_0^2*I to before
|
||||
taking inversion to improve the stability
|
||||
anderson2 -- the Anderson method, the same as anderson, but
|
||||
formulated differently
|
||||
|
||||
Utility Functions
|
||||
|
||||
line_search -- Return a step that satisfies the strong Wolfe conditions.
|
||||
check_grad -- Check the supplied derivative using finite difference
|
||||
techniques.
|
45
pythonPackages/scipy-0.8.0/doc/source/tutorial/examples/normdiscr_plot1.py
Executable file
45
pythonPackages/scipy-0.8.0/doc/source/tutorial/examples/normdiscr_plot1.py
Executable file
|
@ -0,0 +1,45 @@
|
|||
import numpy as np
|
||||
import matplotlib.pyplot as plt
|
||||
from scipy import stats
|
||||
|
||||
npoints = 20 # number of integer support points of the distribution minus 1
|
||||
npointsh = npoints / 2
|
||||
npointsf = float(npoints)
|
||||
nbound = 4 #bounds for the truncated normal
|
||||
normbound = (1 + 1 / npointsf) * nbound #actual bounds of truncated normal
|
||||
grid = np.arange(-npointsh, npointsh+2, 1) #integer grid
|
||||
gridlimitsnorm = (grid-0.5) / npointsh * nbound #bin limits for the truncnorm
|
||||
gridlimits = grid - 0.5
|
||||
grid = grid[:-1]
|
||||
probs = np.diff(stats.truncnorm.cdf(gridlimitsnorm, -normbound, normbound))
|
||||
gridint = grid
|
||||
normdiscrete = stats.rv_discrete(
|
||||
values=(gridint, np.round(probs, decimals=7)),
|
||||
name='normdiscrete')
|
||||
|
||||
|
||||
n_sample = 500
|
||||
np.random.seed(87655678) #fix the seed for replicability
|
||||
rvs = normdiscrete.rvs(size=n_sample)
|
||||
rvsnd=rvs
|
||||
f,l = np.histogram(rvs, bins=gridlimits)
|
||||
sfreq = np.vstack([gridint, f, probs*n_sample]).T
|
||||
fs = sfreq[:,1] / float(n_sample)
|
||||
ft = sfreq[:,2] / float(n_sample)
|
||||
nd_std = np.sqrt(normdiscrete.stats(moments='v'))
|
||||
|
||||
ind = gridint # the x locations for the groups
|
||||
width = 0.35 # the width of the bars
|
||||
|
||||
plt.subplot(111)
|
||||
rects1 = plt.bar(ind, ft, width, color='b')
|
||||
rects2 = plt.bar(ind+width, fs, width, color='r')
|
||||
normline = plt.plot(ind+width/2.0, stats.norm.pdf(ind, scale=nd_std),
|
||||
color='b')
|
||||
|
||||
plt.ylabel('Frequency')
|
||||
plt.title('Frequency and Probability of normdiscrete')
|
||||
plt.xticks(ind+width, ind )
|
||||
plt.legend((rects1[0], rects2[0]), ('true', 'sample'))
|
||||
|
||||
plt.show()
|
48
pythonPackages/scipy-0.8.0/doc/source/tutorial/examples/normdiscr_plot2.py
Executable file
48
pythonPackages/scipy-0.8.0/doc/source/tutorial/examples/normdiscr_plot2.py
Executable file
|
@ -0,0 +1,48 @@
|
|||
import numpy as np
|
||||
import matplotlib.pyplot as plt
|
||||
from scipy import stats
|
||||
|
||||
npoints = 20 # number of integer support points of the distribution minus 1
|
||||
npointsh = npoints / 2
|
||||
npointsf = float(npoints)
|
||||
nbound = 4 #bounds for the truncated normal
|
||||
normbound = (1 + 1 / npointsf) * nbound #actual bounds of truncated normal
|
||||
grid = np.arange(-npointsh, npointsh+2,1) #integer grid
|
||||
gridlimitsnorm = (grid - 0.5) / npointsh * nbound #bin limits for the truncnorm
|
||||
gridlimits = grid - 0.5
|
||||
grid = grid[:-1]
|
||||
probs = np.diff(stats.truncnorm.cdf(gridlimitsnorm, -normbound, normbound))
|
||||
gridint = grid
|
||||
normdiscrete = stats.rv_discrete(
|
||||
values=(gridint, np.round(probs, decimals=7)),
|
||||
name='normdiscrete')
|
||||
|
||||
n_sample = 500
|
||||
np.random.seed(87655678) #fix the seed for replicability
|
||||
rvs = normdiscrete.rvs(size=n_sample)
|
||||
rvsnd = rvs
|
||||
f,l = np.histogram(rvs,bins=gridlimits)
|
||||
sfreq = np.vstack([gridint,f,probs*n_sample]).T
|
||||
fs = sfreq[:,1] / float(n_sample)
|
||||
ft = sfreq[:,2] / float(n_sample)
|
||||
fs = sfreq[:,1].cumsum() / float(n_sample)
|
||||
ft = sfreq[:,2].cumsum() / float(n_sample)
|
||||
nd_std = np.sqrt(normdiscrete.stats(moments='v'))
|
||||
|
||||
|
||||
ind = gridint # the x locations for the groups
|
||||
width = 0.35 # the width of the bars
|
||||
|
||||
plt.figure()
|
||||
plt.subplot(111)
|
||||
rects1 = plt.bar(ind, ft, width, color='b')
|
||||
rects2 = plt.bar(ind+width, fs, width, color='r')
|
||||
normline = plt.plot(ind+width/2.0, stats.norm.cdf(ind+0.5,scale=nd_std),
|
||||
color='b')
|
||||
|
||||
plt.ylabel('cdf')
|
||||
plt.title('Cumulative Frequency and CDF of normdiscrete')
|
||||
plt.xticks(ind+width, ind )
|
||||
plt.legend( (rects1[0], rects2[0]), ('true', 'sample') )
|
||||
|
||||
plt.show()
|
145
pythonPackages/scipy-0.8.0/doc/source/tutorial/fftpack.rst
Executable file
145
pythonPackages/scipy-0.8.0/doc/source/tutorial/fftpack.rst
Executable file
|
@ -0,0 +1,145 @@
|
|||
Fourier Transforms (:mod:`scipy.fftpack`)
|
||||
=========================================
|
||||
|
||||
.. sectionauthor:: Scipy Developers
|
||||
|
||||
.. currentmodule:: scipy.fftpack
|
||||
|
||||
.. warning::
|
||||
|
||||
This is currently a stub page
|
||||
|
||||
|
||||
.. contents::
|
||||
|
||||
|
||||
Fourier analysis is fundamentally a method for expressing a function as a
|
||||
sum of periodic components, and for recovering the signal from those
|
||||
components. When both the function and its Fourier transform are
|
||||
replaced with discretized counterparts, it is called the discrete Fourier
|
||||
transform (DFT). The DFT has become a mainstay of numerical computing in
|
||||
part because of a very fast algorithm for computing it, called the Fast
|
||||
Fourier Transform (FFT), which was known to Gauss (1805) and was brought
|
||||
to light in its current form by Cooley and Tukey [CT]_. Press et al. [NR]_
|
||||
provide an accessible introduction to Fourier analysis and its
|
||||
applications.
|
||||
|
||||
|
||||
Fast Fourier transforms
|
||||
-----------------------
|
||||
|
||||
One dimensional discrete Fourier transforms
|
||||
-------------------------------------------
|
||||
|
||||
fft, ifft, rfft, irfft
|
||||
|
||||
|
||||
Two and n dimensional discrete Fourier transforms
|
||||
-------------------------------------------------
|
||||
|
||||
fft in more than one dimension
|
||||
|
||||
|
||||
Discrete Cosine Transforms
|
||||
--------------------------
|
||||
|
||||
|
||||
Return the Discrete Cosine Transform [Mak]_ of arbitrary type sequence ``x``.
|
||||
|
||||
For a single dimension array ``x``, ``dct(x, norm='ortho')`` is equal to
|
||||
matlab ``dct(x)``.
|
||||
|
||||
There are theoretically 8 types of the DCT [WP]_, only the first 3 types are
|
||||
implemented in scipy. 'The' DCT generally refers to DCT type 2, and 'the'
|
||||
Inverse DCT generally refers to DCT type 3.
|
||||
|
||||
type I
|
||||
~~~~~~
|
||||
|
||||
There are several definitions of the DCT-I; we use the following
|
||||
(for ``norm=None``):
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ y_k = x_0 + (-1)^k x_{N-1} + 2\sum_{n=1}^{N-2} x_n
|
||||
\cos\left({\pi nk\over N-1}\right),
|
||||
\qquad 0 \le k < N. \]
|
||||
|
||||
Only None is supported as normalization mode for DCT-I. Note also that the
|
||||
DCT-I is only supported for input size > 1
|
||||
|
||||
type II
|
||||
~~~~~~~
|
||||
|
||||
There are several definitions of the DCT-II; we use the following
|
||||
(for ``norm=None``):
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ y_k = 2 \sum_{n=0}^{N-1} x_n
|
||||
\cos \left({\pi(2n+1)k \over 2N} \right)
|
||||
\qquad 0 \le k < N.\]
|
||||
|
||||
If ``norm='ortho'``, :math:`y_k` is multiplied by a scaling factor `f`:
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[f = \begin{cases} \sqrt{1/(4N)}, & \text{if $k = 0$} \\
|
||||
\sqrt{1/(2N)}, & \text{otherwise} \end{cases} \]
|
||||
|
||||
|
||||
Which makes the corresponding matrix of coefficients orthonormal
|
||||
(`OO' = Id`).
|
||||
|
||||
type III
|
||||
~~~~~~~~
|
||||
|
||||
There are several definitions, we use the following
|
||||
(for ``norm=None``):
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ y_k = x_0 + 2 \sum_{n=1}^{N-1} x_n
|
||||
\cos\left({\pi n(2k+1) \over 2N}\right)
|
||||
\qquad 0 \le k < N,\]
|
||||
|
||||
or, for ``norm='ortho'``:
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ y_k = {x_0\over\sqrt{N}} + {1\over\sqrt{N}} \sum_{n=1}^{N-1}
|
||||
x_n \cos\left({\pi n(2k+1) \over 2N}\right)
|
||||
\qquad 0 \le k < N.\]
|
||||
|
||||
The (unnormalized) DCT-III is the inverse of the (unnormalized) DCT-II, up
|
||||
to a factor `2N`. The orthonormalized DCT-III is exactly the inverse of the
|
||||
orthonormalized DCT-II.
|
||||
|
||||
References
|
||||
~~~~~~~~~~
|
||||
|
||||
.. [CT] Cooley, James W., and John W. Tukey, 1965, "An algorithm for the
|
||||
machine calculation of complex Fourier series," *Math. Comput.*
|
||||
19: 297-301.
|
||||
|
||||
.. [NR] Press, W., Teukolsky, S., Vetterline, W.T., and Flannery, B.P.,
|
||||
2007, *Numerical Recipes: The Art of Scientific Computing*, ch.
|
||||
12-13. Cambridge Univ. Press, Cambridge, UK.
|
||||
|
||||
.. [Mak] J. Makhoul, 1980, 'A Fast Cosine Transform in One and Two Dimensions',
|
||||
`IEEE Transactions on acoustics, speech and signal processing`
|
||||
vol. 28(1), pp. 27-34, http://dx.doi.org/10.1109/TASSP.1980.1163351
|
||||
|
||||
.. [WP] http://en.wikipedia.org/wiki/Discrete_cosine_transform
|
||||
|
||||
|
||||
FFT convolution
|
||||
---------------
|
||||
|
||||
scipy.fftpack.convolve performs a convolution of two one-dimensional
|
||||
arrays in frequency domain.
|
129
pythonPackages/scipy-0.8.0/doc/source/tutorial/general.rst
Executable file
129
pythonPackages/scipy-0.8.0/doc/source/tutorial/general.rst
Executable file
|
@ -0,0 +1,129 @@
|
|||
============
|
||||
Introduction
|
||||
============
|
||||
|
||||
.. contents::
|
||||
|
||||
SciPy is a collection of mathematical algorithms and convenience
|
||||
functions built on the Numpy extension for Python. It adds
|
||||
significant power to the interactive Python session by exposing the
|
||||
user to high-level commands and classes for the manipulation and
|
||||
visualization of data. With SciPy, an interactive Python session
|
||||
becomes a data-processing and system-prototyping environment rivaling
|
||||
sytems such as Matlab, IDL, Octave, R-Lab, and SciLab.
|
||||
|
||||
The additional power of using SciPy within Python, however, is that a
|
||||
powerful programming language is also available for use in developing
|
||||
sophisticated programs and specialized applications. Scientific
|
||||
applications written in SciPy benefit from the development of
|
||||
additional modules in numerous niche's of the software landscape by
|
||||
developers across the world. Everything from parallel programming to
|
||||
web and data-base subroutines and classes have been made available to
|
||||
the Python programmer. All of this power is available in addition to
|
||||
the mathematical libraries in SciPy.
|
||||
|
||||
This document provides a tutorial for the first-time user of SciPy to
|
||||
help get started with some of the features available in this powerful
|
||||
package. It is assumed that the user has already installed the
|
||||
package. Some general Python facility is also assumed such as could be
|
||||
acquired by working through the Tutorial in the Python distribution.
|
||||
For further introductory help the user is directed to the Numpy
|
||||
documentation.
|
||||
|
||||
For brevity and convenience, we will often assume that the main
|
||||
packages (numpy, scipy, and matplotlib) have been imported as::
|
||||
|
||||
>>> import numpy as np
|
||||
>>> import scipy as sp
|
||||
>>> import matplotlib as mpl
|
||||
>>> import matplotlib.pyplot as plt
|
||||
|
||||
These are the import conventions that our community has adopted
|
||||
after discussion on public mailing lists. You will see these
|
||||
conventions used throughout NumPy and SciPy source code and
|
||||
documentation. While we obviously don't require you to follow
|
||||
these conventions in your own code, it is highly recommended.
|
||||
|
||||
SciPy Organization
|
||||
------------------
|
||||
|
||||
SciPy is organized into subpackages covering different scientific
|
||||
computing domains. These are summarized in the following table:
|
||||
|
||||
.. currentmodule:: scipy
|
||||
|
||||
================== ======================================================
|
||||
Subpackage Description
|
||||
================== ======================================================
|
||||
:mod:`cluster` Clustering algorithms
|
||||
:mod:`constants` Physical and mathematical constants
|
||||
:mod:`fftpack` Fast Fourier Transform routines
|
||||
:mod:`integrate` Integration and ordinary differential equation solvers
|
||||
:mod:`interpolate` Interpolation and smoothing splines
|
||||
:mod:`io` Input and Output
|
||||
:mod:`linalg` Linear algebra
|
||||
:mod:`maxentropy` Maximum entropy methods
|
||||
:mod:`ndimage` N-dimensional image processing
|
||||
:mod:`odr` Orthogonal distance regression
|
||||
:mod:`optimize` Optimization and root-finding routines
|
||||
:mod:`signal` Signal processing
|
||||
:mod:`sparse` Sparse matrices and associated routines
|
||||
:mod:`spatial` Spatial data structures and algorithms
|
||||
:mod:`special` Special functions
|
||||
:mod:`stats` Statistical distributions and functions
|
||||
:mod:`weave` C/C++ integration
|
||||
================== ======================================================
|
||||
|
||||
Scipy sub-packages need to be imported separately, for example::
|
||||
|
||||
>>> from scipy import linalg, optimize
|
||||
|
||||
Because of their ubiquitousness, some of the functions in these
|
||||
subpackages are also made available in the scipy namespace to ease
|
||||
their use in interactive sessions and programs. In addition, many
|
||||
basic array functions from :mod:`numpy` are also available at the
|
||||
top-level of the :mod:`scipy` package. Before looking at the
|
||||
sub-packages individually, we will first look at some of these common
|
||||
functions.
|
||||
|
||||
Finding Documentation
|
||||
---------------------
|
||||
|
||||
Scipy and Numpy have HTML and PDF versions of their documentation
|
||||
available at http://docs.scipy.org/, which currently details nearly
|
||||
all available functionality. However, this documentation is still
|
||||
work-in-progress, and some parts may be incomplete or sparse. As
|
||||
we are a volunteer organization and depend on the community for
|
||||
growth, your participation - everything from providing feedback to
|
||||
improving the documentation and code - is welcome and actively
|
||||
encouraged.
|
||||
|
||||
Python also provides the facility of documentation strings. The
|
||||
functions and classes available in SciPy use this method for on-line
|
||||
documentation. There are two methods for reading these messages and
|
||||
getting help. Python provides the command :func:`help` in the pydoc
|
||||
module. Entering this command with no arguments (i.e. ``>>> help`` )
|
||||
launches an interactive help session that allows searching through the
|
||||
keywords and modules available to all of Python. Running the command
|
||||
help with an object as the argument displays the calling signature,
|
||||
and the documentation string of the object.
|
||||
|
||||
The pydoc method of help is sophisticated but uses a pager to display
|
||||
the text. Sometimes this can interfere with the terminal you are
|
||||
running the interactive session within. A scipy-specific help system
|
||||
is also available under the command ``sp.info``. The signature and
|
||||
documentation string for the object passed to the ``help`` command are
|
||||
printed to standard output (or to a writeable object passed as the
|
||||
third argument). The second keyword argument of ``sp.info`` defines
|
||||
the maximum width of the line for printing. If a module is passed as
|
||||
the argument to help than a list of the functions and classes defined
|
||||
in that module is printed. For example:
|
||||
|
||||
.. literalinclude:: examples/1-1
|
||||
|
||||
Another useful command is :func:`source`. When given a function
|
||||
written in Python as an argument, it prints out a listing of the
|
||||
source code for that function. This can be helpful in learning about
|
||||
an algorithm or understanding exactly what a function is doing with
|
||||
its arguments. Also don't forget about the Python command ``dir``
|
||||
which can be used to look at the namespace of a module or package.
|
22
pythonPackages/scipy-0.8.0/doc/source/tutorial/index.rst
Executable file
22
pythonPackages/scipy-0.8.0/doc/source/tutorial/index.rst
Executable file
|
@ -0,0 +1,22 @@
|
|||
**************
|
||||
SciPy Tutorial
|
||||
**************
|
||||
|
||||
.. sectionauthor:: Travis E. Oliphant
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
|
||||
general
|
||||
basic
|
||||
special
|
||||
integrate
|
||||
optimize
|
||||
interpolate
|
||||
fftpack
|
||||
signal
|
||||
linalg
|
||||
stats
|
||||
ndimage
|
||||
io
|
||||
weave
|
280
pythonPackages/scipy-0.8.0/doc/source/tutorial/integrate.rst
Executable file
280
pythonPackages/scipy-0.8.0/doc/source/tutorial/integrate.rst
Executable file
|
@ -0,0 +1,280 @@
|
|||
Integration (:mod:`scipy.integrate`)
|
||||
====================================
|
||||
|
||||
.. sectionauthor:: Travis E. Oliphant
|
||||
|
||||
.. currentmodule:: scipy.integrate
|
||||
|
||||
The :mod:`scipy.integrate` sub-package provides several integration
|
||||
techniques including an ordinary differential equation integrator. An
|
||||
overview of the module is provided by the help command:
|
||||
|
||||
.. literalinclude:: examples/4-1
|
||||
|
||||
|
||||
General integration (:func:`quad`)
|
||||
----------------------------------
|
||||
|
||||
The function :obj:`quad` is provided to integrate a function of one
|
||||
variable between two points. The points can be :math:`\pm\infty`
|
||||
(:math:`\pm` ``inf``) to indicate infinite limits. For example,
|
||||
suppose you wish to integrate a bessel function ``jv(2.5,x)`` along
|
||||
the interval :math:`[0,4.5].`
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ I=\int_{0}^{4.5}J_{2.5}\left(x\right)\, dx.\]
|
||||
|
||||
This could be computed using :obj:`quad`:
|
||||
|
||||
>>> result = integrate.quad(lambda x: special.jv(2.5,x), 0, 4.5)
|
||||
>>> print result
|
||||
(1.1178179380783249, 7.8663172481899801e-09)
|
||||
|
||||
>>> I = sqrt(2/pi)*(18.0/27*sqrt(2)*cos(4.5)-4.0/27*sqrt(2)*sin(4.5)+
|
||||
sqrt(2*pi)*special.fresnel(3/sqrt(pi))[0])
|
||||
>>> print I
|
||||
1.117817938088701
|
||||
|
||||
>>> print abs(result[0]-I)
|
||||
1.03761443881e-11
|
||||
|
||||
The first argument to quad is a "callable" Python object (*i.e* a
|
||||
function, method, or class instance). Notice the use of a lambda-
|
||||
function in this case as the argument. The next two arguments are the
|
||||
limits of integration. The return value is a tuple, with the first
|
||||
element holding the estimated value of the integral and the second
|
||||
element holding an upper bound on the error. Notice, that in this
|
||||
case, the true value of this integral is
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ I=\sqrt{\frac{2}{\pi}}\left(\frac{18}{27}\sqrt{2}\cos\left(4.5\right)-\frac{4}{27}\sqrt{2}\sin\left(4.5\right)+\sqrt{2\pi}\textrm{Si}\left(\frac{3}{\sqrt{\pi}}\right)\right),\]
|
||||
|
||||
where
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ \textrm{Si}\left(x\right)=\int_{0}^{x}\sin\left(\frac{\pi}{2}t^{2}\right)\, dt.\]
|
||||
|
||||
is the Fresnel sine integral. Note that the numerically-computed
|
||||
integral is within :math:`1.04\times10^{-11}` of the exact result --- well below the reported error bound.
|
||||
|
||||
Infinite inputs are also allowed in :obj:`quad` by using :math:`\pm`
|
||||
``inf`` as one of the arguments. For example, suppose that a numerical
|
||||
value for the exponential integral:
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ E_{n}\left(x\right)=\int_{1}^{\infty}\frac{e^{-xt}}{t^{n}}\, dt.\]
|
||||
|
||||
is desired (and the fact that this integral can be computed as
|
||||
``special.expn(n,x)`` is forgotten). The functionality of the function
|
||||
:obj:`special.expn` can be replicated by defining a new function
|
||||
:obj:`vec_expint` based on the routine :obj:`quad`:
|
||||
|
||||
>>> from scipy.integrate import quad
|
||||
>>> def integrand(t,n,x):
|
||||
... return exp(-x*t) / t**n
|
||||
|
||||
>>> def expint(n,x):
|
||||
... return quad(integrand, 1, Inf, args=(n, x))[0]
|
||||
|
||||
>>> vec_expint = vectorize(expint)
|
||||
|
||||
>>> vec_expint(3,arange(1.0,4.0,0.5))
|
||||
array([ 0.1097, 0.0567, 0.0301, 0.0163, 0.0089, 0.0049])
|
||||
>>> special.expn(3,arange(1.0,4.0,0.5))
|
||||
array([ 0.1097, 0.0567, 0.0301, 0.0163, 0.0089, 0.0049])
|
||||
|
||||
The function which is integrated can even use the quad argument
|
||||
(though the error bound may underestimate the error due to possible
|
||||
numerical error in the integrand from the use of :obj:`quad` ). The integral in this case is
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ I_{n}=\int_{0}^{\infty}\int_{1}^{\infty}\frac{e^{-xt}}{t^{n}}\, dt\, dx=\frac{1}{n}.\]
|
||||
|
||||
>>> result = quad(lambda x: expint(3, x), 0, inf)
|
||||
>>> print result
|
||||
(0.33333333324560266, 2.8548934485373678e-09)
|
||||
|
||||
>>> I3 = 1.0/3.0
|
||||
>>> print I3
|
||||
0.333333333333
|
||||
|
||||
>>> print I3 - result[0]
|
||||
8.77306560731e-11
|
||||
|
||||
This last example shows that multiple integration can be handled using
|
||||
repeated calls to :func:`quad`. The mechanics of this for double and
|
||||
triple integration have been wrapped up into the functions
|
||||
:obj:`dblquad` and :obj:`tplquad`. The function, :obj:`dblquad`
|
||||
performs double integration. Use the help function to be sure that the
|
||||
arguments are defined in the correct order. In addition, the limits on
|
||||
all inner integrals are actually functions which can be constant
|
||||
functions. An example of using double integration to compute several
|
||||
values of :math:`I_{n}` is shown below:
|
||||
|
||||
>>> from scipy.integrate import quad, dblquad
|
||||
>>> def I(n):
|
||||
... return dblquad(lambda t, x: exp(-x*t)/t**n, 0, Inf, lambda x: 1, lambda x: Inf)
|
||||
|
||||
>>> print I(4)
|
||||
(0.25000000000435768, 1.0518245707751597e-09)
|
||||
>>> print I(3)
|
||||
(0.33333333325010883, 2.8604069919261191e-09)
|
||||
>>> print I(2)
|
||||
(0.49999999999857514, 1.8855523253868967e-09)
|
||||
|
||||
|
||||
Gaussian quadrature (integrate.gauss_quadtol)
|
||||
---------------------------------------------
|
||||
|
||||
A few functions are also provided in order to perform simple Gaussian
|
||||
quadrature over a fixed interval. The first is :obj:`fixed_quad` which
|
||||
performs fixed-order Gaussian quadrature. The second function is
|
||||
:obj:`quadrature` which performs Gaussian quadrature of multiple
|
||||
orders until the difference in the integral estimate is beneath some
|
||||
tolerance supplied by the user. These functions both use the module
|
||||
:mod:`special.orthogonal` which can calculate the roots and quadrature
|
||||
weights of a large variety of orthogonal polynomials (the polynomials
|
||||
themselves are available as special functions returning instances of
|
||||
the polynomial class --- e.g. :obj:`special.legendre <scipy.special.legendre>`).
|
||||
|
||||
|
||||
Integrating using samples
|
||||
-------------------------
|
||||
|
||||
There are three functions for computing integrals given only samples:
|
||||
:obj:`trapz` , :obj:`simps`, and :obj:`romb` . The first two
|
||||
functions use Newton-Coates formulas of order 1 and 2 respectively to
|
||||
perform integration. These two functions can handle,
|
||||
non-equally-spaced samples. The trapezoidal rule approximates the
|
||||
function as a straight line between adjacent points, while Simpson's
|
||||
rule approximates the function between three adjacent points as a
|
||||
parabola.
|
||||
|
||||
If the samples are equally-spaced and the number of samples available
|
||||
is :math:`2^{k}+1` for some integer :math:`k`, then Romberg
|
||||
integration can be used to obtain high-precision estimates of the
|
||||
integral using the available samples. Romberg integration uses the
|
||||
trapezoid rule at step-sizes related by a power of two and then
|
||||
performs Richardson extrapolation on these estimates to approximate
|
||||
the integral with a higher-degree of accuracy. (A different interface
|
||||
to Romberg integration useful when the function can be provided is
|
||||
also available as :func:`romberg`).
|
||||
|
||||
|
||||
Ordinary differential equations (:func:`odeint`)
|
||||
------------------------------------------------
|
||||
|
||||
Integrating a set of ordinary differential equations (ODEs) given
|
||||
initial conditions is another useful example. The function
|
||||
:obj:`odeint` is available in SciPy for integrating a first-order
|
||||
vector differential equation:
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ \frac{d\mathbf{y}}{dt}=\mathbf{f}\left(\mathbf{y},t\right),\]
|
||||
|
||||
given initial conditions :math:`\mathbf{y}\left(0\right)=y_{0}`, where
|
||||
:math:`\mathbf{y}` is a length :math:`N` vector and :math:`\mathbf{f}`
|
||||
is a mapping from :math:`\mathcal{R}^{N}` to :math:`\mathcal{R}^{N}.`
|
||||
A higher-order ordinary differential equation can always be reduced to
|
||||
a differential equation of this type by introducing intermediate
|
||||
derivatives into the :math:`\mathbf{y}` vector.
|
||||
|
||||
For example suppose it is desired to find the solution to the
|
||||
following second-order differential equation:
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ \frac{d^{2}w}{dz^{2}}-zw(z)=0\]
|
||||
|
||||
with initial conditions :math:`w\left(0\right)=\frac{1}{\sqrt[3]{3^{2}}\Gamma\left(\frac{2}{3}\right)}` and :math:`\left.\frac{dw}{dz}\right|_{z=0}=-\frac{1}{\sqrt[3]{3}\Gamma\left(\frac{1}{3}\right)}.` It is known that the solution to this differential equation with these
|
||||
boundary conditions is the Airy function
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ w=\textrm{Ai}\left(z\right),\]
|
||||
|
||||
which gives a means to check the integrator using :func:`special.airy <scipy.special.airy>`.
|
||||
|
||||
First, convert this ODE into standard form by setting
|
||||
:math:`\mathbf{y}=\left[\frac{dw}{dz},w\right]` and :math:`t=z`. Thus,
|
||||
the differential equation becomes
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ \frac{d\mathbf{y}}{dt}=\left[\begin{array}{c} ty_{1}\\ y_{0}\end{array}\right]=\left[\begin{array}{cc} 0 & t\\ 1 & 0\end{array}\right]\left[\begin{array}{c} y_{0}\\ y_{1}\end{array}\right]=\left[\begin{array}{cc} 0 & t\\ 1 & 0\end{array}\right]\mathbf{y}.\]
|
||||
|
||||
In other words,
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ \mathbf{f}\left(\mathbf{y},t\right)=\mathbf{A}\left(t\right)\mathbf{y}.\]
|
||||
|
||||
As an interesting reminder, if :math:`\mathbf{A}\left(t\right)`
|
||||
commutes with :math:`\int_{0}^{t}\mathbf{A}\left(\tau\right)\, d\tau`
|
||||
under matrix multiplication, then this linear differential equation
|
||||
has an exact solution using the matrix exponential:
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ \mathbf{y}\left(t\right)=\exp\left(\int_{0}^{t}\mathbf{A}\left(\tau\right)d\tau\right)\mathbf{y}\left(0\right),\]
|
||||
|
||||
However, in this case, :math:`\mathbf{A}\left(t\right)` and its integral do not commute.
|
||||
|
||||
There are many optional inputs and outputs available when using odeint
|
||||
which can help tune the solver. These additional inputs and outputs
|
||||
are not needed much of the time, however, and the three required input
|
||||
arguments and the output solution suffice. The required inputs are the
|
||||
function defining the derivative, *fprime*, the initial conditions
|
||||
vector, *y0*, and the time points to obtain a solution, *t*, (with
|
||||
the initial value point as the first element of this sequence). The
|
||||
output to :obj:`odeint` is a matrix where each row contains the
|
||||
solution vector at each requested time point (thus, the initial
|
||||
conditions are given in the first output row).
|
||||
|
||||
The following example illustrates the use of odeint including the
|
||||
usage of the *Dfun* option which allows the user to specify a gradient
|
||||
(with respect to :math:`\mathbf{y}` ) of the function,
|
||||
:math:`\mathbf{f}\left(\mathbf{y},t\right)`.
|
||||
|
||||
>>> from scipy.integrate import odeint
|
||||
>>> from scipy.special import gamma, airy
|
||||
>>> y1_0 = 1.0/3**(2.0/3.0)/gamma(2.0/3.0)
|
||||
>>> y0_0 = -1.0/3**(1.0/3.0)/gamma(1.0/3.0)
|
||||
>>> y0 = [y0_0, y1_0]
|
||||
>>> def func(y, t):
|
||||
... return [t*y[1],y[0]]
|
||||
|
||||
>>> def gradient(y,t):
|
||||
... return [[0,t],[1,0]]
|
||||
|
||||
>>> x = arange(0,4.0, 0.01)
|
||||
>>> t = x
|
||||
>>> ychk = airy(x)[0]
|
||||
>>> y = odeint(func, y0, t)
|
||||
>>> y2 = odeint(func, y0, t, Dfun=gradient)
|
||||
|
||||
>>> print ychk[:36:6]
|
||||
[ 0.355028 0.339511 0.324068 0.308763 0.293658 0.278806]
|
||||
|
||||
>>> print y[:36:6,1]
|
||||
[ 0.355028 0.339511 0.324067 0.308763 0.293658 0.278806]
|
||||
|
||||
>>> print y2[:36:6,1]
|
||||
[ 0.355028 0.339511 0.324067 0.308763 0.293658 0.278806]
|
399
pythonPackages/scipy-0.8.0/doc/source/tutorial/interpolate.rst
Executable file
399
pythonPackages/scipy-0.8.0/doc/source/tutorial/interpolate.rst
Executable file
|
@ -0,0 +1,399 @@
|
|||
Interpolation (:mod:`scipy.interpolate`)
|
||||
========================================
|
||||
|
||||
.. sectionauthor:: Travis E. Oliphant
|
||||
|
||||
.. currentmodule:: scipy.interpolate
|
||||
|
||||
.. contents::
|
||||
|
||||
There are two general interpolation facilities available in SciPy. The
|
||||
first facility is an interpolation class which performs linear
|
||||
1-dimensional interpolation. The second facility is based on the
|
||||
FORTRAN library FITPACK and provides functions for 1- and
|
||||
2-dimensional (smoothed) cubic-spline interpolation. There are both
|
||||
procedural and object-oriented interfaces for the FITPACK library.
|
||||
|
||||
|
||||
Linear 1-d interpolation (:class:`interp1d`)
|
||||
--------------------------------------------
|
||||
|
||||
The interp1d class in scipy.interpolate is a convenient method to
|
||||
create a function based on fixed data points which can be evaluated
|
||||
anywhere within the domain defined by the given data using linear
|
||||
interpolation. An instance of this class is created by passing the 1-d
|
||||
vectors comprising the data. The instance of this class defines a
|
||||
__call__ method and can therefore by treated like a function which
|
||||
interpolates between known data values to obtain unknown values (it
|
||||
also has a docstring for help). Behavior at the boundary can be
|
||||
specified at instantiation time. The following example demonstrates
|
||||
it's use.
|
||||
|
||||
.. plot::
|
||||
|
||||
>>> import numpy as np
|
||||
>>> from scipy import interpolate
|
||||
|
||||
>>> x = np.arange(0,10)
|
||||
>>> y = np.exp(-x/3.0)
|
||||
>>> f = interpolate.interp1d(x, y)
|
||||
|
||||
>>> xnew = np.arange(0,9,0.1)
|
||||
>>> import matplotlib.pyplot as plt
|
||||
>>> plt.plot(x,y,'o',xnew,f(xnew),'-')
|
||||
|
||||
.. :caption: One-dimensional interpolation using the
|
||||
.. class :obj:`interpolate.interp1d`
|
||||
|
||||
|
||||
Spline interpolation in 1-d: Procedural (interpolate.splXXX)
|
||||
------------------------------------------------------------
|
||||
|
||||
Spline interpolation requires two essential steps: (1) a spline
|
||||
representation of the curve is computed, and (2) the spline is
|
||||
evaluated at the desired points. In order to find the spline
|
||||
representation, there are two different ways to represent a curve and
|
||||
obtain (smoothing) spline coefficients: directly and parametrically.
|
||||
The direct method finds the spline representation of a curve in a two-
|
||||
dimensional plane using the function :obj:`splrep`. The
|
||||
first two arguments are the only ones required, and these provide the
|
||||
:math:`x` and :math:`y` components of the curve. The normal output is
|
||||
a 3-tuple, :math:`\left(t,c,k\right)` , containing the knot-points,
|
||||
:math:`t` , the coefficients :math:`c` and the order :math:`k` of the
|
||||
spline. The default spline order is cubic, but this can be changed
|
||||
with the input keyword, *k.*
|
||||
|
||||
For curves in :math:`N` -dimensional space the function
|
||||
:obj:`splprep` allows defining the curve
|
||||
parametrically. For this function only 1 input argument is
|
||||
required. This input is a list of :math:`N` -arrays representing the
|
||||
curve in :math:`N` -dimensional space. The length of each array is the
|
||||
number of curve points, and each array provides one component of the
|
||||
:math:`N` -dimensional data point. The parameter variable is given
|
||||
with the keword argument, *u,* which defaults to an equally-spaced
|
||||
monotonic sequence between :math:`0` and :math:`1` . The default
|
||||
output consists of two objects: a 3-tuple, :math:`\left(t,c,k\right)`
|
||||
, containing the spline representation and the parameter variable
|
||||
:math:`u.`
|
||||
|
||||
The keyword argument, *s* , is used to specify the amount of smoothing
|
||||
to perform during the spline fit. The default value of :math:`s` is
|
||||
:math:`s=m-\sqrt{2m}` where :math:`m` is the number of data-points
|
||||
being fit. Therefore, **if no smoothing is desired a value of**
|
||||
:math:`\mathbf{s}=0` **should be passed to the routines.**
|
||||
|
||||
Once the spline representation of the data has been determined,
|
||||
functions are available for evaluating the spline
|
||||
(:func:`splev`) and its derivatives
|
||||
(:func:`splev`, :func:`spalde`) at any point
|
||||
and the integral of the spline between any two points (
|
||||
:func:`splint`). In addition, for cubic splines ( :math:`k=3`
|
||||
) with 8 or more knots, the roots of the spline can be estimated (
|
||||
:func:`sproot`). These functions are demonstrated in the
|
||||
example that follows.
|
||||
|
||||
.. plot::
|
||||
|
||||
>>> import numpy as np
|
||||
>>> import matplotlib.pyplot as plt
|
||||
>>> from scipy import interpolate
|
||||
|
||||
Cubic-spline
|
||||
|
||||
>>> x = np.arange(0,2*np.pi+np.pi/4,2*np.pi/8)
|
||||
>>> y = np.sin(x)
|
||||
>>> tck = interpolate.splrep(x,y,s=0)
|
||||
>>> xnew = np.arange(0,2*np.pi,np.pi/50)
|
||||
>>> ynew = interpolate.splev(xnew,tck,der=0)
|
||||
|
||||
>>> plt.figure()
|
||||
>>> plt.plot(x,y,'x',xnew,ynew,xnew,np.sin(xnew),x,y,'b')
|
||||
>>> plt.legend(['Linear','Cubic Spline', 'True'])
|
||||
>>> plt.axis([-0.05,6.33,-1.05,1.05])
|
||||
>>> plt.title('Cubic-spline interpolation')
|
||||
>>> plt.show()
|
||||
|
||||
Derivative of spline
|
||||
|
||||
>>> yder = interpolate.splev(xnew,tck,der=1)
|
||||
>>> plt.figure()
|
||||
>>> plt.plot(xnew,yder,xnew,np.cos(xnew),'--')
|
||||
>>> plt.legend(['Cubic Spline', 'True'])
|
||||
>>> plt.axis([-0.05,6.33,-1.05,1.05])
|
||||
>>> plt.title('Derivative estimation from spline')
|
||||
>>> plt.show()
|
||||
|
||||
Integral of spline
|
||||
|
||||
>>> def integ(x,tck,constant=-1):
|
||||
>>> x = np.atleast_1d(x)
|
||||
>>> out = np.zeros(x.shape, dtype=x.dtype)
|
||||
>>> for n in xrange(len(out)):
|
||||
>>> out[n] = interpolate.splint(0,x[n],tck)
|
||||
>>> out += constant
|
||||
>>> return out
|
||||
>>>
|
||||
>>> yint = integ(xnew,tck)
|
||||
>>> plt.figure()
|
||||
>>> plt.plot(xnew,yint,xnew,-np.cos(xnew),'--')
|
||||
>>> plt.legend(['Cubic Spline', 'True'])
|
||||
>>> plt.axis([-0.05,6.33,-1.05,1.05])
|
||||
>>> plt.title('Integral estimation from spline')
|
||||
>>> plt.show()
|
||||
|
||||
Roots of spline
|
||||
|
||||
>>> print interpolate.sproot(tck)
|
||||
[ 0. 3.1416]
|
||||
|
||||
Parametric spline
|
||||
|
||||
>>> t = np.arange(0,1.1,.1)
|
||||
>>> x = np.sin(2*np.pi*t)
|
||||
>>> y = np.cos(2*np.pi*t)
|
||||
>>> tck,u = interpolate.splprep([x,y],s=0)
|
||||
>>> unew = np.arange(0,1.01,0.01)
|
||||
>>> out = interpolate.splev(unew,tck)
|
||||
>>> plt.figure()
|
||||
>>> plt.plot(x,y,'x',out[0],out[1],np.sin(2*np.pi*unew),np.cos(2*np.pi*unew),x,y,'b')
|
||||
>>> plt.legend(['Linear','Cubic Spline', 'True'])
|
||||
>>> plt.axis([-1.05,1.05,-1.05,1.05])
|
||||
>>> plt.title('Spline of parametrically-defined curve')
|
||||
>>> plt.show()
|
||||
|
||||
Spline interpolation in 1-d: Object-oriented (:class:`UnivariateSpline`)
|
||||
-----------------------------------------------------------------------------
|
||||
|
||||
The spline-fitting capabilities described above are also available via
|
||||
an objected-oriented interface. The one dimensional splines are
|
||||
objects of the `UnivariateSpline` class, and are created with the
|
||||
:math:`x` and :math:`y` components of the curve provided as arguments
|
||||
to the constructor. The class defines __call__, allowing the object
|
||||
to be called with the x-axis values at which the spline should be
|
||||
evaluated, returning the interpolated y-values. This is shown in
|
||||
the example below for the subclass `InterpolatedUnivariateSpline`.
|
||||
The methods :meth:`integral <UnivariateSpline.integral>`,
|
||||
:meth:`derivatives <UnivariateSpline.derivatives>`, and
|
||||
:meth:`roots <UnivariateSpline.roots>` methods are also available
|
||||
on `UnivariateSpline` objects, allowing definite integrals,
|
||||
derivatives, and roots to be computed for the spline.
|
||||
|
||||
The UnivariateSpline class can also be used to smooth data by
|
||||
providing a non-zero value of the smoothing parameter `s`, with the
|
||||
same meaning as the `s` keyword of the :obj:`splrep` function
|
||||
described above. This results in a spline that has fewer knots
|
||||
than the number of data points, and hence is no longer strictly
|
||||
an interpolating spline, but rather a smoothing spline. If this
|
||||
is not desired, the `InterpolatedUnivariateSpline` class is available.
|
||||
It is a subclass of `UnivariateSpline` that always passes through all
|
||||
points (equivalent to forcing the smoothing parameter to 0). This
|
||||
class is demonstrated in the example below.
|
||||
|
||||
The `LSQUnivarateSpline` is the other subclass of `UnivarateSpline`.
|
||||
It allows the user to specify the number and location of internal
|
||||
knots as explicitly with the parameter `t`. This allows creation
|
||||
of customized splines with non-linear spacing, to interpolate in
|
||||
some domains and smooth in others, or change the character of the
|
||||
spline.
|
||||
|
||||
|
||||
.. plot::
|
||||
|
||||
>>> import numpy as np
|
||||
>>> import matplotlib.pyplot as plt
|
||||
>>> from scipy import interpolate
|
||||
|
||||
InterpolatedUnivariateSpline
|
||||
|
||||
>>> x = np.arange(0,2*np.pi+np.pi/4,2*np.pi/8)
|
||||
>>> y = np.sin(x)
|
||||
>>> s = interpolate.InterpolatedUnivariateSpline(x,y)
|
||||
>>> xnew = np.arange(0,2*np.pi,np.pi/50)
|
||||
>>> ynew = s(xnew)
|
||||
|
||||
>>> plt.figure()
|
||||
>>> plt.plot(x,y,'x',xnew,ynew,xnew,np.sin(xnew),x,y,'b')
|
||||
>>> plt.legend(['Linear','InterpolatedUnivariateSpline', 'True'])
|
||||
>>> plt.axis([-0.05,6.33,-1.05,1.05])
|
||||
>>> plt.title('InterpolatedUnivariateSpline')
|
||||
>>> plt.show()
|
||||
|
||||
LSQUnivarateSpline with non-uniform knots
|
||||
|
||||
>>> t = [np.pi/2-.1,np.pi/2-.1,3*np.pi/2-.1,3*np.pi/2+.1]
|
||||
>>> s = interpolate.LSQUnivariateSpline(x,y,t)
|
||||
>>> ynew = s(xnew)
|
||||
|
||||
>>> plt.figure()
|
||||
>>> plt.plot(x,y,'x',xnew,ynew,xnew,np.sin(xnew),x,y,'b')
|
||||
>>> plt.legend(['Linear','LSQUnivariateSpline', 'True'])
|
||||
>>> plt.axis([-0.05,6.33,-1.05,1.05])
|
||||
>>> plt.title('Spline with Specified Interior Knots')
|
||||
>>> plt.show()
|
||||
|
||||
|
||||
|
||||
Two-dimensional spline representation: Procedural (:func:`bisplrep`)
|
||||
--------------------------------------------------------------------
|
||||
|
||||
For (smooth) spline-fitting to a two dimensional surface, the function
|
||||
:func:`bisplrep` is available. This function takes as required inputs
|
||||
the **1-D** arrays *x*, *y*, and *z* which represent points on the
|
||||
surface :math:`z=f\left(x,y\right).` The default output is a list
|
||||
:math:`\left[tx,ty,c,kx,ky\right]` whose entries represent
|
||||
respectively, the components of the knot positions, the coefficients
|
||||
of the spline, and the order of the spline in each coordinate. It is
|
||||
convenient to hold this list in a single object, *tck,* so that it can
|
||||
be passed easily to the function :obj:`bisplev`. The
|
||||
keyword, *s* , can be used to change the amount of smoothing performed
|
||||
on the data while determining the appropriate spline. The default
|
||||
value is :math:`s=m-\sqrt{2m}` where :math:`m` is the number of data
|
||||
points in the *x, y,* and *z* vectors. As a result, if no smoothing is
|
||||
desired, then :math:`s=0` should be passed to
|
||||
:obj:`bisplrep` .
|
||||
|
||||
To evaluate the two-dimensional spline and it's partial derivatives
|
||||
(up to the order of the spline), the function
|
||||
:obj:`bisplev` is required. This function takes as the
|
||||
first two arguments **two 1-D arrays** whose cross-product specifies
|
||||
the domain over which to evaluate the spline. The third argument is
|
||||
the *tck* list returned from :obj:`bisplrep`. If desired,
|
||||
the fourth and fifth arguments provide the orders of the partial
|
||||
derivative in the :math:`x` and :math:`y` direction respectively.
|
||||
|
||||
It is important to note that two dimensional interpolation should not
|
||||
be used to find the spline representation of images. The algorithm
|
||||
used is not amenable to large numbers of input points. The signal
|
||||
processing toolbox contains more appropriate algorithms for finding
|
||||
the spline representation of an image. The two dimensional
|
||||
interpolation commands are intended for use when interpolating a two
|
||||
dimensional function as shown in the example that follows. This
|
||||
example uses the :obj:`mgrid <numpy.mgrid>` command in SciPy which is
|
||||
useful for defining a "mesh-grid "in many dimensions. (See also the
|
||||
:obj:`ogrid <numpy.ogrid>` command if the full-mesh is not
|
||||
needed). The number of output arguments and the number of dimensions
|
||||
of each argument is determined by the number of indexing objects
|
||||
passed in :obj:`mgrid <numpy.mgrid>`.
|
||||
|
||||
.. plot::
|
||||
|
||||
>>> import numpy as np
|
||||
>>> from scipy import interpolate
|
||||
>>> import matplotlib.pyplot as plt
|
||||
|
||||
Define function over sparse 20x20 grid
|
||||
|
||||
>>> x,y = np.mgrid[-1:1:20j,-1:1:20j]
|
||||
>>> z = (x+y)*np.exp(-6.0*(x*x+y*y))
|
||||
|
||||
>>> plt.figure()
|
||||
>>> plt.pcolor(x,y,z)
|
||||
>>> plt.colorbar()
|
||||
>>> plt.title("Sparsely sampled function.")
|
||||
>>> plt.show()
|
||||
|
||||
Interpolate function over new 70x70 grid
|
||||
|
||||
>>> xnew,ynew = np.mgrid[-1:1:70j,-1:1:70j]
|
||||
>>> tck = interpolate.bisplrep(x,y,z,s=0)
|
||||
>>> znew = interpolate.bisplev(xnew[:,0],ynew[0,:],tck)
|
||||
|
||||
>>> plt.figure()
|
||||
>>> plt.pcolor(xnew,ynew,znew)
|
||||
>>> plt.colorbar()
|
||||
>>> plt.title("Interpolated function.")
|
||||
>>> plt.show()
|
||||
|
||||
.. :caption: Example of two-dimensional spline interpolation.
|
||||
|
||||
|
||||
Two-dimensional spline representation: Object-oriented (:class:`BivariateSpline`)
|
||||
---------------------------------------------------------------------------------
|
||||
|
||||
The :class:`BivariateSpline` class is the 2-dimensional analog of the
|
||||
:class:`UnivariateSpline` class. It and its subclasses implement
|
||||
the FITPACK functions described above in an object oriented fashion,
|
||||
allowing objects to be instantiated that can be called to compute
|
||||
the spline value by passing in the two coordinates as the two
|
||||
arguments.
|
||||
|
||||
|
||||
Using radial basis functions for smoothing/interpolation
|
||||
---------------------------------------------------------
|
||||
|
||||
Radial basis functions can be used for smoothing/interpolating scattered
|
||||
data in n-dimensions, but should be used with caution for extrapolation
|
||||
outside of the observed data range.
|
||||
|
||||
1-d Example
|
||||
^^^^^^^^^^^
|
||||
|
||||
This example compares the usage of the Rbf and UnivariateSpline classes
|
||||
from the scipy.interpolate module.
|
||||
|
||||
.. plot::
|
||||
|
||||
>>> import numpy as np
|
||||
>>> from scipy.interpolate import Rbf, InterpolatedUnivariateSpline
|
||||
>>> import matplotlib.pyplot as plt
|
||||
|
||||
>>> # setup data
|
||||
>>> x = np.linspace(0, 10, 9)
|
||||
>>> y = np.sin(x)
|
||||
>>> xi = np.linspace(0, 10, 101)
|
||||
|
||||
>>> # use fitpack2 method
|
||||
>>> ius = InterpolatedUnivariateSpline(x, y)
|
||||
>>> yi = ius(xi)
|
||||
|
||||
>>> plt.subplot(2, 1, 1)
|
||||
>>> plt.plot(x, y, 'bo')
|
||||
>>> plt.plot(xi, yi, 'g')
|
||||
>>> plt.plot(xi, np.sin(xi), 'r')
|
||||
>>> plt.title('Interpolation using univariate spline')
|
||||
|
||||
>>> # use RBF method
|
||||
>>> rbf = Rbf(x, y)
|
||||
>>> fi = rbf(xi)
|
||||
|
||||
>>> plt.subplot(2, 1, 2)
|
||||
>>> plt.plot(x, y, 'bo')
|
||||
>>> plt.plot(xi, fi, 'g')
|
||||
>>> plt.plot(xi, np.sin(xi), 'r')
|
||||
>>> plt.title('Interpolation using RBF - multiquadrics')
|
||||
>>> plt.show()
|
||||
|
||||
.. :caption: Example of one-dimensional RBF interpolation.
|
||||
|
||||
2-d Example
|
||||
^^^^^^^^^^^
|
||||
|
||||
This example shows how to interpolate scattered 2d data.
|
||||
|
||||
.. plot::
|
||||
|
||||
>>> import numpy as np
|
||||
>>> from scipy.interpolate import Rbf
|
||||
>>> import matplotlib.pyplot as plt
|
||||
>>> from matplotlib import cm
|
||||
|
||||
>>> # 2-d tests - setup scattered data
|
||||
>>> x = np.random.rand(100)*4.0-2.0
|
||||
>>> y = np.random.rand(100)*4.0-2.0
|
||||
>>> z = x*np.exp(-x**2-y**2)
|
||||
>>> ti = np.linspace(-2.0, 2.0, 100)
|
||||
>>> XI, YI = np.meshgrid(ti, ti)
|
||||
|
||||
>>> # use RBF
|
||||
>>> rbf = Rbf(x, y, z, epsilon=2)
|
||||
>>> ZI = rbf(XI, YI)
|
||||
|
||||
>>> # plot the result
|
||||
>>> n = plt.normalize(-2., 2.)
|
||||
>>> plt.subplot(1, 1, 1)
|
||||
>>> plt.pcolor(XI, YI, ZI, cmap=cm.jet)
|
||||
>>> plt.scatter(x, y, 100, z, cmap=cm.jet)
|
||||
>>> plt.title('RBF interpolation - multiquadrics')
|
||||
>>> plt.xlim(-2, 2)
|
||||
>>> plt.ylim(-2, 2)
|
||||
>>> plt.colorbar()
|
376
pythonPackages/scipy-0.8.0/doc/source/tutorial/io.rst
Executable file
376
pythonPackages/scipy-0.8.0/doc/source/tutorial/io.rst
Executable file
|
@ -0,0 +1,376 @@
|
|||
File IO (:mod:`scipy.io`)
|
||||
=========================
|
||||
|
||||
.. sectionauthor:: Matthew Brett
|
||||
|
||||
.. currentmodule:: scipy.io
|
||||
|
||||
.. seealso:: :ref:`numpy-reference.routines.io` (in numpy)
|
||||
|
||||
Matlab files
|
||||
------------
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
loadmat
|
||||
savemat
|
||||
|
||||
Getting started:
|
||||
|
||||
>>> import scipy.io as sio
|
||||
|
||||
If you are using IPython, try tab completing on ``sio``. You'll find::
|
||||
|
||||
sio.loadmat
|
||||
sio.savemat
|
||||
|
||||
These are the high-level functions you will most likely use. You'll also find::
|
||||
|
||||
sio.matlab
|
||||
|
||||
This is the package from which ``loadmat`` and ``savemat`` are imported.
|
||||
Within ``sio.matlab``, you will find the ``mio`` module - containing
|
||||
the machinery that ``loadmat`` and ``savemat`` use. From time to time
|
||||
you may find yourself re-using this machinery.
|
||||
|
||||
How do I start?
|
||||
```````````````
|
||||
|
||||
You may have a ``.mat`` file that you want to read into Scipy. Or, you
|
||||
want to pass some variables from Scipy / Numpy into Matlab.
|
||||
|
||||
To save us using a Matlab license, let's start in Octave_. Octave has
|
||||
Matlab-compatible save / load functions. Start Octave (``octave`` at
|
||||
the command line for me):
|
||||
|
||||
.. sourcecode:: octave
|
||||
|
||||
octave:1> a = 1:12
|
||||
a =
|
||||
|
||||
1 2 3 4 5 6 7 8 9 10 11 12
|
||||
|
||||
octave:2> a = reshape(a, [1 3 4])
|
||||
a =
|
||||
|
||||
ans(:,:,1) =
|
||||
|
||||
1 2 3
|
||||
|
||||
ans(:,:,2) =
|
||||
|
||||
4 5 6
|
||||
|
||||
ans(:,:,3) =
|
||||
|
||||
7 8 9
|
||||
|
||||
ans(:,:,4) =
|
||||
|
||||
10 11 12
|
||||
|
||||
|
||||
|
||||
octave:3> save -6 octave_a.mat a % Matlab 6 compatible
|
||||
octave:4> ls octave_a.mat
|
||||
octave_a.mat
|
||||
|
||||
Now, to Python:
|
||||
|
||||
>>> mat_contents = sio.loadmat('octave_a.mat')
|
||||
>>> print mat_contents
|
||||
{'a': array([[[ 1., 4., 7., 10.],
|
||||
[ 2., 5., 8., 11.],
|
||||
[ 3., 6., 9., 12.]]]), '__version__': '1.0', '__header__': 'MATLAB 5.0 MAT-file, written by Octave 3.2.3, 2010-05-30 02:13:40 UTC', '__globals__': []}
|
||||
>>> oct_a = mat_contents['a']
|
||||
>>> print oct_a
|
||||
[[[ 1. 4. 7. 10.]
|
||||
[ 2. 5. 8. 11.]
|
||||
[ 3. 6. 9. 12.]]]
|
||||
>>> print oct_a.shape
|
||||
(1, 3, 4)
|
||||
|
||||
Now let's try the other way round:
|
||||
|
||||
>>> import numpy as np
|
||||
>>> vect = np.arange(10)
|
||||
>>> print vect.shape
|
||||
(10,)
|
||||
>>> sio.savemat('np_vector.mat', {'vect':vect})
|
||||
/Users/mb312/usr/local/lib/python2.6/site-packages/scipy/io/matlab/mio.py:196: FutureWarning: Using oned_as default value ('column') This will change to 'row' in future versions
|
||||
oned_as=oned_as)
|
||||
|
||||
Then back to Octave:
|
||||
|
||||
.. sourcecode:: octave
|
||||
|
||||
octave:5> load np_vector.mat
|
||||
octave:6> vect
|
||||
vect =
|
||||
|
||||
0
|
||||
1
|
||||
2
|
||||
3
|
||||
4
|
||||
5
|
||||
6
|
||||
7
|
||||
8
|
||||
9
|
||||
|
||||
octave:7> size(vect)
|
||||
ans =
|
||||
|
||||
10 1
|
||||
|
||||
Note the deprecation warning. The ``oned_as`` keyword determines the way in
|
||||
which one-dimensional vectors are stored. In the future, this will default
|
||||
to ``row`` instead of ``column``:
|
||||
|
||||
>>> sio.savemat('np_vector.mat', {'vect':vect}, oned_as='row')
|
||||
|
||||
We can load this in Octave or Matlab:
|
||||
|
||||
.. sourcecode:: octave
|
||||
|
||||
octave:8> load np_vector.mat
|
||||
octave:9> vect
|
||||
vect =
|
||||
|
||||
0 1 2 3 4 5 6 7 8 9
|
||||
|
||||
octave:10> size(vect)
|
||||
ans =
|
||||
|
||||
1 10
|
||||
|
||||
|
||||
Matlab structs
|
||||
``````````````
|
||||
|
||||
Matlab structs are a little bit like Python dicts, except the field
|
||||
names must be strings. Any Matlab object can be a value of a field. As
|
||||
for all objects in Matlab, structs are in fact arrays of structs, where
|
||||
a single struct is an array of shape (1, 1).
|
||||
|
||||
.. sourcecode:: octave
|
||||
|
||||
octave:11> my_struct = struct('field1', 1, 'field2', 2)
|
||||
my_struct =
|
||||
{
|
||||
field1 = 1
|
||||
field2 = 2
|
||||
}
|
||||
|
||||
octave:12> save -6 octave_struct.mat my_struct
|
||||
|
||||
We can load this in Python:
|
||||
|
||||
>>> mat_contents = sio.loadmat('octave_struct.mat')
|
||||
>>> print mat_contents
|
||||
{'my_struct': array([[([[1.0]], [[2.0]])]],
|
||||
dtype=[('field1', '|O8'), ('field2', '|O8')]), '__version__': '1.0', '__header__': 'MATLAB 5.0 MAT-file, written by Octave 3.2.3, 2010-05-30 02:00:26 UTC', '__globals__': []}
|
||||
>>> oct_struct = mat_contents['my_struct']
|
||||
>>> print oct_struct.shape
|
||||
(1, 1)
|
||||
>>> val = oct_struct[0,0]
|
||||
>>> print val
|
||||
([[1.0]], [[2.0]])
|
||||
>>> print val['field1']
|
||||
[[ 1.]]
|
||||
>>> print val['field2']
|
||||
[[ 2.]]
|
||||
>>> print val.dtype
|
||||
[('field1', '|O8'), ('field2', '|O8')]
|
||||
|
||||
In this version of Scipy (0.8.0), Matlab structs come back as numpy
|
||||
structured arrays, with fields named for the struct fields. You can see
|
||||
the field names in the ``dtype`` output above. Note also:
|
||||
|
||||
>>> val = oct_struct[0,0]
|
||||
|
||||
and:
|
||||
|
||||
.. sourcecode:: octave
|
||||
|
||||
octave:13> size(my_struct)
|
||||
ans =
|
||||
|
||||
1 1
|
||||
|
||||
So, in Matlab, the struct array must be at least 2D, and we replicate
|
||||
that when we read into Scipy. If you want all length 1 dimensions
|
||||
squeezed out, try this:
|
||||
|
||||
>>> mat_contents = sio.loadmat('octave_struct.mat', squeeze_me=True)
|
||||
>>> oct_struct = mat_contents['my_struct']
|
||||
>>> oct_struct.shape
|
||||
()
|
||||
|
||||
Sometimes, it's more convenient to load the matlab structs as python
|
||||
objects rather than numpy structured arrarys - it can make the access
|
||||
syntax in python a bit more similar to that in matlab. In order to do
|
||||
this, use the ``struct_as_record=False`` parameter to ``loadmat``.
|
||||
|
||||
>>> mat_contents = sio.loadmat('octave_struct.mat', struct_as_record=False)
|
||||
>>> oct_struct = mat_contents['my_struct']
|
||||
>>> oct_struct[0,0].field1
|
||||
array([[ 1.]])
|
||||
|
||||
``struct_as_record=False`` works nicely with ``squeeze_me``:
|
||||
|
||||
>>> mat_contents = sio.loadmat('octave_struct.mat', struct_as_record=False, squeeze_me=True)
|
||||
>>> oct_struct = mat_contents['my_struct']
|
||||
>>> oct_struct.shape # but no - it's a scalar
|
||||
Traceback (most recent call last):
|
||||
File "<stdin>", line 1, in <module>
|
||||
AttributeError: 'mat_struct' object has no attribute 'shape'
|
||||
>>> print type(oct_struct)
|
||||
<class 'scipy.io.matlab.mio5_params.mat_struct'>
|
||||
>>> print oct_struct.field1
|
||||
1.0
|
||||
|
||||
Saving struct arrays can be done in various ways. One simple method is
|
||||
to use dicts:
|
||||
|
||||
>>> a_dict = {'field1': 0.5, 'field2': 'a string'}
|
||||
>>> sio.savemat('saved_struct.mat', {'a_dict': a_dict})
|
||||
|
||||
loaded as:
|
||||
|
||||
.. sourcecode:: octave
|
||||
|
||||
octave:21> load saved_struct
|
||||
octave:22> a_dict
|
||||
a_dict =
|
||||
{
|
||||
field2 = a string
|
||||
field1 = 0.50000
|
||||
}
|
||||
|
||||
You can also save structs back again to Matlab (or Octave in our case)
|
||||
like this:
|
||||
|
||||
>>> dt = [('f1', 'f8'), ('f2', 'S10')]
|
||||
>>> arr = np.zeros((2,), dtype=dt)
|
||||
>>> print arr
|
||||
[(0.0, '') (0.0, '')]
|
||||
>>> arr[0]['f1'] = 0.5
|
||||
>>> arr[0]['f2'] = 'python'
|
||||
>>> arr[1]['f1'] = 99
|
||||
>>> arr[1]['f2'] = 'not perl'
|
||||
>>> sio.savemat('np_struct_arr.mat', {'arr': arr})
|
||||
|
||||
Matlab cell arrays
|
||||
``````````````````
|
||||
|
||||
Cell arrays in Matlab are rather like python lists, in the sense that
|
||||
the elements in the arrays can contain any type of Matlab object. In
|
||||
fact they are most similar to numpy object arrays, and that is how we
|
||||
load them into numpy.
|
||||
|
||||
.. sourcecode:: octave
|
||||
|
||||
octave:14> my_cells = {1, [2, 3]}
|
||||
my_cells =
|
||||
|
||||
{
|
||||
[1,1] = 1
|
||||
[1,2] =
|
||||
|
||||
2 3
|
||||
|
||||
}
|
||||
|
||||
octave:15> save -6 octave_cells.mat my_cells
|
||||
|
||||
Back to Python:
|
||||
|
||||
>>> mat_contents = sio.loadmat('octave_cells.mat')
|
||||
>>> oct_cells = mat_contents['my_cells']
|
||||
>>> print oct_cells.dtype
|
||||
object
|
||||
>>> val = oct_cells[0,0]
|
||||
>>> print val
|
||||
[[ 1.]]
|
||||
>>> print val.dtype
|
||||
float64
|
||||
|
||||
Saving to a Matlab cell array just involves making a numpy object array:
|
||||
|
||||
>>> obj_arr = np.zeros((2,), dtype=np.object)
|
||||
>>> obj_arr[0] = 1
|
||||
>>> obj_arr[1] = 'a string'
|
||||
>>> print obj_arr
|
||||
[1 a string]
|
||||
>>> sio.savemat('np_cells.mat', {'obj_arr':obj_arr})
|
||||
|
||||
.. sourcecode:: octave
|
||||
|
||||
octave:16> load np_cells.mat
|
||||
octave:17> obj_arr
|
||||
obj_arr =
|
||||
|
||||
{
|
||||
[1,1] = 1
|
||||
[2,1] = a string
|
||||
}
|
||||
|
||||
|
||||
Matrix Market files
|
||||
-------------------
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
mminfo
|
||||
mmread
|
||||
mmwrite
|
||||
|
||||
Other
|
||||
-----
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
save_as_module
|
||||
|
||||
Wav sound files (:mod:`scipy.io.wavfile`)
|
||||
-----------------------------------------
|
||||
|
||||
.. module:: scipy.io.wavfile
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
read
|
||||
write
|
||||
|
||||
Arff files (:mod:`scipy.io.arff`)
|
||||
---------------------------------
|
||||
|
||||
.. automodule:: scipy.io.arff
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
loadarff
|
||||
|
||||
Netcdf (:mod:`scipy.io.netcdf`)
|
||||
-------------------------------
|
||||
|
||||
.. module:: scipy.io.netcdf
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
netcdf_file
|
||||
|
||||
Allows reading of NetCDF files (version of pupynere_ package)
|
||||
|
||||
|
||||
.. _pupynere: http://pypi.python.org/pypi/pupynere/
|
||||
.. _octave: http://www.gnu.org/software/octave
|
||||
.. _matlab: http://www.mathworks.com/
|
825
pythonPackages/scipy-0.8.0/doc/source/tutorial/linalg.rst
Executable file
825
pythonPackages/scipy-0.8.0/doc/source/tutorial/linalg.rst
Executable file
|
@ -0,0 +1,825 @@
|
|||
Linear Algebra
|
||||
==============
|
||||
|
||||
.. sectionauthor:: Travis E. Oliphant
|
||||
|
||||
.. currentmodule: scipy
|
||||
|
||||
When SciPy is built using the optimized ATLAS LAPACK and BLAS
|
||||
libraries, it has very fast linear algebra capabilities. If you dig
|
||||
deep enough, all of the raw lapack and blas libraries are available
|
||||
for your use for even more speed. In this section, some easier-to-use
|
||||
interfaces to these routines are described.
|
||||
|
||||
All of these linear algebra routines expect an object that can be
|
||||
converted into a 2-dimensional array. The output of these routines is
|
||||
also a two-dimensional array. There is a matrix class defined in
|
||||
Numpy, which you can initialize with an appropriate Numpy array in
|
||||
order to get objects for which multiplication is matrix-multiplication
|
||||
instead of the default, element-by-element multiplication.
|
||||
|
||||
|
||||
Matrix Class
|
||||
------------
|
||||
|
||||
The matrix class is initialized with the SciPy command :obj:`mat`
|
||||
which is just convenient short-hand for :class:`matrix
|
||||
<numpy.matrix>`. If you are going to be doing a lot of matrix-math, it
|
||||
is convenient to convert arrays into matrices using this command. One
|
||||
advantage of using the :func:`mat` command is that you can enter
|
||||
two-dimensional matrices using MATLAB-like syntax with commas or
|
||||
spaces separating columns and semicolons separting rows as long as the
|
||||
matrix is placed in a string passed to :obj:`mat` .
|
||||
|
||||
|
||||
Basic routines
|
||||
--------------
|
||||
|
||||
|
||||
Finding Inverse
|
||||
^^^^^^^^^^^^^^^
|
||||
|
||||
The inverse of a matrix :math:`\mathbf{A}` is the matrix
|
||||
:math:`\mathbf{B}` such that :math:`\mathbf{AB}=\mathbf{I}` where
|
||||
:math:`\mathbf{I}` is the identity matrix consisting of ones down the
|
||||
main diagonal. Usually :math:`\mathbf{B}` is denoted
|
||||
:math:`\mathbf{B}=\mathbf{A}^{-1}` . In SciPy, the matrix inverse of
|
||||
the Numpy array, A, is obtained using :obj:`linalg.inv` ``(A)`` , or
|
||||
using ``A.I`` if ``A`` is a Matrix. For example, let
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ \mathbf{A=}\left[\begin{array}{ccc} 1 & 3 & 5\\ 2 & 5 & 1\\ 2 & 3 & 8\end{array}\right]\]
|
||||
|
||||
then
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ \mathbf{A^{-1}=\frac{1}{25}\left[\begin{array}{ccc} -37 & 9 & 22\\ 14 & 2 & -9\\ 4 & -3 & 1\end{array}\right]=\left[\begin{array}{ccc} -1.48 & 0.36 & 0.88\\ 0.56 & 0.08 & -0.36\\ 0.16 & -0.12 & 0.04\end{array}\right].}\]
|
||||
|
||||
The following example demonstrates this computation in SciPy
|
||||
|
||||
>>> A = mat('[1 3 5; 2 5 1; 2 3 8]')
|
||||
>>> A
|
||||
matrix([[1, 3, 5],
|
||||
[2, 5, 1],
|
||||
[2, 3, 8]])
|
||||
>>> A.I
|
||||
matrix([[-1.48, 0.36, 0.88],
|
||||
[ 0.56, 0.08, -0.36],
|
||||
[ 0.16, -0.12, 0.04]])
|
||||
>>> from scipy import linalg
|
||||
>>> linalg.inv(A)
|
||||
array([[-1.48, 0.36, 0.88],
|
||||
[ 0.56, 0.08, -0.36],
|
||||
[ 0.16, -0.12, 0.04]])
|
||||
|
||||
Solving linear system
|
||||
^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Solving linear systems of equations is straightforward using the scipy
|
||||
command :obj:`linalg.solve`. This command expects an input matrix and
|
||||
a right-hand-side vector. The solution vector is then computed. An
|
||||
option for entering a symmetrix matrix is offered which can speed up
|
||||
the processing when applicable. As an example, suppose it is desired
|
||||
to solve the following simultaneous equations:
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\begin{eqnarray*} x+3y+5z & = & 10\\ 2x+5y+z & = & 8\\ 2x+3y+8z & = & 3\end{eqnarray*}
|
||||
|
||||
We could find the solution vector using a matrix inverse:
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ \left[\begin{array}{c} x\\ y\\ z\end{array}\right]=\left[\begin{array}{ccc} 1 & 3 & 5\\ 2 & 5 & 1\\ 2 & 3 & 8\end{array}\right]^{-1}\left[\begin{array}{c} 10\\ 8\\ 3\end{array}\right]=\frac{1}{25}\left[\begin{array}{c} -232\\ 129\\ 19\end{array}\right]=\left[\begin{array}{c} -9.28\\ 5.16\\ 0.76\end{array}\right].\]
|
||||
|
||||
However, it is better to use the linalg.solve command which can be
|
||||
faster and more numerically stable. In this case it however gives the
|
||||
same answer as shown in the following example:
|
||||
|
||||
>>> A = mat('[1 3 5; 2 5 1; 2 3 8]')
|
||||
>>> b = mat('[10;8;3]')
|
||||
>>> A.I*b
|
||||
matrix([[-9.28],
|
||||
[ 5.16],
|
||||
[ 0.76]])
|
||||
>>> linalg.solve(A,b)
|
||||
array([[-9.28],
|
||||
[ 5.16],
|
||||
[ 0.76]])
|
||||
|
||||
|
||||
Finding Determinant
|
||||
^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
The determinant of a square matrix :math:`\mathbf{A}` is often denoted
|
||||
:math:`\left|\mathbf{A}\right|` and is a quantity often used in linear
|
||||
algebra. Suppose :math:`a_{ij}` are the elements of the matrix
|
||||
:math:`\mathbf{A}` and let :math:`M_{ij}=\left|\mathbf{A}_{ij}\right|`
|
||||
be the determinant of the matrix left by removing the
|
||||
:math:`i^{\textrm{th}}` row and :math:`j^{\textrm{th}}` column from
|
||||
:math:`\mathbf{A}` . Then for any row :math:`i,`
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ \left|\mathbf{A}\right|=\sum_{j}\left(-1\right)^{i+j}a_{ij}M_{ij}.\]
|
||||
|
||||
This is a recursive way to define the determinant where the base case
|
||||
is defined by accepting that the determinant of a :math:`1\times1` matrix is the only matrix element. In SciPy the determinant can be
|
||||
calculated with :obj:`linalg.det` . For example, the determinant of
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ \mathbf{A=}\left[\begin{array}{ccc} 1 & 3 & 5\\ 2 & 5 & 1\\ 2 & 3 & 8\end{array}\right]\]
|
||||
|
||||
is
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\begin{eqnarray*} \left|\mathbf{A}\right| & = & 1\left|\begin{array}{cc} 5 & 1\\ 3 & 8\end{array}\right|-3\left|\begin{array}{cc} 2 & 1\\ 2 & 8\end{array}\right|+5\left|\begin{array}{cc} 2 & 5\\ 2 & 3\end{array}\right|\\ & = & 1\left(5\cdot8-3\cdot1\right)-3\left(2\cdot8-2\cdot1\right)+5\left(2\cdot3-2\cdot5\right)=-25.\end{eqnarray*}
|
||||
|
||||
In SciPy this is computed as shown in this example:
|
||||
|
||||
>>> A = mat('[1 3 5; 2 5 1; 2 3 8]')
|
||||
>>> linalg.det(A)
|
||||
-25.000000000000004
|
||||
|
||||
|
||||
Computing norms
|
||||
^^^^^^^^^^^^^^^
|
||||
|
||||
Matrix and vector norms can also be computed with SciPy. A wide range
|
||||
of norm definitions are available using different parameters to the
|
||||
order argument of :obj:`linalg.norm` . This function takes a rank-1
|
||||
(vectors) or a rank-2 (matrices) array and an optional order argument
|
||||
(default is 2). Based on these inputs a vector or matrix norm of the
|
||||
requested order is computed.
|
||||
|
||||
For vector *x* , the order parameter can be any real number including
|
||||
``inf`` or ``-inf``. The computed norm is
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ \left\Vert \mathbf{x}\right\Vert =\left\{ \begin{array}{cc} \max\left|x_{i}\right| & \textrm{ord}=\textrm{inf}\\ \min\left|x_{i}\right| & \textrm{ord}=-\textrm{inf}\\ \left(\sum_{i}\left|x_{i}\right|^{\textrm{ord}}\right)^{1/\textrm{ord}} & \left|\textrm{ord}\right|<\infty.\end{array}\right.\]
|
||||
|
||||
|
||||
|
||||
For matrix :math:`\mathbf{A}` the only valid values for norm are :math:`\pm2,\pm1,` :math:`\pm` inf, and 'fro' (or 'f') Thus,
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ \left\Vert \mathbf{A}\right\Vert =\left\{ \begin{array}{cc} \max_{i}\sum_{j}\left|a_{ij}\right| & \textrm{ord}=\textrm{inf}\\ \min_{i}\sum_{j}\left|a_{ij}\right| & \textrm{ord}=-\textrm{inf}\\ \max_{j}\sum_{i}\left|a_{ij}\right| & \textrm{ord}=1\\ \min_{j}\sum_{i}\left|a_{ij}\right| & \textrm{ord}=-1\\ \max\sigma_{i} & \textrm{ord}=2\\ \min\sigma_{i} & \textrm{ord}=-2\\ \sqrt{\textrm{trace}\left(\mathbf{A}^{H}\mathbf{A}\right)} & \textrm{ord}=\textrm{'fro'}\end{array}\right.\]
|
||||
|
||||
where :math:`\sigma_{i}` are the singular values of :math:`\mathbf{A}` .
|
||||
|
||||
|
||||
Solving linear least-squares problems and pseudo-inverses
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Linear least-squares problems occur in many branches of applied
|
||||
mathematics. In this problem a set of linear scaling coefficients is
|
||||
sought that allow a model to fit data. In particular it is assumed
|
||||
that data :math:`y_{i}` is related to data :math:`\mathbf{x}_{i}`
|
||||
through a set of coefficients :math:`c_{j}` and model functions
|
||||
:math:`f_{j}\left(\mathbf{x}_{i}\right)` via the model
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ y_{i}=\sum_{j}c_{j}f_{j}\left(\mathbf{x}_{i}\right)+\epsilon_{i}\]
|
||||
|
||||
where :math:`\epsilon_{i}` represents uncertainty in the data. The
|
||||
strategy of least squares is to pick the coefficients :math:`c_{j}` to
|
||||
minimize
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ J\left(\mathbf{c}\right)=\sum_{i}\left|y_{i}-\sum_{j}c_{j}f_{j}\left(x_{i}\right)\right|^{2}.\]
|
||||
|
||||
|
||||
|
||||
Theoretically, a global minimum will occur when
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ \frac{\partial J}{\partial c_{n}^{*}}=0=\sum_{i}\left(y_{i}-\sum_{j}c_{j}f_{j}\left(x_{i}\right)\right)\left(-f_{n}^{*}\left(x_{i}\right)\right)\]
|
||||
|
||||
or
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\begin{eqnarray*} \sum_{j}c_{j}\sum_{i}f_{j}\left(x_{i}\right)f_{n}^{*}\left(x_{i}\right) & = & \sum_{i}y_{i}f_{n}^{*}\left(x_{i}\right)\\ \mathbf{A}^{H}\mathbf{Ac} & = & \mathbf{A}^{H}\mathbf{y}\end{eqnarray*}
|
||||
|
||||
where
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ \left\{ \mathbf{A}\right\} _{ij}=f_{j}\left(x_{i}\right).\]
|
||||
|
||||
When :math:`\mathbf{A^{H}A}` is invertible, then
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ \mathbf{c}=\left(\mathbf{A}^{H}\mathbf{A}\right)^{-1}\mathbf{A}^{H}\mathbf{y}=\mathbf{A}^{\dagger}\mathbf{y}\]
|
||||
|
||||
where :math:`\mathbf{A}^{\dagger}` is called the pseudo-inverse of
|
||||
:math:`\mathbf{A}.` Notice that using this definition of
|
||||
:math:`\mathbf{A}` the model can be written
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ \mathbf{y}=\mathbf{Ac}+\boldsymbol{\epsilon}.\]
|
||||
|
||||
The command :obj:`linalg.lstsq` will solve the linear least squares
|
||||
problem for :math:`\mathbf{c}` given :math:`\mathbf{A}` and
|
||||
:math:`\mathbf{y}` . In addition :obj:`linalg.pinv` or
|
||||
:obj:`linalg.pinv2` (uses a different method based on singular value
|
||||
decomposition) will find :math:`\mathbf{A}^{\dagger}` given
|
||||
:math:`\mathbf{A}.`
|
||||
|
||||
The following example and figure demonstrate the use of
|
||||
:obj:`linalg.lstsq` and :obj:`linalg.pinv` for solving a data-fitting
|
||||
problem. The data shown below were generated using the model:
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ y_{i}=c_{1}e^{-x_{i}}+c_{2}x_{i}\]
|
||||
|
||||
where :math:`x_{i}=0.1i` for :math:`i=1\ldots10` , :math:`c_{1}=5` ,
|
||||
and :math:`c_{2}=4.` Noise is added to :math:`y_{i}` and the
|
||||
coefficients :math:`c_{1}` and :math:`c_{2}` are estimated using
|
||||
linear least squares.
|
||||
|
||||
.. plot::
|
||||
|
||||
>>> from numpy import *
|
||||
>>> from scipy import linalg
|
||||
>>> import matplotlib.pyplot as plt
|
||||
|
||||
>>> c1,c2= 5.0,2.0
|
||||
>>> i = r_[1:11]
|
||||
>>> xi = 0.1*i
|
||||
>>> yi = c1*exp(-xi)+c2*xi
|
||||
>>> zi = yi + 0.05*max(yi)*random.randn(len(yi))
|
||||
|
||||
>>> A = c_[exp(-xi)[:,newaxis],xi[:,newaxis]]
|
||||
>>> c,resid,rank,sigma = linalg.lstsq(A,zi)
|
||||
|
||||
>>> xi2 = r_[0.1:1.0:100j]
|
||||
>>> yi2 = c[0]*exp(-xi2) + c[1]*xi2
|
||||
|
||||
>>> plt.plot(xi,zi,'x',xi2,yi2)
|
||||
>>> plt.axis([0,1.1,3.0,5.5])
|
||||
>>> plt.xlabel('$x_i$')
|
||||
>>> plt.title('Data fitting with linalg.lstsq')
|
||||
>>> plt.show()
|
||||
|
||||
.. :caption: Example of linear least-squares fit
|
||||
|
||||
Generalized inverse
|
||||
^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
The generalized inverse is calculated using the command
|
||||
:obj:`linalg.pinv` or :obj:`linalg.pinv2`. These two commands differ
|
||||
in how they compute the generalized inverse. The first uses the
|
||||
linalg.lstsq algorithm while the second uses singular value
|
||||
decomposition. Let :math:`\mathbf{A}` be an :math:`M\times N` matrix,
|
||||
then if :math:`M>N` the generalized inverse is
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ \mathbf{A}^{\dagger}=\left(\mathbf{A}^{H}\mathbf{A}\right)^{-1}\mathbf{A}^{H}\]
|
||||
|
||||
while if :math:`M<N` matrix the generalized inverse is
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ \mathbf{A}^{\#}=\mathbf{A}^{H}\left(\mathbf{A}\mathbf{A}^{H}\right)^{-1}.\]
|
||||
|
||||
In both cases for :math:`M=N` , then
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ \mathbf{A}^{\dagger}=\mathbf{A}^{\#}=\mathbf{A}^{-1}\]
|
||||
|
||||
as long as :math:`\mathbf{A}` is invertible.
|
||||
|
||||
|
||||
Decompositions
|
||||
--------------
|
||||
|
||||
In many applications it is useful to decompose a matrix using other
|
||||
representations. There are several decompositions supported by SciPy.
|
||||
|
||||
|
||||
Eigenvalues and eigenvectors
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
The eigenvalue-eigenvector problem is one of the most commonly
|
||||
employed linear algebra operations. In one popular form, the
|
||||
eigenvalue-eigenvector problem is to find for some square matrix
|
||||
:math:`\mathbf{A}` scalars :math:`\lambda` and corresponding vectors
|
||||
:math:`\mathbf{v}` such that
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ \mathbf{Av}=\lambda\mathbf{v}.\]
|
||||
|
||||
For an :math:`N\times N` matrix, there are :math:`N` (not necessarily
|
||||
distinct) eigenvalues --- roots of the (characteristic) polynomial
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ \left|\mathbf{A}-\lambda\mathbf{I}\right|=0.\]
|
||||
|
||||
The eigenvectors, :math:`\mathbf{v}` , are also sometimes called right
|
||||
eigenvectors to distinguish them from another set of left eigenvectors
|
||||
that satisfy
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ \mathbf{v}_{L}^{H}\mathbf{A}=\lambda\mathbf{v}_{L}^{H}\]
|
||||
|
||||
or
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ \mathbf{A}^{H}\mathbf{v}_{L}=\lambda^{*}\mathbf{v}_{L}.\]
|
||||
|
||||
With it's default optional arguments, the command :obj:`linalg.eig`
|
||||
returns :math:`\lambda` and :math:`\mathbf{v}.` However, it can also
|
||||
return :math:`\mathbf{v}_{L}` and just :math:`\lambda` by itself (
|
||||
:obj:`linalg.eigvals` returns just :math:`\lambda` as well).
|
||||
|
||||
In addtion, :obj:`linalg.eig` can also solve the more general eigenvalue problem
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\begin{eqnarray*} \mathbf{Av} & = & \lambda\mathbf{Bv}\\ \mathbf{A}^{H}\mathbf{v}_{L} & = & \lambda^{*}\mathbf{B}^{H}\mathbf{v}_{L}\end{eqnarray*}
|
||||
|
||||
for square matrices :math:`\mathbf{A}` and :math:`\mathbf{B}.` The
|
||||
standard eigenvalue problem is an example of the general eigenvalue
|
||||
problem for :math:`\mathbf{B}=\mathbf{I}.` When a generalized
|
||||
eigenvalue problem can be solved, then it provides a decomposition of
|
||||
:math:`\mathbf{A}` as
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ \mathbf{A}=\mathbf{BV}\boldsymbol{\Lambda}\mathbf{V}^{-1}\]
|
||||
|
||||
where :math:`\mathbf{V}` is the collection of eigenvectors into
|
||||
columns and :math:`\boldsymbol{\Lambda}` is a diagonal matrix of
|
||||
eigenvalues.
|
||||
|
||||
By definition, eigenvectors are only defined up to a constant scale
|
||||
factor. In SciPy, the scaling factor for the eigenvectors is chosen so
|
||||
that :math:`\left\Vert \mathbf{v}\right\Vert
|
||||
^{2}=\sum_{i}v_{i}^{2}=1.`
|
||||
|
||||
As an example, consider finding the eigenvalues and eigenvectors of
|
||||
the matrix
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ \mathbf{A}=\left[\begin{array}{ccc} 1 & 5 & 2\\ 2 & 4 & 1\\ 3 & 6 & 2\end{array}\right].\]
|
||||
|
||||
The characteristic polynomial is
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\begin{eqnarray*} \left|\mathbf{A}-\lambda\mathbf{I}\right| & = & \left(1-\lambda\right)\left[\left(4-\lambda\right)\left(2-\lambda\right)-6\right]-\\ & & 5\left[2\left(2-\lambda\right)-3\right]+2\left[12-3\left(4-\lambda\right)\right]\\ & = & -\lambda^{3}+7\lambda^{2}+8\lambda-3.\end{eqnarray*}
|
||||
|
||||
The roots of this polynomial are the eigenvalues of :math:`\mathbf{A}` :
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\begin{eqnarray*} \lambda_{1} & = & 7.9579\\ \lambda_{2} & = & -1.2577\\ \lambda_{3} & = & 0.2997.\end{eqnarray*}
|
||||
|
||||
The eigenvectors corresponding to each eigenvalue can be found using
|
||||
the original equation. The eigenvectors associated with these
|
||||
eigenvalues can then be found.
|
||||
|
||||
>>> from scipy import linalg
|
||||
>>> A = mat('[1 5 2; 2 4 1; 3 6 2]')
|
||||
>>> la,v = linalg.eig(A)
|
||||
>>> l1,l2,l3 = la
|
||||
>>> print l1, l2, l3
|
||||
(7.95791620491+0j) (-1.25766470568+0j) (0.299748500767+0j)
|
||||
|
||||
>>> print v[:,0]
|
||||
[-0.5297175 -0.44941741 -0.71932146]
|
||||
>>> print v[:,1]
|
||||
[-0.90730751 0.28662547 0.30763439]
|
||||
>>> print v[:,2]
|
||||
[ 0.28380519 -0.39012063 0.87593408]
|
||||
>>> print sum(abs(v**2),axis=0)
|
||||
[ 1. 1. 1.]
|
||||
|
||||
>>> v1 = mat(v[:,0]).T
|
||||
>>> print max(ravel(abs(A*v1-l1*v1)))
|
||||
8.881784197e-16
|
||||
|
||||
|
||||
Singular value decomposition
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Singular Value Decompostion (SVD) can be thought of as an extension of
|
||||
the eigenvalue problem to matrices that are not square. Let
|
||||
:math:`\mathbf{A}` be an :math:`M\times N` matrix with :math:`M` and
|
||||
:math:`N` arbitrary. The matrices :math:`\mathbf{A}^{H}\mathbf{A}` and
|
||||
:math:`\mathbf{A}\mathbf{A}^{H}` are square hermitian matrices [#]_ of
|
||||
size :math:`N\times N` and :math:`M\times M` respectively. It is known
|
||||
that the eigenvalues of square hermitian matrices are real and
|
||||
non-negative. In addtion, there are at most
|
||||
:math:`\min\left(M,N\right)` identical non-zero eigenvalues of
|
||||
:math:`\mathbf{A}^{H}\mathbf{A}` and :math:`\mathbf{A}\mathbf{A}^{H}.`
|
||||
Define these positive eigenvalues as :math:`\sigma_{i}^{2}.` The
|
||||
square-root of these are called singular values of :math:`\mathbf{A}.`
|
||||
The eigenvectors of :math:`\mathbf{A}^{H}\mathbf{A}` are collected by
|
||||
columns into an :math:`N\times N` unitary [#]_ matrix
|
||||
:math:`\mathbf{V}` while the eigenvectors of
|
||||
:math:`\mathbf{A}\mathbf{A}^{H}` are collected by columns in the
|
||||
unitary matrix :math:`\mathbf{U}` , the singular values are collected
|
||||
in an :math:`M\times N` zero matrix
|
||||
:math:`\mathbf{\boldsymbol{\Sigma}}` with main diagonal entries set to
|
||||
the singular values. Then
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ \mathbf{A=U}\boldsymbol{\Sigma}\mathbf{V}^{H}\]
|
||||
|
||||
is the singular-value decomposition of :math:`\mathbf{A}.` Every
|
||||
matrix has a singular value decomposition. Sometimes, the singular
|
||||
values are called the spectrum of :math:`\mathbf{A}.` The command
|
||||
:obj:`linalg.svd` will return :math:`\mathbf{U}` ,
|
||||
:math:`\mathbf{V}^{H}` , and :math:`\sigma_{i}` as an array of the
|
||||
singular values. To obtain the matrix :math:`\mathbf{\Sigma}` use
|
||||
:obj:`linalg.diagsvd`. The following example illustrates the use of
|
||||
:obj:`linalg.svd` .
|
||||
|
||||
>>> A = mat('[1 3 2; 1 2 3]')
|
||||
>>> M,N = A.shape
|
||||
>>> U,s,Vh = linalg.svd(A)
|
||||
>>> Sig = mat(linalg.diagsvd(s,M,N))
|
||||
>>> U, Vh = mat(U), mat(Vh)
|
||||
>>> print U
|
||||
[[-0.70710678 -0.70710678]
|
||||
[-0.70710678 0.70710678]]
|
||||
>>> print Sig
|
||||
[[ 5.19615242 0. 0. ]
|
||||
[ 0. 1. 0. ]]
|
||||
>>> print Vh
|
||||
[[ -2.72165527e-01 -6.80413817e-01 -6.80413817e-01]
|
||||
[ -6.18652536e-16 -7.07106781e-01 7.07106781e-01]
|
||||
[ -9.62250449e-01 1.92450090e-01 1.92450090e-01]]
|
||||
|
||||
>>> print A
|
||||
[[1 3 2]
|
||||
[1 2 3]]
|
||||
>>> print U*Sig*Vh
|
||||
[[ 1. 3. 2.]
|
||||
[ 1. 2. 3.]]
|
||||
|
||||
.. [#] A hermitian matrix :math:`\mathbf{D}` satisfies :math:`\mathbf{D}^{H}=\mathbf{D}.`
|
||||
|
||||
.. [#] A unitary matrix :math:`\mathbf{D}` satisfies :math:`\mathbf{D}^{H}\mathbf{D}=\mathbf{I}=\mathbf{D}\mathbf{D}^{H}` so that :math:`\mathbf{D}^{-1}=\mathbf{D}^{H}.`
|
||||
|
||||
|
||||
LU decomposition
|
||||
^^^^^^^^^^^^^^^^
|
||||
|
||||
The LU decompostion finds a representation for the :math:`M\times N` matrix :math:`\mathbf{A}` as
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ \mathbf{A}=\mathbf{PLU}\]
|
||||
|
||||
where :math:`\mathbf{P}` is an :math:`M\times M` permutation matrix (a
|
||||
permutation of the rows of the identity matrix), :math:`\mathbf{L}` is
|
||||
in :math:`M\times K` lower triangular or trapezoidal matrix (
|
||||
:math:`K=\min\left(M,N\right)` ) with unit-diagonal, and
|
||||
:math:`\mathbf{U}` is an upper triangular or trapezoidal matrix. The
|
||||
SciPy command for this decomposition is :obj:`linalg.lu` .
|
||||
|
||||
Such a decomposition is often useful for solving many simultaneous
|
||||
equations where the left-hand-side does not change but the right hand
|
||||
side does. For example, suppose we are going to solve
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ \mathbf{A}\mathbf{x}_{i}=\mathbf{b}_{i}\]
|
||||
|
||||
for many different :math:`\mathbf{b}_{i}` . The LU decomposition allows this to be written as
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ \mathbf{PLUx}_{i}=\mathbf{b}_{i}.\]
|
||||
|
||||
Because :math:`\mathbf{L}` is lower-triangular, the equation can be
|
||||
solved for :math:`\mathbf{U}\mathbf{x}_{i}` and finally
|
||||
:math:`\mathbf{x}_{i}` very rapidly using forward- and
|
||||
back-substitution. An initial time spent factoring :math:`\mathbf{A}`
|
||||
allows for very rapid solution of similar systems of equations in the
|
||||
future. If the intent for performing LU decomposition is for solving
|
||||
linear systems then the command :obj:`linalg.lu_factor` should be used
|
||||
followed by repeated applications of the command
|
||||
:obj:`linalg.lu_solve` to solve the system for each new
|
||||
right-hand-side.
|
||||
|
||||
|
||||
Cholesky decomposition
|
||||
^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Cholesky decomposition is a special case of LU decomposition
|
||||
applicable to Hermitian positive definite matrices. When
|
||||
:math:`\mathbf{A}=\mathbf{A}^{H}` and
|
||||
:math:`\mathbf{x}^{H}\mathbf{Ax}\geq0` for all :math:`\mathbf{x}` ,
|
||||
then decompositions of :math:`\mathbf{A}` can be found so that
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\begin{eqnarray*} \mathbf{A} & = & \mathbf{U}^{H}\mathbf{U}\\ \mathbf{A} & = & \mathbf{L}\mathbf{L}^{H}\end{eqnarray*}
|
||||
|
||||
where :math:`\mathbf{L}` is lower-triangular and :math:`\mathbf{U}` is
|
||||
upper triangular. Notice that :math:`\mathbf{L}=\mathbf{U}^{H}.` The
|
||||
command :obj:`linagl.cholesky` computes the cholesky
|
||||
factorization. For using cholesky factorization to solve systems of
|
||||
equations there are also :obj:`linalg.cho_factor` and
|
||||
:obj:`linalg.cho_solve` routines that work similarly to their LU
|
||||
decomposition counterparts.
|
||||
|
||||
|
||||
QR decomposition
|
||||
^^^^^^^^^^^^^^^^
|
||||
|
||||
The QR decomposition (sometimes called a polar decomposition) works
|
||||
for any :math:`M\times N` array and finds an :math:`M\times M` unitary
|
||||
matrix :math:`\mathbf{Q}` and an :math:`M\times N` upper-trapezoidal
|
||||
matrix :math:`\mathbf{R}` such that
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ \mathbf{A=QR}.\]
|
||||
|
||||
Notice that if the SVD of :math:`\mathbf{A}` is known then the QR decomposition can be found
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ \mathbf{A}=\mathbf{U}\boldsymbol{\Sigma}\mathbf{V}^{H}=\mathbf{QR}\]
|
||||
|
||||
implies that :math:`\mathbf{Q}=\mathbf{U}` and
|
||||
:math:`\mathbf{R}=\boldsymbol{\Sigma}\mathbf{V}^{H}.` Note, however,
|
||||
that in SciPy independent algorithms are used to find QR and SVD
|
||||
decompositions. The command for QR decomposition is :obj:`linalg.qr` .
|
||||
|
||||
|
||||
Schur decomposition
|
||||
^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
For a square :math:`N\times N` matrix, :math:`\mathbf{A}` , the Schur
|
||||
decomposition finds (not-necessarily unique) matrices
|
||||
:math:`\mathbf{T}` and :math:`\mathbf{Z}` such that
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ \mathbf{A}=\mathbf{ZT}\mathbf{Z}^{H}\]
|
||||
|
||||
where :math:`\mathbf{Z}` is a unitary matrix and :math:`\mathbf{T}` is
|
||||
either upper-triangular or quasi-upper triangular depending on whether
|
||||
or not a real schur form or complex schur form is requested. For a
|
||||
real schur form both :math:`\mathbf{T}` and :math:`\mathbf{Z}` are
|
||||
real-valued when :math:`\mathbf{A}` is real-valued. When
|
||||
:math:`\mathbf{A}` is a real-valued matrix the real schur form is only
|
||||
quasi-upper triangular because :math:`2\times2` blocks extrude from
|
||||
the main diagonal corresponding to any complex- valued
|
||||
eigenvalues. The command :obj:`linalg.schur` finds the Schur
|
||||
decomposition while the command :obj:`linalg.rsf2csf` converts
|
||||
:math:`\mathbf{T}` and :math:`\mathbf{Z}` from a real Schur form to a
|
||||
complex Schur form. The Schur form is especially useful in calculating
|
||||
functions of matrices.
|
||||
|
||||
The following example illustrates the schur decomposition:
|
||||
|
||||
>>> from scipy import linalg
|
||||
>>> A = mat('[1 3 2; 1 4 5; 2 3 6]')
|
||||
>>> T,Z = linalg.schur(A)
|
||||
>>> T1,Z1 = linalg.schur(A,'complex')
|
||||
>>> T2,Z2 = linalg.rsf2csf(T,Z)
|
||||
>>> print T
|
||||
[[ 9.90012467 1.78947961 -0.65498528]
|
||||
[ 0. 0.54993766 -1.57754789]
|
||||
[ 0. 0.51260928 0.54993766]]
|
||||
>>> print T2
|
||||
[[ 9.90012467 +0.00000000e+00j -0.32436598 +1.55463542e+00j
|
||||
-0.88619748 +5.69027615e-01j]
|
||||
[ 0.00000000 +0.00000000e+00j 0.54993766 +8.99258408e-01j
|
||||
1.06493862 +1.37016050e-17j]
|
||||
[ 0.00000000 +0.00000000e+00j 0.00000000 +0.00000000e+00j
|
||||
0.54993766 -8.99258408e-01j]]
|
||||
>>> print abs(T1-T2) # different
|
||||
[[ 1.24357637e-14 2.09205364e+00 6.56028192e-01]
|
||||
[ 0.00000000e+00 4.00296604e-16 1.83223097e+00]
|
||||
[ 0.00000000e+00 0.00000000e+00 4.57756680e-16]]
|
||||
>>> print abs(Z1-Z2) # different
|
||||
[[ 0.06833781 1.10591375 0.23662249]
|
||||
[ 0.11857169 0.5585604 0.29617525]
|
||||
[ 0.12624999 0.75656818 0.22975038]]
|
||||
>>> T,Z,T1,Z1,T2,Z2 = map(mat,(T,Z,T1,Z1,T2,Z2))
|
||||
>>> print abs(A-Z*T*Z.H) # same
|
||||
[[ 1.11022302e-16 4.44089210e-16 4.44089210e-16]
|
||||
[ 4.44089210e-16 1.33226763e-15 8.88178420e-16]
|
||||
[ 8.88178420e-16 4.44089210e-16 2.66453526e-15]]
|
||||
>>> print abs(A-Z1*T1*Z1.H) # same
|
||||
[[ 1.00043248e-15 2.22301403e-15 5.55749485e-15]
|
||||
[ 2.88899660e-15 8.44927041e-15 9.77322008e-15]
|
||||
[ 3.11291538e-15 1.15463228e-14 1.15464861e-14]]
|
||||
>>> print abs(A-Z2*T2*Z2.H) # same
|
||||
[[ 3.34058710e-16 8.88611201e-16 4.18773089e-18]
|
||||
[ 1.48694940e-16 8.95109973e-16 8.92966151e-16]
|
||||
[ 1.33228956e-15 1.33582317e-15 3.55373104e-15]]
|
||||
|
||||
Matrix Functions
|
||||
----------------
|
||||
|
||||
Consider the function :math:`f\left(x\right)` with Taylor series expansion
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ f\left(x\right)=\sum_{k=0}^{\infty}\frac{f^{\left(k\right)}\left(0\right)}{k!}x^{k}.\]
|
||||
|
||||
A matrix function can be defined using this Taylor series for the
|
||||
square matrix :math:`\mathbf{A}` as
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ f\left(\mathbf{A}\right)=\sum_{k=0}^{\infty}\frac{f^{\left(k\right)}\left(0\right)}{k!}\mathbf{A}^{k}.\]
|
||||
|
||||
While, this serves as a useful representation of a matrix function, it
|
||||
is rarely the best way to calculate a matrix function.
|
||||
|
||||
|
||||
Exponential and logarithm functions
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
The matrix exponential is one of the more common matrix functions. It
|
||||
can be defined for square matrices as
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ e^{\mathbf{A}}=\sum_{k=0}^{\infty}\frac{1}{k!}\mathbf{A}^{k}.\]
|
||||
|
||||
The command :obj:`linalg.expm3` uses this Taylor series definition to compute the matrix exponential.
|
||||
Due to poor convergence properties it is not often used.
|
||||
|
||||
Another method to compute the matrix exponential is to find an
|
||||
eigenvalue decomposition of :math:`\mathbf{A}` :
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ \mathbf{A}=\mathbf{V}\boldsymbol{\Lambda}\mathbf{V}^{-1}\]
|
||||
|
||||
and note that
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ e^{\mathbf{A}}=\mathbf{V}e^{\boldsymbol{\Lambda}}\mathbf{V}^{-1}\]
|
||||
|
||||
where the matrix exponential of the diagonal matrix :math:`\boldsymbol{\Lambda}` is just the exponential of its elements. This method is implemented in :obj:`linalg.expm2` .
|
||||
|
||||
The preferred method for implementing the matrix exponential is to use
|
||||
scaling and a Padé approximation for :math:`e^{x}` . This algorithm is
|
||||
implemented as :obj:`linalg.expm` .
|
||||
|
||||
The inverse of the matrix exponential is the matrix logarithm defined
|
||||
as the inverse of the matrix exponential.
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ \mathbf{A}\equiv\exp\left(\log\left(\mathbf{A}\right)\right).\]
|
||||
|
||||
The matrix logarithm can be obtained with :obj:`linalg.logm` .
|
||||
|
||||
|
||||
Trigonometric functions
|
||||
^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
The trigonometric functions :math:`\sin` , :math:`\cos` , and
|
||||
:math:`\tan` are implemented for matrices in :func:`linalg.sinm`,
|
||||
:func:`linalg.cosm`, and :obj:`linalg.tanm` respectively. The matrix
|
||||
sin and cosine can be defined using Euler's identity as
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\begin{eqnarray*} \sin\left(\mathbf{A}\right) & = & \frac{e^{j\mathbf{A}}-e^{-j\mathbf{A}}}{2j}\\ \cos\left(\mathbf{A}\right) & = & \frac{e^{j\mathbf{A}}+e^{-j\mathbf{A}}}{2}.\end{eqnarray*}
|
||||
|
||||
The tangent is
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ \tan\left(x\right)=\frac{\sin\left(x\right)}{\cos\left(x\right)}=\left[\cos\left(x\right)\right]^{-1}\sin\left(x\right)\]
|
||||
|
||||
and so the matrix tangent is defined as
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ \left[\cos\left(\mathbf{A}\right)\right]^{-1}\sin\left(\mathbf{A}\right).\]
|
||||
|
||||
|
||||
|
||||
|
||||
Hyperbolic trigonometric functions
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
The hyperbolic trigonemetric functions :math:`\sinh` , :math:`\cosh` ,
|
||||
and :math:`\tanh` can also be defined for matrices using the familiar
|
||||
definitions:
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\begin{eqnarray*} \sinh\left(\mathbf{A}\right) & = & \frac{e^{\mathbf{A}}-e^{-\mathbf{A}}}{2}\\ \cosh\left(\mathbf{A}\right) & = & \frac{e^{\mathbf{A}}+e^{-\mathbf{A}}}{2}\\ \tanh\left(\mathbf{A}\right) & = & \left[\cosh\left(\mathbf{A}\right)\right]^{-1}\sinh\left(\mathbf{A}\right).\end{eqnarray*}
|
||||
|
||||
These matrix functions can be found using :obj:`linalg.sinhm`,
|
||||
:obj:`linalg.coshm` , and :obj:`linalg.tanhm`.
|
||||
|
||||
|
||||
Arbitrary function
|
||||
^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Finally, any arbitrary function that takes one complex number and
|
||||
returns a complex number can be called as a matrix function using the
|
||||
command :obj:`linalg.funm`. This command takes the matrix and an
|
||||
arbitrary Python function. It then implements an algorithm from Golub
|
||||
and Van Loan's book "Matrix Computations "to compute function applied
|
||||
to the matrix using a Schur decomposition. Note that *the function
|
||||
needs to accept complex numbers* as input in order to work with this
|
||||
algorithm. For example the following code computes the zeroth-order
|
||||
Bessel function applied to a matrix.
|
||||
|
||||
>>> from scipy import special, random, linalg
|
||||
>>> A = random.rand(3,3)
|
||||
>>> B = linalg.funm(A,lambda x: special.jv(0,x))
|
||||
>>> print A
|
||||
[[ 0.72578091 0.34105276 0.79570345]
|
||||
[ 0.65767207 0.73855618 0.541453 ]
|
||||
[ 0.78397086 0.68043507 0.4837898 ]]
|
||||
>>> print B
|
||||
[[ 0.72599893 -0.20545711 -0.22721101]
|
||||
[-0.27426769 0.77255139 -0.23422637]
|
||||
[-0.27612103 -0.21754832 0.7556849 ]]
|
||||
>>> print linalg.eigvals(A)
|
||||
[ 1.91262611+0.j 0.21846476+0.j -0.18296399+0.j]
|
||||
>>> print special.jv(0, linalg.eigvals(A))
|
||||
[ 0.27448286+0.j 0.98810383+0.j 0.99164854+0.j]
|
||||
>>> print linalg.eigvals(B)
|
||||
[ 0.27448286+0.j 0.98810383+0.j 0.99164854+0.j]
|
||||
|
||||
Note how, by virtue of how matrix analytic functions are defined,
|
||||
the Bessel function has acted on the matrix eigenvalues.
|
||||
|
1808
pythonPackages/scipy-0.8.0/doc/source/tutorial/ndimage.rst
Executable file
1808
pythonPackages/scipy-0.8.0/doc/source/tutorial/ndimage.rst
Executable file
File diff suppressed because it is too large
Load diff
BIN
pythonPackages/scipy-0.8.0/doc/source/tutorial/octave_a.mat
Executable file
BIN
pythonPackages/scipy-0.8.0/doc/source/tutorial/octave_a.mat
Executable file
Binary file not shown.
BIN
pythonPackages/scipy-0.8.0/doc/source/tutorial/octave_cells.mat
Executable file
BIN
pythonPackages/scipy-0.8.0/doc/source/tutorial/octave_cells.mat
Executable file
Binary file not shown.
BIN
pythonPackages/scipy-0.8.0/doc/source/tutorial/octave_struct.mat
Executable file
BIN
pythonPackages/scipy-0.8.0/doc/source/tutorial/octave_struct.mat
Executable file
Binary file not shown.
637
pythonPackages/scipy-0.8.0/doc/source/tutorial/optimize.rst
Executable file
637
pythonPackages/scipy-0.8.0/doc/source/tutorial/optimize.rst
Executable file
|
@ -0,0 +1,637 @@
|
|||
Optimization (optimize)
|
||||
=======================
|
||||
|
||||
.. sectionauthor:: Travis E. Oliphant
|
||||
|
||||
.. currentmodule:: scipy.optimize
|
||||
|
||||
There are several classical optimization algorithms provided by SciPy
|
||||
in the :mod:`scipy.optimize` package. An overview of the module is
|
||||
available using :func:`help` (or :func:`pydoc.help`):
|
||||
|
||||
.. literalinclude:: examples/5-1
|
||||
|
||||
The first four algorithms are unconstrained minimization algorithms
|
||||
(:func:`fmin`: Nelder-Mead simplex, :func:`fmin_bfgs`: BFGS,
|
||||
:func:`fmin_ncg`: Newton Conjugate Gradient, and :func:`leastsq`:
|
||||
Levenburg-Marquardt). The last algorithm actually finds the roots of a
|
||||
general function of possibly many variables. It is included in the
|
||||
optimization package because at the (non-boundary) extreme points of a
|
||||
function, the gradient is equal to zero.
|
||||
|
||||
|
||||
Nelder-Mead Simplex algorithm (:func:`fmin`)
|
||||
--------------------------------------------
|
||||
|
||||
The simplex algorithm is probably the simplest way to minimize a
|
||||
fairly well-behaved function. The simplex algorithm requires only
|
||||
function evaluations and is a good choice for simple minimization
|
||||
problems. However, because it does not use any gradient evaluations,
|
||||
it may take longer to find the minimum. To demonstrate the
|
||||
minimization function consider the problem of minimizing the
|
||||
Rosenbrock function of :math:`N` variables:
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ f\left(\mathbf{x}\right)=\sum_{i=1}^{N-1}100\left(x_{i}-x_{i-1}^{2}\right)^{2}+\left(1-x_{i-1}\right)^{2}.\]
|
||||
|
||||
The minimum value of this function is 0 which is achieved when :math:`x_{i}=1.` This minimum can be found using the :obj:`fmin` routine as shown in the example below:
|
||||
|
||||
>>> from scipy.optimize import fmin
|
||||
>>> def rosen(x):
|
||||
... """The Rosenbrock function"""
|
||||
... return sum(100.0*(x[1:]-x[:-1]**2.0)**2.0 + (1-x[:-1])**2.0)
|
||||
|
||||
>>> x0 = [1.3, 0.7, 0.8, 1.9, 1.2]
|
||||
>>> xopt = fmin(rosen, x0, xtol=1e-8)
|
||||
Optimization terminated successfully.
|
||||
Current function value: 0.000000
|
||||
Iterations: 339
|
||||
Function evaluations: 571
|
||||
|
||||
>>> print xopt
|
||||
[ 1. 1. 1. 1. 1.]
|
||||
|
||||
Another optimization algorithm that needs only function calls to find
|
||||
the minimum is Powell's method available as :func:`fmin_powell`.
|
||||
|
||||
|
||||
Broyden-Fletcher-Goldfarb-Shanno algorithm (:func:`fmin_bfgs`)
|
||||
--------------------------------------------------------------
|
||||
|
||||
In order to converge more quickly to the solution, this routine uses
|
||||
the gradient of the objective function. If the gradient is not given
|
||||
by the user, then it is estimated using first-differences. The
|
||||
Broyden-Fletcher-Goldfarb-Shanno (BFGS) method typically requires
|
||||
fewer function calls than the simplex algorithm even when the gradient
|
||||
must be estimated.
|
||||
|
||||
To demonstrate this algorithm, the Rosenbrock function is again used.
|
||||
The gradient of the Rosenbrock function is the vector:
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\begin{eqnarray*} \frac{\partial f}{\partial x_{j}} & = & \sum_{i=1}^{N}200\left(x_{i}-x_{i-1}^{2}\right)\left(\delta_{i,j}-2x_{i-1}\delta_{i-1,j}\right)-2\left(1-x_{i-1}\right)\delta_{i-1,j}.\\ & = & 200\left(x_{j}-x_{j-1}^{2}\right)-400x_{j}\left(x_{j+1}-x_{j}^{2}\right)-2\left(1-x_{j}\right).\end{eqnarray*}
|
||||
|
||||
This expression is valid for the interior derivatives. Special cases
|
||||
are
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\begin{eqnarray*} \frac{\partial f}{\partial x_{0}} & = & -400x_{0}\left(x_{1}-x_{0}^{2}\right)-2\left(1-x_{0}\right),\\ \frac{\partial f}{\partial x_{N-1}} & = & 200\left(x_{N-1}-x_{N-2}^{2}\right).\end{eqnarray*}
|
||||
|
||||
A Python function which computes this gradient is constructed by the
|
||||
code-segment:
|
||||
|
||||
>>> def rosen_der(x):
|
||||
... xm = x[1:-1]
|
||||
... xm_m1 = x[:-2]
|
||||
... xm_p1 = x[2:]
|
||||
... der = zeros_like(x)
|
||||
... der[1:-1] = 200*(xm-xm_m1**2) - 400*(xm_p1 - xm**2)*xm - 2*(1-xm)
|
||||
... der[0] = -400*x[0]*(x[1]-x[0]**2) - 2*(1-x[0])
|
||||
... der[-1] = 200*(x[-1]-x[-2]**2)
|
||||
... return der
|
||||
|
||||
The calling signature for the BFGS minimization algorithm is similar
|
||||
to :obj:`fmin` with the addition of the *fprime* argument. An example
|
||||
usage of :obj:`fmin_bfgs` is shown in the following example which
|
||||
minimizes the Rosenbrock function.
|
||||
|
||||
>>> from scipy.optimize import fmin_bfgs
|
||||
|
||||
>>> x0 = [1.3, 0.7, 0.8, 1.9, 1.2]
|
||||
>>> xopt = fmin_bfgs(rosen, x0, fprime=rosen_der)
|
||||
Optimization terminated successfully.
|
||||
Current function value: 0.000000
|
||||
Iterations: 53
|
||||
Function evaluations: 65
|
||||
Gradient evaluations: 65
|
||||
>>> print xopt
|
||||
[ 1. 1. 1. 1. 1.]
|
||||
|
||||
|
||||
Newton-Conjugate-Gradient (:func:`fmin_ncg`)
|
||||
--------------------------------------------
|
||||
|
||||
The method which requires the fewest function calls and is therefore
|
||||
often the fastest method to minimize functions of many variables is
|
||||
:obj:`fmin_ncg`. This method is a modified Newton's method and uses a
|
||||
conjugate gradient algorithm to (approximately) invert the local
|
||||
Hessian. Newton's method is based on fitting the function locally to
|
||||
a quadratic form:
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ f\left(\mathbf{x}\right)\approx f\left(\mathbf{x}_{0}\right)+\nabla f\left(\mathbf{x}_{0}\right)\cdot\left(\mathbf{x}-\mathbf{x}_{0}\right)+\frac{1}{2}\left(\mathbf{x}-\mathbf{x}_{0}\right)^{T}\mathbf{H}\left(\mathbf{x}_{0}\right)\left(\mathbf{x}-\mathbf{x}_{0}\right).\]
|
||||
|
||||
where :math:`\mathbf{H}\left(\mathbf{x}_{0}\right)` is a matrix of second-derivatives (the Hessian). If the Hessian is
|
||||
positive definite then the local minimum of this function can be found
|
||||
by setting the gradient of the quadratic form to zero, resulting in
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ \mathbf{x}_{\textrm{opt}}=\mathbf{x}_{0}-\mathbf{H}^{-1}\nabla f.\]
|
||||
|
||||
The inverse of the Hessian is evaluted using the conjugate-gradient
|
||||
method. An example of employing this method to minimizing the
|
||||
Rosenbrock function is given below. To take full advantage of the
|
||||
NewtonCG method, a function which computes the Hessian must be
|
||||
provided. The Hessian matrix itself does not need to be constructed,
|
||||
only a vector which is the product of the Hessian with an arbitrary
|
||||
vector needs to be available to the minimization routine. As a result,
|
||||
the user can provide either a function to compute the Hessian matrix,
|
||||
or a function to compute the product of the Hessian with an arbitrary
|
||||
vector.
|
||||
|
||||
|
||||
Full Hessian example:
|
||||
^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
The Hessian of the Rosenbrock function is
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\begin{eqnarray*} H_{ij}=\frac{\partial^{2}f}{\partial x_{i}\partial x_{j}} & = & 200\left(\delta_{i,j}-2x_{i-1}\delta_{i-1,j}\right)-400x_{i}\left(\delta_{i+1,j}-2x_{i}\delta_{i,j}\right)-400\delta_{i,j}\left(x_{i+1}-x_{i}^{2}\right)+2\delta_{i,j},\\ & = & \left(202+1200x_{i}^{2}-400x_{i+1}\right)\delta_{i,j}-400x_{i}\delta_{i+1,j}-400x_{i-1}\delta_{i-1,j},\end{eqnarray*}
|
||||
|
||||
if :math:`i,j\in\left[1,N-2\right]` with :math:`i,j\in\left[0,N-1\right]` defining the :math:`N\times N` matrix. Other non-zero entries of the matrix are
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\begin{eqnarray*} \frac{\partial^{2}f}{\partial x_{0}^{2}} & = & 1200x_{0}^{2}-400x_{1}+2,\\ \frac{\partial^{2}f}{\partial x_{0}\partial x_{1}}=\frac{\partial^{2}f}{\partial x_{1}\partial x_{0}} & = & -400x_{0},\\ \frac{\partial^{2}f}{\partial x_{N-1}\partial x_{N-2}}=\frac{\partial^{2}f}{\partial x_{N-2}\partial x_{N-1}} & = & -400x_{N-2},\\ \frac{\partial^{2}f}{\partial x_{N-1}^{2}} & = & 200.\end{eqnarray*}
|
||||
|
||||
For example, the Hessian when :math:`N=5` is
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ \mathbf{H}=\left[\begin{array}{ccccc} 1200x_{0}^{2}-400x_{1}+2 & -400x_{0} & 0 & 0 & 0\\ -400x_{0} & 202+1200x_{1}^{2}-400x_{2} & -400x_{1} & 0 & 0\\ 0 & -400x_{1} & 202+1200x_{2}^{2}-400x_{3} & -400x_{2} & 0\\ 0 & & -400x_{2} & 202+1200x_{3}^{2}-400x_{4} & -400x_{3}\\ 0 & 0 & 0 & -400x_{3} & 200\end{array}\right].\]
|
||||
|
||||
The code which computes this Hessian along with the code to minimize
|
||||
the function using :obj:`fmin_ncg` is shown in the following example:
|
||||
|
||||
>>> from scipy.optimize import fmin_ncg
|
||||
>>> def rosen_hess(x):
|
||||
... x = asarray(x)
|
||||
... H = diag(-400*x[:-1],1) - diag(400*x[:-1],-1)
|
||||
... diagonal = zeros_like(x)
|
||||
... diagonal[0] = 1200*x[0]-400*x[1]+2
|
||||
... diagonal[-1] = 200
|
||||
... diagonal[1:-1] = 202 + 1200*x[1:-1]**2 - 400*x[2:]
|
||||
... H = H + diag(diagonal)
|
||||
... return H
|
||||
|
||||
>>> x0 = [1.3, 0.7, 0.8, 1.9, 1.2]
|
||||
>>> xopt = fmin_ncg(rosen, x0, rosen_der, fhess=rosen_hess, avextol=1e-8)
|
||||
Optimization terminated successfully.
|
||||
Current function value: 0.000000
|
||||
Iterations: 23
|
||||
Function evaluations: 26
|
||||
Gradient evaluations: 23
|
||||
Hessian evaluations: 23
|
||||
>>> print xopt
|
||||
[ 1. 1. 1. 1. 1.]
|
||||
|
||||
|
||||
Hessian product example:
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
For larger minimization problems, storing the entire Hessian matrix
|
||||
can consume considerable time and memory. The Newton-CG algorithm only
|
||||
needs the product of the Hessian times an arbitrary vector. As a
|
||||
result, the user can supply code to compute this product rather than
|
||||
the full Hessian by setting the *fhess_p* keyword to the desired
|
||||
function. The *fhess_p* function should take the minimization vector as
|
||||
the first argument and the arbitrary vector as the second
|
||||
argument. Any extra arguments passed to the function to be minimized
|
||||
will also be passed to this function. If possible, using Newton-CG
|
||||
with the hessian product option is probably the fastest way to
|
||||
minimize the function.
|
||||
|
||||
In this case, the product of the Rosenbrock Hessian with an arbitrary
|
||||
vector is not difficult to compute. If :math:`\mathbf{p}` is the arbitrary vector, then :math:`\mathbf{H}\left(\mathbf{x}\right)\mathbf{p}` has elements:
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ \mathbf{H}\left(\mathbf{x}\right)\mathbf{p}=\left[\begin{array}{c} \left(1200x_{0}^{2}-400x_{1}+2\right)p_{0}-400x_{0}p_{1}\\ \vdots\\ -400x_{i-1}p_{i-1}+\left(202+1200x_{i}^{2}-400x_{i+1}\right)p_{i}-400x_{i}p_{i+1}\\ \vdots\\ -400x_{N-2}p_{N-2}+200p_{N-1}\end{array}\right].\]
|
||||
|
||||
Code which makes use of the *fhess_p* keyword to minimize the
|
||||
Rosenbrock function using :obj:`fmin_ncg` follows:
|
||||
|
||||
>>> from scipy.optimize import fmin_ncg
|
||||
>>> def rosen_hess_p(x,p):
|
||||
... x = asarray(x)
|
||||
... Hp = zeros_like(x)
|
||||
... Hp[0] = (1200*x[0]**2 - 400*x[1] + 2)*p[0] - 400*x[0]*p[1]
|
||||
... Hp[1:-1] = -400*x[:-2]*p[:-2]+(202+1200*x[1:-1]**2-400*x[2:])*p[1:-1] \
|
||||
... -400*x[1:-1]*p[2:]
|
||||
... Hp[-1] = -400*x[-2]*p[-2] + 200*p[-1]
|
||||
... return Hp
|
||||
|
||||
>>> x0 = [1.3, 0.7, 0.8, 1.9, 1.2]
|
||||
>>> xopt = fmin_ncg(rosen, x0, rosen_der, fhess_p=rosen_hess_p, avextol=1e-8)
|
||||
Optimization terminated successfully.
|
||||
Current function value: 0.000000
|
||||
Iterations: 22
|
||||
Function evaluations: 25
|
||||
Gradient evaluations: 22
|
||||
Hessian evaluations: 54
|
||||
>>> print xopt
|
||||
[ 1. 1. 1. 1. 1.]
|
||||
|
||||
|
||||
Least-square fitting (:func:`leastsq`)
|
||||
--------------------------------------
|
||||
|
||||
All of the previously-explained minimization procedures can be used to
|
||||
solve a least-squares problem provided the appropriate objective
|
||||
function is constructed. For example, suppose it is desired to fit a
|
||||
set of data :math:`\left\{\mathbf{x}_{i}, \mathbf{y}_{i}\right\}`
|
||||
to a known model,
|
||||
:math:`\mathbf{y}=\mathbf{f}\left(\mathbf{x},\mathbf{p}\right)`
|
||||
where :math:`\mathbf{p}` is a vector of parameters for the model that
|
||||
need to be found. A common method for determining which parameter
|
||||
vector gives the best fit to the data is to minimize the sum of squares
|
||||
of the residuals. The residual is usually defined for each observed
|
||||
data-point as
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ e_{i}\left(\mathbf{p},\mathbf{y}_{i},\mathbf{x}_{i}\right)=\left\Vert \mathbf{y}_{i}-\mathbf{f}\left(\mathbf{x}_{i},\mathbf{p}\right)\right\Vert .\]
|
||||
|
||||
An objective function to pass to any of the previous minization
|
||||
algorithms to obtain a least-squares fit is.
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ J\left(\mathbf{p}\right)=\sum_{i=0}^{N-1}e_{i}^{2}\left(\mathbf{p}\right).\]
|
||||
|
||||
|
||||
|
||||
The :obj:`leastsq` algorithm performs this squaring and summing of the
|
||||
residuals automatically. It takes as an input argument the vector
|
||||
function :math:`\mathbf{e}\left(\mathbf{p}\right)` and returns the
|
||||
value of :math:`\mathbf{p}` which minimizes
|
||||
:math:`J\left(\mathbf{p}\right)=\mathbf{e}^{T}\mathbf{e}`
|
||||
directly. The user is also encouraged to provide the Jacobian matrix
|
||||
of the function (with derivatives down the columns or across the
|
||||
rows). If the Jacobian is not provided, it is estimated.
|
||||
|
||||
An example should clarify the usage. Suppose it is believed some
|
||||
measured data follow a sinusoidal pattern
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ y_{i}=A\sin\left(2\pi kx_{i}+\theta\right)\]
|
||||
|
||||
where the parameters :math:`A,` :math:`k` , and :math:`\theta` are unknown. The residual vector is
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ e_{i}=\left|y_{i}-A\sin\left(2\pi kx_{i}+\theta\right)\right|.\]
|
||||
|
||||
By defining a function to compute the residuals and (selecting an
|
||||
appropriate starting position), the least-squares fit routine can be
|
||||
used to find the best-fit parameters :math:`\hat{A},\,\hat{k},\,\hat{\theta}`.
|
||||
This is shown in the following example:
|
||||
|
||||
.. plot::
|
||||
|
||||
>>> from numpy import *
|
||||
>>> x = arange(0,6e-2,6e-2/30)
|
||||
>>> A,k,theta = 10, 1.0/3e-2, pi/6
|
||||
>>> y_true = A*sin(2*pi*k*x+theta)
|
||||
>>> y_meas = y_true + 2*random.randn(len(x))
|
||||
|
||||
>>> def residuals(p, y, x):
|
||||
... A,k,theta = p
|
||||
... err = y-A*sin(2*pi*k*x+theta)
|
||||
... return err
|
||||
|
||||
>>> def peval(x, p):
|
||||
... return p[0]*sin(2*pi*p[1]*x+p[2])
|
||||
|
||||
>>> p0 = [8, 1/2.3e-2, pi/3]
|
||||
>>> print array(p0)
|
||||
[ 8. 43.4783 1.0472]
|
||||
|
||||
>>> from scipy.optimize import leastsq
|
||||
>>> plsq = leastsq(residuals, p0, args=(y_meas, x))
|
||||
>>> print plsq[0]
|
||||
[ 10.9437 33.3605 0.5834]
|
||||
|
||||
>>> print array([A, k, theta])
|
||||
[ 10. 33.3333 0.5236]
|
||||
|
||||
>>> import matplotlib.pyplot as plt
|
||||
>>> plt.plot(x,peval(x,plsq[0]),x,y_meas,'o',x,y_true)
|
||||
>>> plt.title('Least-squares fit to noisy data')
|
||||
>>> plt.legend(['Fit', 'Noisy', 'True'])
|
||||
>>> plt.show()
|
||||
|
||||
.. :caption: Least-square fitting to noisy data using
|
||||
.. :obj:`scipy.optimize.leastsq`
|
||||
|
||||
|
||||
.. _tutorial-sqlsp:
|
||||
|
||||
Sequential Least-square fitting with constraints (:func:`fmin_slsqp`)
|
||||
---------------------------------------------------------------------
|
||||
|
||||
This module implements the Sequential Least SQuares Programming optimization algorithm (SLSQP).
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\begin{eqnarray*} \min F(x) \\ \text{subject to } & C_j(X) = 0 , &j = 1,...,\text{MEQ}\\
|
||||
& C_j(x) \geq 0 , &j = \text{MEQ}+1,...,M\\
|
||||
& XL \leq x \leq XU , &I = 1,...,N. \end{eqnarray*}
|
||||
|
||||
The following script shows examples for how constraints can be specified.
|
||||
|
||||
::
|
||||
|
||||
"""
|
||||
This script tests fmin_slsqp using Example 14.4 from Numerical Methods for
|
||||
Engineers by Steven Chapra and Raymond Canale. This example maximizes the
|
||||
function f(x) = 2*x*y + 2*x - x**2 - 2*y**2, which has a maximum at x=2,y=1.
|
||||
"""
|
||||
|
||||
from scipy.optimize import fmin_slsqp
|
||||
from numpy import array, asfarray, finfo,ones, sqrt, zeros
|
||||
|
||||
|
||||
def testfunc(d,*args):
|
||||
"""
|
||||
Arguments:
|
||||
d - A list of two elements, where d[0] represents x and
|
||||
d[1] represents y in the following equation.
|
||||
sign - A multiplier for f. Since we want to optimize it, and the scipy
|
||||
optimizers can only minimize functions, we need to multiply it by
|
||||
-1 to achieve the desired solution
|
||||
Returns:
|
||||
2*x*y + 2*x - x**2 - 2*y**2
|
||||
|
||||
"""
|
||||
try:
|
||||
sign = args[0]
|
||||
except:
|
||||
sign = 1.0
|
||||
x = d[0]
|
||||
y = d[1]
|
||||
return sign*(2*x*y + 2*x - x**2 - 2*y**2)
|
||||
|
||||
def testfunc_deriv(d,*args):
|
||||
""" This is the derivative of testfunc, returning a numpy array
|
||||
representing df/dx and df/dy
|
||||
|
||||
"""
|
||||
try:
|
||||
sign = args[0]
|
||||
except:
|
||||
sign = 1.0
|
||||
x = d[0]
|
||||
y = d[1]
|
||||
dfdx = sign*(-2*x + 2*y + 2)
|
||||
dfdy = sign*(2*x - 4*y)
|
||||
return array([ dfdx, dfdy ],float)
|
||||
|
||||
|
||||
from time import time
|
||||
|
||||
print '\n\n'
|
||||
|
||||
print "Unbounded optimization. Derivatives approximated."
|
||||
t0 = time()
|
||||
x = fmin_slsqp(testfunc, [-1.0,1.0], args=(-1.0,), iprint=2, full_output=1)
|
||||
print "Elapsed time:", 1000*(time()-t0), "ms"
|
||||
print "Results",x
|
||||
print "\n\n"
|
||||
|
||||
print "Unbounded optimization. Derivatives provided."
|
||||
t0 = time()
|
||||
x = fmin_slsqp(testfunc, [-1.0,1.0], args=(-1.0,), iprint=2, full_output=1)
|
||||
print "Elapsed time:", 1000*(time()-t0), "ms"
|
||||
print "Results",x
|
||||
print "\n\n"
|
||||
|
||||
print "Bound optimization. Derivatives approximated."
|
||||
t0 = time()
|
||||
x = fmin_slsqp(testfunc, [-1.0,1.0], args=(-1.0,),
|
||||
eqcons=[lambda x, y: x[0]-x[1] ], iprint=2, full_output=1)
|
||||
print "Elapsed time:", 1000*(time()-t0), "ms"
|
||||
print "Results",x
|
||||
print "\n\n"
|
||||
|
||||
print "Bound optimization (equality constraints). Derivatives provided."
|
||||
t0 = time()
|
||||
x = fmin_slsqp(testfunc, [-1.0,1.0], fprime=testfunc_deriv, args=(-1.0,),
|
||||
eqcons=[lambda x, y: x[0]-x[1] ], iprint=2, full_output=1)
|
||||
print "Elapsed time:", 1000*(time()-t0), "ms"
|
||||
print "Results",x
|
||||
print "\n\n"
|
||||
|
||||
print "Bound optimization (equality and inequality constraints)."
|
||||
print "Derivatives provided."
|
||||
|
||||
t0 = time()
|
||||
x = fmin_slsqp(testfunc,[-1.0,1.0], fprime=testfunc_deriv, args=(-1.0,),
|
||||
eqcons=[lambda x, y: x[0]-x[1] ],
|
||||
ieqcons=[lambda x, y: x[0]-.5], iprint=2, full_output=1)
|
||||
print "Elapsed time:", 1000*(time()-t0), "ms"
|
||||
print "Results",x
|
||||
print "\n\n"
|
||||
|
||||
|
||||
def test_eqcons(d,*args):
|
||||
try:
|
||||
sign = args[0]
|
||||
except:
|
||||
sign = 1.0
|
||||
x = d[0]
|
||||
y = d[1]
|
||||
return array([ x**3-y ])
|
||||
|
||||
|
||||
def test_ieqcons(d,*args):
|
||||
try:
|
||||
sign = args[0]
|
||||
except:
|
||||
sign = 1.0
|
||||
x = d[0]
|
||||
y = d[1]
|
||||
return array([ y-1 ])
|
||||
|
||||
print "Bound optimization (equality and inequality constraints)."
|
||||
print "Derivatives provided via functions."
|
||||
t0 = time()
|
||||
x = fmin_slsqp(testfunc, [-1.0,1.0], fprime=testfunc_deriv, args=(-1.0,),
|
||||
f_eqcons=test_eqcons, f_ieqcons=test_ieqcons,
|
||||
iprint=2, full_output=1)
|
||||
print "Elapsed time:", 1000*(time()-t0), "ms"
|
||||
print "Results",x
|
||||
print "\n\n"
|
||||
|
||||
|
||||
def test_fprime_eqcons(d,*args):
|
||||
try:
|
||||
sign = args[0]
|
||||
except:
|
||||
sign = 1.0
|
||||
x = d[0]
|
||||
y = d[1]
|
||||
return array([ 3.0*(x**2.0), -1.0 ])
|
||||
|
||||
|
||||
def test_fprime_ieqcons(d,*args):
|
||||
try:
|
||||
sign = args[0]
|
||||
except:
|
||||
sign = 1.0
|
||||
x = d[0]
|
||||
y = d[1]
|
||||
return array([ 0.0, 1.0 ])
|
||||
|
||||
print "Bound optimization (equality and inequality constraints)."
|
||||
print "Derivatives provided via functions."
|
||||
print "Constraint jacobians provided via functions"
|
||||
t0 = time()
|
||||
x = fmin_slsqp(testfunc,[-1.0,1.0], fprime=testfunc_deriv, args=(-1.0,),
|
||||
f_eqcons=test_eqcons, f_ieqcons=test_ieqcons,
|
||||
fprime_eqcons=test_fprime_eqcons,
|
||||
fprime_ieqcons=test_fprime_ieqcons, iprint=2, full_output=1)
|
||||
print "Elapsed time:", 1000*(time()-t0), "ms"
|
||||
print "Results",x
|
||||
print "\n\n"
|
||||
|
||||
|
||||
|
||||
|
||||
Scalar function minimizers
|
||||
--------------------------
|
||||
|
||||
Often only the minimum of a scalar function is needed (a scalar
|
||||
function is one that takes a scalar as input and returns a scalar
|
||||
output). In these circumstances, other optimization techniques have
|
||||
been developed that can work faster.
|
||||
|
||||
|
||||
Unconstrained minimization (:func:`brent`)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
There are actually two methods that can be used to minimize a scalar
|
||||
function (:obj:`brent` and :func:`golden`), but :obj:`golden` is
|
||||
included only for academic purposes and should rarely be used. The
|
||||
brent method uses Brent's algorithm for locating a minimum. Optimally
|
||||
a bracket should be given which contains the minimum desired. A
|
||||
bracket is a triple :math:`\left(a,b,c\right)` such that
|
||||
:math:`f\left(a\right)>f\left(b\right)<f\left(c\right)` and
|
||||
:math:`a<b<c` . If this is not given, then alternatively two starting
|
||||
points can be chosen and a bracket will be found from these points
|
||||
using a simple marching algorithm. If these two starting points are
|
||||
not provided 0 and 1 will be used (this may not be the right choice
|
||||
for your function and result in an unexpected minimum being returned).
|
||||
|
||||
|
||||
Bounded minimization (:func:`fminbound`)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Thus far all of the minimization routines described have been
|
||||
unconstrained minimization routines. Very often, however, there are
|
||||
constraints that can be placed on the solution space before
|
||||
minimization occurs. The :obj:`fminbound` function is an example of a
|
||||
constrained minimization procedure that provides a rudimentary
|
||||
interval constraint for scalar functions. The interval constraint
|
||||
allows the minimization to occur only between two fixed endpoints.
|
||||
|
||||
For example, to find the minimum of :math:`J_{1}\left(x\right)` near :math:`x=5` , :obj:`fminbound` can be called using the interval :math:`\left[4,7\right]` as a constraint. The result is :math:`x_{\textrm{min}}=5.3314` :
|
||||
|
||||
>>> from scipy.special import j1
|
||||
>>> from scipy.optimize import fminbound
|
||||
>>> xmin = fminbound(j1, 4, 7)
|
||||
>>> print xmin
|
||||
5.33144184241
|
||||
|
||||
|
||||
Root finding
|
||||
------------
|
||||
|
||||
|
||||
Sets of equations
|
||||
^^^^^^^^^^^^^^^^^
|
||||
|
||||
To find the roots of a polynomial, the command :obj:`roots
|
||||
<scipy.roots>` is useful. To find a root of a set of non-linear
|
||||
equations, the command :obj:`fsolve` is needed. For example, the
|
||||
following example finds the roots of the single-variable
|
||||
transcendental equation
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ x+2\cos\left(x\right)=0,\]
|
||||
|
||||
and the set of non-linear equations
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\begin{eqnarray*} x_{0}\cos\left(x_{1}\right) & = & 4,\\ x_{0}x_{1}-x_{1} & = & 5.\end{eqnarray*}
|
||||
|
||||
The results are :math:`x=-1.0299` and :math:`x_{0}=6.5041,\, x_{1}=0.9084` .
|
||||
|
||||
>>> def func(x):
|
||||
... return x + 2*cos(x)
|
||||
|
||||
>>> def func2(x):
|
||||
... out = [x[0]*cos(x[1]) - 4]
|
||||
... out.append(x[1]*x[0] - x[1] - 5)
|
||||
... return out
|
||||
|
||||
>>> from scipy.optimize import fsolve
|
||||
>>> x0 = fsolve(func, 0.3)
|
||||
>>> print x0
|
||||
-1.02986652932
|
||||
|
||||
>>> x02 = fsolve(func2, [1, 1])
|
||||
>>> print x02
|
||||
[ 6.50409711 0.90841421]
|
||||
|
||||
|
||||
|
||||
Scalar function root finding
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
If one has a single-variable equation, there are four different root
|
||||
finder algorithms that can be tried. Each of these root finding
|
||||
algorithms requires the endpoints of an interval where a root is
|
||||
suspected (because the function changes signs). In general
|
||||
:obj:`brentq` is the best choice, but the other methods may be useful
|
||||
in certain circumstances or for academic purposes.
|
||||
|
||||
|
||||
Fixed-point solving
|
||||
^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
A problem closely related to finding the zeros of a function is the
|
||||
problem of finding a fixed-point of a function. A fixed point of a
|
||||
function is the point at which evaluation of the function returns the
|
||||
point: :math:`g\left(x\right)=x.` Clearly the fixed point of :math:`g`
|
||||
is the root of :math:`f\left(x\right)=g\left(x\right)-x.`
|
||||
Equivalently, the root of :math:`f` is the fixed_point of
|
||||
:math:`g\left(x\right)=f\left(x\right)+x.` The routine
|
||||
:obj:`fixed_point` provides a simple iterative method using Aitkens
|
||||
sequence acceleration to estimate the fixed point of :math:`g` given a
|
||||
starting point.
|
544
pythonPackages/scipy-0.8.0/doc/source/tutorial/signal.rst
Executable file
544
pythonPackages/scipy-0.8.0/doc/source/tutorial/signal.rst
Executable file
|
@ -0,0 +1,544 @@
|
|||
Signal Processing (signal)
|
||||
==========================
|
||||
|
||||
.. sectionauthor:: Travis E. Oliphant
|
||||
|
||||
The signal processing toolbox currently contains some filtering
|
||||
functions, a limited set of filter design tools, and a few B-spline
|
||||
interpolation algorithms for one- and two-dimensional data. While the
|
||||
B-spline algorithms could technically be placed under the
|
||||
interpolation category, they are included here because they only work
|
||||
with equally-spaced data and make heavy use of filter-theory and
|
||||
transfer-function formalism to provide a fast B-spline transform. To
|
||||
understand this section you will need to understand that a signal in
|
||||
SciPy is an array of real or complex numbers.
|
||||
|
||||
|
||||
B-splines
|
||||
---------
|
||||
|
||||
A B-spline is an approximation of a continuous function over a finite-
|
||||
domain in terms of B-spline coefficients and knot points. If the knot-
|
||||
points are equally spaced with spacing :math:`\Delta x` , then the B-spline approximation to a 1-dimensional function is the
|
||||
finite-basis expansion.
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ y\left(x\right)\approx\sum_{j}c_{j}\beta^{o}\left(\frac{x}{\Delta x}-j\right).\]
|
||||
|
||||
In two dimensions with knot-spacing :math:`\Delta x` and :math:`\Delta y` , the function representation is
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ z\left(x,y\right)\approx\sum_{j}\sum_{k}c_{jk}\beta^{o}\left(\frac{x}{\Delta x}-j\right)\beta^{o}\left(\frac{y}{\Delta y}-k\right).\]
|
||||
|
||||
In these expressions, :math:`\beta^{o}\left(\cdot\right)` is the space-limited B-spline basis function of order, :math:`o` . The requirement of equally-spaced knot-points and equally-spaced
|
||||
data points, allows the development of fast (inverse-filtering)
|
||||
algorithms for determining the coefficients, :math:`c_{j}` , from sample-values, :math:`y_{n}` . Unlike the general spline interpolation algorithms, these algorithms
|
||||
can quickly find the spline coefficients for large images.
|
||||
|
||||
The advantage of representing a set of samples via B-spline basis
|
||||
functions is that continuous-domain operators (derivatives, re-
|
||||
sampling, integral, etc.) which assume that the data samples are drawn
|
||||
from an underlying continuous function can be computed with relative
|
||||
ease from the spline coefficients. For example, the second-derivative
|
||||
of a spline is
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ y{}^{\prime\prime}\left(x\right)=\frac{1}{\Delta x^{2}}\sum_{j}c_{j}\beta^{o\prime\prime}\left(\frac{x}{\Delta x}-j\right).\]
|
||||
|
||||
Using the property of B-splines that
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ \frac{d^{2}\beta^{o}\left(w\right)}{dw^{2}}=\beta^{o-2}\left(w+1\right)-2\beta^{o-2}\left(w\right)+\beta^{o-2}\left(w-1\right)\]
|
||||
|
||||
it can be seen that
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ y^{\prime\prime}\left(x\right)=\frac{1}{\Delta x^{2}}\sum_{j}c_{j}\left[\beta^{o-2}\left(\frac{x}{\Delta x}-j+1\right)-2\beta^{o-2}\left(\frac{x}{\Delta x}-j\right)+\beta^{o-2}\left(\frac{x}{\Delta x}-j-1\right)\right].\]
|
||||
|
||||
If :math:`o=3` , then at the sample points,
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\begin{eqnarray*} \Delta x^{2}\left.y^{\prime}\left(x\right)\right|_{x=n\Delta x} & = & \sum_{j}c_{j}\delta_{n-j+1}-2c_{j}\delta_{n-j}+c_{j}\delta_{n-j-1},\\ & = & c_{n+1}-2c_{n}+c_{n-1}.\end{eqnarray*}
|
||||
|
||||
Thus, the second-derivative signal can be easily calculated from the
|
||||
spline fit. if desired, smoothing splines can be found to make the
|
||||
second-derivative less sensitive to random-errors.
|
||||
|
||||
The savvy reader will have already noticed that the data samples are
|
||||
related to the knot coefficients via a convolution operator, so that
|
||||
simple convolution with the sampled B-spline function recovers the
|
||||
original data from the spline coefficients. The output of convolutions
|
||||
can change depending on how boundaries are handled (this becomes
|
||||
increasingly more important as the number of dimensions in the data-
|
||||
set increases). The algorithms relating to B-splines in the signal-
|
||||
processing sub package assume mirror-symmetric boundary conditions.
|
||||
Thus, spline coefficients are computed based on that assumption, and
|
||||
data-samples can be recovered exactly from the spline coefficients by
|
||||
assuming them to be mirror-symmetric also.
|
||||
|
||||
Currently the package provides functions for determining second- and
|
||||
third-order cubic spline coefficients from equally spaced samples in
|
||||
one- and two-dimensions (:func:`signal.qspline1d`,
|
||||
:func:`signal.qspline2d`, :func:`signal.cspline1d`,
|
||||
:func:`signal.cspline2d`). The package also supplies a function (
|
||||
:obj:`signal.bspline` ) for evaluating the bspline basis function,
|
||||
:math:`\beta^{o}\left(x\right)` for arbitrary order and :math:`x.` For
|
||||
large :math:`o` , the B-spline basis function can be approximated well
|
||||
by a zero-mean Gaussian function with standard-deviation equal to
|
||||
:math:`\sigma_{o}=\left(o+1\right)/12` :
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ \beta^{o}\left(x\right)\approx\frac{1}{\sqrt{2\pi\sigma_{o}^{2}}}\exp\left(-\frac{x^{2}}{2\sigma_{o}}\right).\]
|
||||
|
||||
A function to compute this Gaussian for arbitrary :math:`x` and
|
||||
:math:`o` is also available ( :obj:`signal.gauss_spline` ). The
|
||||
following code and Figure uses spline-filtering to compute an
|
||||
edge-image (the second-derivative of a smoothed spline) of Lena's face
|
||||
which is an array returned by the command :func:`lena`. The command
|
||||
:obj:`signal.sepfir2d` was used to apply a separable two-dimensional
|
||||
FIR filter with mirror- symmetric boundary conditions to the spline
|
||||
coefficients. This function is ideally suited for reconstructing
|
||||
samples from spline coefficients and is faster than
|
||||
:obj:`signal.convolve2d` which convolves arbitrary two-dimensional
|
||||
filters and allows for choosing mirror-symmetric boundary conditions.
|
||||
|
||||
.. plot::
|
||||
|
||||
>>> from numpy import *
|
||||
>>> from scipy import signal, misc
|
||||
>>> import matplotlib.pyplot as plt
|
||||
|
||||
>>> image = misc.lena().astype(float32)
|
||||
>>> derfilt = array([1.0,-2,1.0],float32)
|
||||
>>> ck = signal.cspline2d(image,8.0)
|
||||
>>> deriv = signal.sepfir2d(ck, derfilt, [1]) + \
|
||||
>>> signal.sepfir2d(ck, [1], derfilt)
|
||||
|
||||
Alternatively we could have done::
|
||||
|
||||
laplacian = array([[0,1,0],[1,-4,1],[0,1,0]],float32)
|
||||
deriv2 = signal.convolve2d(ck,laplacian,mode='same',boundary='symm')
|
||||
|
||||
>>> plt.figure()
|
||||
>>> plt.imshow(image)
|
||||
>>> plt.gray()
|
||||
>>> plt.title('Original image')
|
||||
>>> plt.show()
|
||||
|
||||
>>> plt.figure()
|
||||
>>> plt.imshow(deriv)
|
||||
>>> plt.gray()
|
||||
>>> plt.title('Output of spline edge filter')
|
||||
>>> plt.show()
|
||||
|
||||
.. :caption: Example of using smoothing splines to filter images.
|
||||
|
||||
|
||||
Filtering
|
||||
---------
|
||||
|
||||
Filtering is a generic name for any system that modifies an input
|
||||
signal in some way. In SciPy a signal can be thought of as a Numpy
|
||||
array. There are different kinds of filters for different kinds of
|
||||
operations. There are two broad kinds of filtering operations: linear
|
||||
and non-linear. Linear filters can always be reduced to multiplication
|
||||
of the flattened Numpy array by an appropriate matrix resulting in
|
||||
another flattened Numpy array. Of course, this is not usually the best
|
||||
way to compute the filter as the matrices and vectors involved may be
|
||||
huge. For example filtering a :math:`512 \times 512` image with this
|
||||
method would require multiplication of a :math:`512^2 \times 512^2`
|
||||
matrix with a :math:`512^2` vector. Just trying to store the
|
||||
:math:`512^2 \times 512^2` matrix using a standard Numpy array would
|
||||
require :math:`68,719,476,736` elements. At 4 bytes per element this
|
||||
would require :math:`256\textrm{GB}` of memory. In most applications
|
||||
most of the elements of this matrix are zero and a different method
|
||||
for computing the output of the filter is employed.
|
||||
|
||||
|
||||
Convolution/Correlation
|
||||
^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Many linear filters also have the property of shift-invariance. This
|
||||
means that the filtering operation is the same at different locations
|
||||
in the signal and it implies that the filtering matrix can be
|
||||
constructed from knowledge of one row (or column) of the matrix alone.
|
||||
In this case, the matrix multiplication can be accomplished using
|
||||
Fourier transforms.
|
||||
|
||||
Let :math:`x\left[n\right]` define a one-dimensional signal indexed by the integer :math:`n.` Full convolution of two one-dimensional signals can be expressed as
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ y\left[n\right]=\sum_{k=-\infty}^{\infty}x\left[k\right]h\left[n-k\right].\]
|
||||
|
||||
This equation can only be implemented directly if we limit the
|
||||
sequences to finite support sequences that can be stored in a
|
||||
computer, choose :math:`n=0` to be the starting point of both
|
||||
sequences, let :math:`K+1` be that value for which
|
||||
:math:`y\left[n\right]=0` for all :math:`n>K+1` and :math:`M+1` be
|
||||
that value for which :math:`x\left[n\right]=0` for all :math:`n>M+1` ,
|
||||
then the discrete convolution expression is
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ y\left[n\right]=\sum_{k=\max\left(n-M,0\right)}^{\min\left(n,K\right)}x\left[k\right]h\left[n-k\right].\]
|
||||
|
||||
For convenience assume :math:`K\geq M.` Then, more explicitly the output of this operation is
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\begin{eqnarray*} y\left[0\right] & = & x\left[0\right]h\left[0\right]\\ y\left[1\right] & = & x\left[0\right]h\left[1\right]+x\left[1\right]h\left[0\right]\\ y\left[2\right] & = & x\left[0\right]h\left[2\right]+x\left[1\right]h\left[1\right]+x\left[2\right]h\left[0\right]\\ \vdots & \vdots & \vdots\\ y\left[M\right] & = & x\left[0\right]h\left[M\right]+x\left[1\right]h\left[M-1\right]+\cdots+x\left[M\right]h\left[0\right]\\ y\left[M+1\right] & = & x\left[1\right]h\left[M\right]+x\left[2\right]h\left[M-1\right]+\cdots+x\left[M+1\right]h\left[0\right]\\ \vdots & \vdots & \vdots\\ y\left[K\right] & = & x\left[K-M\right]h\left[M\right]+\cdots+x\left[K\right]h\left[0\right]\\ y\left[K+1\right] & = & x\left[K+1-M\right]h\left[M\right]+\cdots+x\left[K\right]h\left[1\right]\\ \vdots & \vdots & \vdots\\ y\left[K+M-1\right] & = & x\left[K-1\right]h\left[M\right]+x\left[K\right]h\left[M-1\right]\\ y\left[K+M\right] & = & x\left[K\right]h\left[M\right].\end{eqnarray*}
|
||||
|
||||
Thus, the full discrete convolution of two finite sequences of lengths :math:`K+1` and :math:`M+1` respectively results in a finite sequence of length :math:`K+M+1=\left(K+1\right)+\left(M+1\right)-1.`
|
||||
|
||||
One dimensional convolution is implemented in SciPy with the function
|
||||
``signal.convolve`` . This function takes as inputs the signals
|
||||
:math:`x,` :math:`h` , and an optional flag and returns the signal
|
||||
:math:`y.` The optional flag allows for specification of which part of
|
||||
the output signal to return. The default value of 'full' returns the
|
||||
entire signal. If the flag has a value of 'same' then only the middle
|
||||
:math:`K` values are returned starting at :math:`y\left[\left\lfloor
|
||||
\frac{M-1}{2}\right\rfloor \right]` so that the output has the same
|
||||
length as the largest input. If the flag has a value of 'valid' then
|
||||
only the middle :math:`K-M+1=\left(K+1\right)-\left(M+1\right)+1`
|
||||
output values are returned where :math:`z` depends on all of the
|
||||
values of the smallest input from :math:`h\left[0\right]` to
|
||||
:math:`h\left[M\right].` In other words only the values
|
||||
:math:`y\left[M\right]` to :math:`y\left[K\right]` inclusive are
|
||||
returned.
|
||||
|
||||
This same function ``signal.convolve`` can actually take :math:`N`
|
||||
-dimensional arrays as inputs and will return the :math:`N`
|
||||
-dimensional convolution of the two arrays. The same input flags are
|
||||
available for that case as well.
|
||||
|
||||
Correlation is very similar to convolution except for the minus sign
|
||||
becomes a plus sign. Thus
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ w\left[n\right]=\sum_{k=-\infty}^{\infty}y\left[k\right]x\left[n+k\right]\]
|
||||
|
||||
is the (cross) correlation of the signals :math:`y` and :math:`x.` For finite-length signals with :math:`y\left[n\right]=0` outside of the range :math:`\left[0,K\right]` and :math:`x\left[n\right]=0` outside of the range :math:`\left[0,M\right],` the summation can simplify to
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ w\left[n\right]=\sum_{k=\max\left(0,-n\right)}^{\min\left(K,M-n\right)}y\left[k\right]x\left[n+k\right].\]
|
||||
|
||||
Assuming again that :math:`K\geq M` this is
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\begin{eqnarray*} w\left[-K\right] & = & y\left[K\right]x\left[0\right]\\ w\left[-K+1\right] & = & y\left[K-1\right]x\left[0\right]+y\left[K\right]x\left[1\right]\\ \vdots & \vdots & \vdots\\ w\left[M-K\right] & = & y\left[K-M\right]x\left[0\right]+y\left[K-M+1\right]x\left[1\right]+\cdots+y\left[K\right]x\left[M\right]\\ w\left[M-K+1\right] & = & y\left[K-M-1\right]x\left[0\right]+\cdots+y\left[K-1\right]x\left[M\right]\\ \vdots & \vdots & \vdots\\ w\left[-1\right] & = & y\left[1\right]x\left[0\right]+y\left[2\right]x\left[1\right]+\cdots+y\left[M+1\right]x\left[M\right]\\ w\left[0\right] & = & y\left[0\right]x\left[0\right]+y\left[1\right]x\left[1\right]+\cdots+y\left[M\right]x\left[M\right]\\ w\left[1\right] & = & y\left[0\right]x\left[1\right]+y\left[1\right]x\left[2\right]+\cdots+y\left[M-1\right]x\left[M\right]\\ w\left[2\right] & = & y\left[0\right]x\left[2\right]+y\left[1\right]x\left[3\right]+\cdots+y\left[M-2\right]x\left[M\right]\\ \vdots & \vdots & \vdots\\ w\left[M-1\right] & = & y\left[0\right]x\left[M-1\right]+y\left[1\right]x\left[M\right]\\ w\left[M\right] & = & y\left[0\right]x\left[M\right].\end{eqnarray*}
|
||||
|
||||
|
||||
|
||||
The SciPy function ``signal.correlate`` implements this
|
||||
operation. Equivalent flags are available for this operation to return
|
||||
the full :math:`K+M+1` length sequence ('full') or a sequence with the
|
||||
same size as the largest sequence starting at
|
||||
:math:`w\left[-K+\left\lfloor \frac{M-1}{2}\right\rfloor \right]`
|
||||
('same') or a sequence where the values depend on all the values of
|
||||
the smallest sequence ('valid'). This final option returns the
|
||||
:math:`K-M+1` values :math:`w\left[M-K\right]` to
|
||||
:math:`w\left[0\right]` inclusive.
|
||||
|
||||
The function :obj:`signal.correlate` can also take arbitrary :math:`N`
|
||||
-dimensional arrays as input and return the :math:`N` -dimensional
|
||||
convolution of the two arrays on output.
|
||||
|
||||
When :math:`N=2,` :obj:`signal.correlate` and/or
|
||||
:obj:`signal.convolve` can be used to construct arbitrary image
|
||||
filters to perform actions such as blurring, enhancing, and
|
||||
edge-detection for an image.
|
||||
|
||||
Convolution is mainly used for filtering when one of the signals is
|
||||
much smaller than the other ( :math:`K\gg M` ), otherwise linear
|
||||
filtering is more easily accomplished in the frequency domain (see
|
||||
Fourier Transforms).
|
||||
|
||||
|
||||
Difference-equation filtering
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
A general class of linear one-dimensional filters (that includes
|
||||
convolution filters) are filters described by the difference equation
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ \sum_{k=0}^{N}a_{k}y\left[n-k\right]=\sum_{k=0}^{M}b_{k}x\left[n-k\right]\]
|
||||
|
||||
where :math:`x\left[n\right]` is the input sequence and
|
||||
:math:`y\left[n\right]` is the output sequence. If we assume initial
|
||||
rest so that :math:`y\left[n\right]=0` for :math:`n<0` , then this
|
||||
kind of filter can be implemented using convolution. However, the
|
||||
convolution filter sequence :math:`h\left[n\right]` could be infinite
|
||||
if :math:`a_{k}\neq0` for :math:`k\geq1.` In addition, this general
|
||||
class of linear filter allows initial conditions to be placed on
|
||||
:math:`y\left[n\right]` for :math:`n<0` resulting in a filter that
|
||||
cannot be expressed using convolution.
|
||||
|
||||
The difference equation filter can be thought of as finding :math:`y\left[n\right]` recursively in terms of it's previous values
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ a_{0}y\left[n\right]=-a_{1}y\left[n-1\right]-\cdots-a_{N}y\left[n-N\right]+\cdots+b_{0}x\left[n\right]+\cdots+b_{M}x\left[n-M\right].\]
|
||||
|
||||
Often :math:`a_{0}=1` is chosen for normalization. The implementation
|
||||
in SciPy of this general difference equation filter is a little more
|
||||
complicated then would be implied by the previous equation. It is
|
||||
implemented so that only one signal needs to be delayed. The actual
|
||||
implementation equations are (assuming :math:`a_{0}=1` ).
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\begin{eqnarray*} y\left[n\right] & = & b_{0}x\left[n\right]+z_{0}\left[n-1\right]\\ z_{0}\left[n\right] & = & b_{1}x\left[n\right]+z_{1}\left[n-1\right]-a_{1}y\left[n\right]\\ z_{1}\left[n\right] & = & b_{2}x\left[n\right]+z_{2}\left[n-1\right]-a_{2}y\left[n\right]\\ \vdots & \vdots & \vdots\\ z_{K-2}\left[n\right] & = & b_{K-1}x\left[n\right]+z_{K-1}\left[n-1\right]-a_{K-1}y\left[n\right]\\ z_{K-1}\left[n\right] & = & b_{K}x\left[n\right]-a_{K}y\left[n\right],\end{eqnarray*}
|
||||
|
||||
where :math:`K=\max\left(N,M\right).` Note that :math:`b_{K}=0` if
|
||||
:math:`K>M` and :math:`a_{K}=0` if :math:`K>N.` In this way, the
|
||||
output at time :math:`n` depends only on the input at time :math:`n`
|
||||
and the value of :math:`z_{0}` at the previous time. This can always
|
||||
be calculated as long as the :math:`K` values
|
||||
:math:`z_{0}\left[n-1\right]\ldots z_{K-1}\left[n-1\right]` are
|
||||
computed and stored at each time step.
|
||||
|
||||
The difference-equation filter is called using the command
|
||||
:obj:`signal.lfilter` in SciPy. This command takes as inputs the
|
||||
vector :math:`b,` the vector, :math:`a,` a signal :math:`x` and
|
||||
returns the vector :math:`y` (the same length as :math:`x` ) computed
|
||||
using the equation given above. If :math:`x` is :math:`N`
|
||||
-dimensional, then the filter is computed along the axis provided. If,
|
||||
desired, initial conditions providing the values of
|
||||
:math:`z_{0}\left[-1\right]` to :math:`z_{K-1}\left[-1\right]` can be
|
||||
provided or else it will be assumed that they are all zero. If initial
|
||||
conditions are provided, then the final conditions on the intermediate
|
||||
variables are also returned. These could be used, for example, to
|
||||
restart the calculation in the same state.
|
||||
|
||||
Sometimes it is more convenient to express the initial conditions in
|
||||
terms of the signals :math:`x\left[n\right]` and
|
||||
:math:`y\left[n\right].` In other words, perhaps you have the values
|
||||
of :math:`x\left[-M\right]` to :math:`x\left[-1\right]` and the values
|
||||
of :math:`y\left[-N\right]` to :math:`y\left[-1\right]` and would like
|
||||
to determine what values of :math:`z_{m}\left[-1\right]` should be
|
||||
delivered as initial conditions to the difference-equation filter. It
|
||||
is not difficult to show that for :math:`0\leq m<K,`
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ z_{m}\left[n\right]=\sum_{p=0}^{K-m-1}\left(b_{m+p+1}x\left[n-p\right]-a_{m+p+1}y\left[n-p\right]\right).\]
|
||||
|
||||
Using this formula we can find the intial condition vector :math:`z_{0}\left[-1\right]` to :math:`z_{K-1}\left[-1\right]` given initial conditions on :math:`y` (and :math:`x` ). The command :obj:`signal.lfiltic` performs this function.
|
||||
|
||||
|
||||
Other filters
|
||||
^^^^^^^^^^^^^
|
||||
|
||||
The signal processing package provides many more filters as well.
|
||||
|
||||
|
||||
Median Filter
|
||||
"""""""""""""
|
||||
|
||||
A median filter is commonly applied when noise is markedly non-
|
||||
Gaussian or when it is desired to preserve edges. The median filter
|
||||
works by sorting all of the array pixel values in a rectangular region
|
||||
surrounding the point of interest. The sample median of this list of
|
||||
neighborhood pixel values is used as the value for the output array.
|
||||
The sample median is the middle array value in a sorted list of
|
||||
neighborhood values. If there are an even number of elements in the
|
||||
neighborhood, then the average of the middle two values is used as the
|
||||
median. A general purpose median filter that works on N-dimensional
|
||||
arrays is :obj:`signal.medfilt` . A specialized version that works
|
||||
only for two-dimensional arrays is available as
|
||||
:obj:`signal.medfilt2d` .
|
||||
|
||||
|
||||
Order Filter
|
||||
""""""""""""
|
||||
|
||||
A median filter is a specific example of a more general class of
|
||||
filters called order filters. To compute the output at a particular
|
||||
pixel, all order filters use the array values in a region surrounding
|
||||
that pixel. These array values are sorted and then one of them is
|
||||
selected as the output value. For the median filter, the sample median
|
||||
of the list of array values is used as the output. A general order
|
||||
filter allows the user to select which of the sorted values will be
|
||||
used as the output. So, for example one could choose to pick the
|
||||
maximum in the list or the minimum. The order filter takes an
|
||||
additional argument besides the input array and the region mask that
|
||||
specifies which of the elements in the sorted list of neighbor array
|
||||
values should be used as the output. The command to perform an order
|
||||
filter is :obj:`signal.order_filter` .
|
||||
|
||||
|
||||
Wiener filter
|
||||
"""""""""""""
|
||||
|
||||
The Wiener filter is a simple deblurring filter for denoising images.
|
||||
This is not the Wiener filter commonly described in image
|
||||
reconstruction problems but instead it is a simple, local-mean filter.
|
||||
Let :math:`x` be the input signal, then the output is
|
||||
|
||||
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ y=\left\{ \begin{array}{cc} \frac{\sigma^{2}}{\sigma_{x}^{2}}m_{x}+\left(1-\frac{\sigma^{2}}{\sigma_{x}^{2}}\right)x & \sigma_{x}^{2}\geq\sigma^{2},\\ m_{x} & \sigma_{x}^{2}<\sigma^{2}.\end{array}\right.\]
|
||||
|
||||
Where :math:`m_{x}` is the local estimate of the mean and
|
||||
:math:`\sigma_{x}^{2}` is the local estimate of the variance. The
|
||||
window for these estimates is an optional input parameter (default is
|
||||
:math:`3\times3` ). The parameter :math:`\sigma^{2}` is a threshold
|
||||
noise parameter. If :math:`\sigma` is not given then it is estimated
|
||||
as the average of the local variances.
|
||||
|
||||
|
||||
Hilbert filter
|
||||
""""""""""""""
|
||||
|
||||
The Hilbert transform constructs the complex-valued analytic signal
|
||||
from a real signal. For example if :math:`x=\cos\omega n` then
|
||||
:math:`y=\textrm{hilbert}\left(x\right)` would return (except near the
|
||||
edges) :math:`y=\exp\left(j\omega n\right).` In the frequency domain,
|
||||
the hilbert transform performs
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ Y=X\cdot H\]
|
||||
|
||||
where :math:`H` is 2 for positive frequencies, :math:`0` for negative frequencies and :math:`1` for zero-frequencies.
|
||||
|
||||
.. XXX: TODO
|
||||
..
|
||||
.. Detrend
|
||||
.. """""""
|
||||
..
|
||||
.. Filter design
|
||||
.. -------------
|
||||
..
|
||||
..
|
||||
.. Finite-impulse response design
|
||||
.. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
..
|
||||
..
|
||||
.. Inifinite-impulse response design
|
||||
.. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
..
|
||||
..
|
||||
.. Analog filter frequency response
|
||||
.. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
..
|
||||
..
|
||||
.. Digital filter frequency response
|
||||
.. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
..
|
||||
..
|
||||
.. Linear Time-Invariant Systems
|
||||
.. -----------------------------
|
||||
..
|
||||
..
|
||||
.. LTI Object
|
||||
.. ^^^^^^^^^^
|
||||
..
|
||||
..
|
||||
.. Continuous-Time Simulation
|
||||
.. ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
..
|
||||
..
|
||||
.. Step response
|
||||
.. ^^^^^^^^^^^^^
|
||||
..
|
||||
..
|
||||
.. Impulse response
|
||||
.. ^^^^^^^^^^^^^^^^
|
||||
..
|
||||
..
|
||||
.. Input/Output
|
||||
.. ============
|
||||
..
|
||||
..
|
||||
.. Binary
|
||||
.. ------
|
||||
..
|
||||
..
|
||||
.. Arbitrary binary input and output (fopen)
|
||||
.. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
..
|
||||
..
|
||||
.. Read and write Matlab .mat files
|
||||
.. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
..
|
||||
..
|
||||
.. Saving workspace
|
||||
.. ^^^^^^^^^^^^^^^^
|
||||
..
|
||||
..
|
||||
.. Text-file
|
||||
.. ---------
|
||||
..
|
||||
..
|
||||
.. Read text-files (read_array)
|
||||
.. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
..
|
||||
..
|
||||
.. Write a text-file (write_array)
|
||||
.. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
..
|
||||
..
|
||||
.. Fourier Transforms
|
||||
.. ==================
|
||||
..
|
||||
..
|
||||
.. One-dimensional
|
||||
.. ---------------
|
||||
..
|
||||
..
|
||||
.. Two-dimensional
|
||||
.. ---------------
|
||||
..
|
||||
..
|
||||
.. N-dimensional
|
||||
.. -------------
|
||||
..
|
||||
..
|
||||
.. Shifting
|
||||
.. --------
|
||||
..
|
||||
..
|
||||
.. Sample frequencies
|
||||
.. ------------------
|
||||
..
|
||||
..
|
||||
.. Hilbert transform
|
||||
.. -----------------
|
||||
..
|
||||
..
|
||||
.. Tilbert transform
|
||||
.. -----------------
|
23
pythonPackages/scipy-0.8.0/doc/source/tutorial/special.rst
Executable file
23
pythonPackages/scipy-0.8.0/doc/source/tutorial/special.rst
Executable file
|
@ -0,0 +1,23 @@
|
|||
Special functions (:mod:`scipy.special`)
|
||||
========================================
|
||||
|
||||
.. sectionauthor:: Travis E. Oliphant
|
||||
|
||||
.. currentmodule:: scipy.special
|
||||
|
||||
The main feature of the :mod:`scipy.special` package is the definition of
|
||||
numerous special functions of mathematical physics. Available
|
||||
functions include airy, elliptic, bessel, gamma, beta, hypergeometric,
|
||||
parabolic cylinder, mathieu, spheroidal wave, struve, and
|
||||
kelvin. There are also some low-level stats functions that are not
|
||||
intended for general use as an easier interface to these functions is
|
||||
provided by the ``stats`` module. Most of these functions can take
|
||||
array arguments and return array results following the same
|
||||
broadcasting rules as other math functions in Numerical Python. Many
|
||||
of these functions also accept complex numbers as input. For a
|
||||
complete list of the available functions with a one-line description
|
||||
type ``>>> help(special).`` Each function also has its own
|
||||
documentation accessible using help. If you don't see a function you
|
||||
need, consider writing it and contributing it to the library. You can
|
||||
write the function in either C, Fortran, or Python. Look in the source
|
||||
code of the library for examples of each of these kinds of functions.
|
579
pythonPackages/scipy-0.8.0/doc/source/tutorial/stats.rst
Executable file
579
pythonPackages/scipy-0.8.0/doc/source/tutorial/stats.rst
Executable file
|
@ -0,0 +1,579 @@
|
|||
Statistics
|
||||
==========
|
||||
|
||||
.. sectionauthor:: Travis E. Oliphant
|
||||
|
||||
Introduction
|
||||
------------
|
||||
|
||||
SciPy has a tremendous number of basic statistics routines with more
|
||||
easily added by the end user (if you create one please contribute it).
|
||||
All of the statistics functions are located in the sub-package
|
||||
:mod:`scipy.stats` and a fairly complete listing of these functions
|
||||
can be had using ``info(stats)``.
|
||||
|
||||
Random Variables
|
||||
^^^^^^^^^^^^^^^^
|
||||
|
||||
There are two general distribution classes that have been implemented
|
||||
for encapsulating
|
||||
:ref:`continuous random variables <continuous-random-variables>`
|
||||
and
|
||||
:ref:`discrete random variables <discrete-random-variables>`
|
||||
. Over 80 continuous random variables and 10 discrete random
|
||||
variables have been implemented using these classes. The list of the
|
||||
random variables available is in the docstring for the stats sub-
|
||||
package.
|
||||
|
||||
|
||||
Note: The following is work in progress
|
||||
|
||||
Distributions
|
||||
-------------
|
||||
|
||||
|
||||
First some imports
|
||||
|
||||
>>> import numpy as np
|
||||
>>> from scipy import stats
|
||||
>>> import warnings
|
||||
>>> warnings.simplefilter('ignore', DeprecationWarning)
|
||||
|
||||
We can obtain the list of available distribution through introspection:
|
||||
|
||||
>>> dist_continu = [d for d in dir(stats) if
|
||||
... isinstance(getattr(stats,d), stats.rv_continuous)]
|
||||
>>> dist_discrete = [d for d in dir(stats) if
|
||||
... isinstance(getattr(stats,d), stats.rv_discrete)]
|
||||
>>> print 'number of continuous distributions:', len(dist_continu)
|
||||
number of continuous distributions: 84
|
||||
>>> print 'number of discrete distributions: ', len(dist_discrete)
|
||||
number of discrete distributions: 12
|
||||
|
||||
|
||||
|
||||
|
||||
Distributions can be used in one of two ways, either by passing all distribution
|
||||
parameters to each method call or by freezing the parameters for the instance
|
||||
of the distribution. As an example, we can get the median of the distribution by using
|
||||
the percent point function, ppf, which is the inverse of the cdf:
|
||||
|
||||
>>> print stats.nct.ppf(0.5, 10, 2.5)
|
||||
2.56880722561
|
||||
>>> my_nct = stats.nct(10, 2.5)
|
||||
>>> print my_nct.ppf(0.5)
|
||||
2.56880722561
|
||||
|
||||
``help(stats.nct)`` prints the complete docstring of the distribution. Instead
|
||||
we can print just some basic information::
|
||||
|
||||
>>> print stats.nct.extradoc #contains the distribution specific docs
|
||||
Non-central Student T distribution
|
||||
|
||||
df**(df/2) * gamma(df+1)
|
||||
nct.pdf(x,df,nc) = --------------------------------------------------
|
||||
2**df*exp(nc**2/2)*(df+x**2)**(df/2) * gamma(df/2)
|
||||
for df > 0, nc > 0.
|
||||
|
||||
|
||||
>>> print 'number of arguments: %d, shape parameters: %s'% (stats.nct.numargs,
|
||||
... stats.nct.shapes)
|
||||
number of arguments: 2, shape parameters: df,nc
|
||||
>>> print 'bounds of distribution lower: %s, upper: %s' % (stats.nct.a,
|
||||
... stats.nct.b)
|
||||
bounds of distribution lower: -1.#INF, upper: 1.#INF
|
||||
|
||||
We can list all methods and properties of the distribution with
|
||||
``dir(stats.nct)``. Some of the methods are private methods, that are
|
||||
not named as such, i.e. no leading underscore, for example veccdf or
|
||||
xa and xb are for internal calculation. The main methods we can see
|
||||
when we list the methods of the frozen distribution:
|
||||
|
||||
>>> print dir(my_nct) #reformatted
|
||||
['__class__', '__delattr__', '__dict__', '__doc__', '__getattribute__',
|
||||
'__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__',
|
||||
'__repr__', '__setattr__', '__str__', '__weakref__', 'args', 'cdf', 'dist',
|
||||
'entropy', 'isf', 'kwds', 'moment', 'pdf', 'pmf', 'ppf', 'rvs', 'sf', 'stats']
|
||||
|
||||
|
||||
The main public methods are:
|
||||
|
||||
* rvs: Random Variates
|
||||
* pdf: Probability Density Function
|
||||
* cdf: Cumulative Distribution Function
|
||||
* sf: Survival Function (1-CDF)
|
||||
* ppf: Percent Point Function (Inverse of CDF)
|
||||
* isf: Inverse Survival Function (Inverse of SF)
|
||||
* stats: Return mean, variance, (Fisher's) skew, or (Fisher's) kurtosis
|
||||
* moment: non-central moments of the distribution
|
||||
|
||||
The main additional methods of the not frozen distribution are related to the estimation
|
||||
of distrition parameters:
|
||||
|
||||
* fit: maximum likelihood estimation of distribution parameters, including location
|
||||
and scale
|
||||
* fit_loc_scale: estimation of location and scale when shape parameters are given
|
||||
* nnlf: negative log likelihood function
|
||||
* expect: Calculate the expectation of a function against the pdf or pmf
|
||||
|
||||
All continuous distributions take `loc` and `scale` as keyword
|
||||
parameters to adjust the location and scale of the distribution,
|
||||
e.g. for the standard normal distribution location is the mean and
|
||||
scale is the standard deviation. The standardized distribution for a
|
||||
random variable `x` is obtained through ``(x - loc) / scale``.
|
||||
|
||||
Discrete distribution have most of the same basic methods, however
|
||||
pdf is replaced the probability mass function `pmf`, no estimation
|
||||
methods, such as fit, are available, and scale is not a valid
|
||||
keyword parameter. The location parameter, keyword `loc` can be used
|
||||
to shift the distribution.
|
||||
|
||||
The basic methods, pdf, cdf, sf, ppf, and isf are vectorized with
|
||||
``np.vectorize``, and the usual numpy broadcasting is applied. For
|
||||
example, we can calculate the critical values for the upper tail of
|
||||
the t distribution for different probabilites and degrees of freedom.
|
||||
|
||||
>>> stats.t.isf([0.1, 0.05, 0.01], [[10], [11]])
|
||||
array([[ 1.37218364, 1.81246112, 2.76376946],
|
||||
[ 1.36343032, 1.79588482, 2.71807918]])
|
||||
|
||||
Here, the first row are the critical values for 10 degrees of freedom and the second row
|
||||
is for 11 d.o.f., i.e. this is the same as
|
||||
|
||||
>>> stats.t.isf([0.1, 0.05, 0.01], 10)
|
||||
array([ 1.37218364, 1.81246112, 2.76376946])
|
||||
>>> stats.t.isf([0.1, 0.05, 0.01], 11)
|
||||
array([ 1.36343032, 1.79588482, 2.71807918])
|
||||
|
||||
If both, probabilities and degrees of freedom have the same array shape, then element
|
||||
wise matching is used. As an example, we can obtain the 10% tail for 10 d.o.f., the 5% tail
|
||||
for 11 d.o.f. and the 1% tail for 12 d.o.f. by
|
||||
|
||||
>>> stats.t.isf([0.1, 0.05, 0.01], [10, 11, 12])
|
||||
array([ 1.37218364, 1.79588482, 2.68099799])
|
||||
|
||||
|
||||
|
||||
Performance and Remaining Issues
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
The performance of the individual methods, in terms of speed, varies
|
||||
widely by distribution and method. The results of a method are
|
||||
obtained in one of two ways, either by explicit calculation or by a
|
||||
generic algorithm that is independent of the specific distribution.
|
||||
Explicit calculation, requires that the method is directly specified
|
||||
for the given distribution, either through analytic formulas or
|
||||
through special functions in scipy.special or numpy.random for
|
||||
`rvs`. These are usually relatively fast calculations. The generic
|
||||
methods are used if the distribution does not specify any explicit
|
||||
calculation. To define a distribution, only one of pdf or cdf is
|
||||
necessary, all other methods can be derived using numeric integration
|
||||
and root finding. These indirect methods can be very slow. As an
|
||||
example, ``rgh = stats.gausshyper.rvs(0.5, 2, 2, 2, size=100)`` creates
|
||||
random variables in a very indirect way and takes about 19 seconds
|
||||
for 100 random variables on my computer, while one million random
|
||||
variables from the standard normal or from the t distribution take
|
||||
just above one second.
|
||||
|
||||
|
||||
The distributions in scipy.stats have recently been corrected and improved
|
||||
and gained a considerable test suite, however a few issues remain:
|
||||
|
||||
* skew and kurtosis, 3rd and 4th moments and entropy are not thoroughly
|
||||
tested and some coarse testing indicates that there are still some
|
||||
incorrect results left.
|
||||
* the distributions have been tested over some range of parameters,
|
||||
however in some corner ranges, a few incorrect results may remain.
|
||||
* the maximum likelihood estimation in `fit` does not work with
|
||||
default starting parameters for all distributions and the user
|
||||
needs to supply good starting parameters. Also, for some
|
||||
distribution using a maximum likelihood estimator might
|
||||
inherently not be the best choice.
|
||||
|
||||
|
||||
The next example shows how to build our own discrete distribution,
|
||||
and more examples for the usage of the distributions are shown below
|
||||
together with the statistical tests.
|
||||
|
||||
|
||||
|
||||
Example: discrete distribution rv_discrete
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
In the following we use stats.rv_discrete to generate a discrete distribution
|
||||
that has the probabilites of the truncated normal for the intervalls
|
||||
centered around the integers.
|
||||
|
||||
|
||||
>>> npoints = 20 # number of integer support points of the distribution minus 1
|
||||
>>> npointsh = npoints / 2
|
||||
>>> npointsf = float(npoints)
|
||||
>>> nbound = 4 # bounds for the truncated normal
|
||||
>>> normbound = (1+1/npointsf) * nbound # actual bounds of truncated normal
|
||||
>>> grid = np.arange(-npointsh, npointsh+2, 1) # integer grid
|
||||
>>> gridlimitsnorm = (grid-0.5) / npointsh * nbound # bin limits for the truncnorm
|
||||
>>> gridlimits = grid - 0.5
|
||||
>>> grid = grid[:-1]
|
||||
>>> probs = np.diff(stats.truncnorm.cdf(gridlimitsnorm, -normbound, normbound))
|
||||
>>> gridint = grid
|
||||
>>> normdiscrete = stats.rv_discrete(values = (gridint,
|
||||
... np.round(probs, decimals=7)), name='normdiscrete')
|
||||
|
||||
From the docstring of rv_discrete:
|
||||
"You can construct an aribtrary discrete rv where P{X=xk} = pk by
|
||||
passing to the rv_discrete initialization method (through the values=
|
||||
keyword) a tuple of sequences (xk, pk) which describes only those
|
||||
values of X (xk) that occur with nonzero probability (pk)."
|
||||
|
||||
There are some requirements for this distribution to work. The
|
||||
keyword `name` is required. The support points of the distribution
|
||||
xk have to be integers. Also, I needed to limit the number of
|
||||
decimals. If the last two requirements are not satisfied an
|
||||
exception may be raised or the resulting numbers may be incorrect.
|
||||
|
||||
After defining the distribution, we obtain access to all methods of
|
||||
discrete distributions.
|
||||
|
||||
>>> print 'mean = %6.4f, variance = %6.4f, skew = %6.4f, kurtosis = %6.4f'% \
|
||||
... normdiscrete.stats(moments = 'mvsk')
|
||||
mean = -0.0000, variance = 6.3302, skew = 0.0000, kurtosis = -0.0076
|
||||
|
||||
>>> nd_std = np.sqrt(normdiscrete.stats(moments = 'v'))
|
||||
|
||||
**Generate a random sample and compare observed frequencies with probabilities**
|
||||
|
||||
>>> n_sample = 500
|
||||
>>> np.random.seed(87655678) # fix the seed for replicability
|
||||
>>> rvs = normdiscrete.rvs(size=n_sample)
|
||||
>>> rvsnd = rvs
|
||||
>>> f, l = np.histogram(rvs, bins=gridlimits)
|
||||
>>> sfreq = np.vstack([gridint, f, probs*n_sample]).T
|
||||
>>> print sfreq
|
||||
[[ -1.00000000e+01 0.00000000e+00 2.95019349e-02]
|
||||
[ -9.00000000e+00 0.00000000e+00 1.32294142e-01]
|
||||
[ -8.00000000e+00 0.00000000e+00 5.06497902e-01]
|
||||
[ -7.00000000e+00 2.00000000e+00 1.65568919e+00]
|
||||
[ -6.00000000e+00 1.00000000e+00 4.62125309e+00]
|
||||
[ -5.00000000e+00 9.00000000e+00 1.10137298e+01]
|
||||
[ -4.00000000e+00 2.60000000e+01 2.24137683e+01]
|
||||
[ -3.00000000e+00 3.70000000e+01 3.89503370e+01]
|
||||
[ -2.00000000e+00 5.10000000e+01 5.78004747e+01]
|
||||
[ -1.00000000e+00 7.10000000e+01 7.32455414e+01]
|
||||
[ 0.00000000e+00 7.40000000e+01 7.92618251e+01]
|
||||
[ 1.00000000e+00 8.90000000e+01 7.32455414e+01]
|
||||
[ 2.00000000e+00 5.50000000e+01 5.78004747e+01]
|
||||
[ 3.00000000e+00 5.00000000e+01 3.89503370e+01]
|
||||
[ 4.00000000e+00 1.70000000e+01 2.24137683e+01]
|
||||
[ 5.00000000e+00 1.10000000e+01 1.10137298e+01]
|
||||
[ 6.00000000e+00 4.00000000e+00 4.62125309e+00]
|
||||
[ 7.00000000e+00 3.00000000e+00 1.65568919e+00]
|
||||
[ 8.00000000e+00 0.00000000e+00 5.06497902e-01]
|
||||
[ 9.00000000e+00 0.00000000e+00 1.32294142e-01]
|
||||
[ 1.00000000e+01 0.00000000e+00 2.95019349e-02]]
|
||||
|
||||
|
||||
.. plot:: examples/normdiscr_plot1.py
|
||||
:align: center
|
||||
:include-source: 0
|
||||
|
||||
|
||||
.. plot:: examples/normdiscr_plot2.py
|
||||
:align: center
|
||||
:include-source: 0
|
||||
|
||||
|
||||
Next, we can test, whether our sample was generated by our normdiscrete
|
||||
distribution. This also verifies, whether the random numbers are generated
|
||||
correctly
|
||||
|
||||
The chisquare test requires that there are a minimum number of observations
|
||||
in each bin. We combine the tail bins into larger bins so that they contain
|
||||
enough observations.
|
||||
|
||||
>>> f2 = np.hstack([f[:5].sum(), f[5:-5], f[-5:].sum()])
|
||||
>>> p2 = np.hstack([probs[:5].sum(), probs[5:-5], probs[-5:].sum()])
|
||||
>>> ch2, pval = stats.chisquare(f2, p2*n_sample)
|
||||
|
||||
>>> print 'chisquare for normdiscrete: chi2 = %6.3f pvalue = %6.4f' % (ch2, pval)
|
||||
chisquare for normdiscrete: chi2 = 12.466 pvalue = 0.4090
|
||||
|
||||
The pvalue in this case is high, so we can be quite confident that
|
||||
our random sample was actually generated by the distribution.
|
||||
|
||||
|
||||
|
||||
Analysing One Sample
|
||||
--------------------
|
||||
|
||||
First, we create some random variables. We set a seed so that in each run
|
||||
we get identical results to look at. As an example we take a sample from
|
||||
the Student t distribution:
|
||||
|
||||
>>> np.random.seed(282629734)
|
||||
>>> x = stats.t.rvs(10, size=1000)
|
||||
|
||||
Here, we set the required shape parameter of the t distribution, which
|
||||
in statistics corresponds to the degrees of freedom, to 10. Using size=100 means
|
||||
that our sample consists of 1000 independently drawn (pseudo) random numbers.
|
||||
Since we did not specify the keyword arguments `loc` and `scale`, those are
|
||||
set to their default values zero and one.
|
||||
|
||||
Descriptive Statistics
|
||||
^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
`x` is a numpy array, and we have direct access to all array methods, e.g.
|
||||
|
||||
>>> print x.max(), x.min() # equivalent to np.max(x), np.min(x)
|
||||
5.26327732981 -3.78975572422
|
||||
>>> print x.mean(), x.var() # equivalent to np.mean(x), np.var(x)
|
||||
0.0140610663985 1.28899386208
|
||||
|
||||
|
||||
How do the some sample properties compare to their theoretical counterparts?
|
||||
|
||||
>>> m, v, s, k = stats.t.stats(10, moments='mvsk')
|
||||
>>> n, (smin, smax), sm, sv, ss, sk = stats.describe(x)
|
||||
|
||||
>>> print 'distribution:',
|
||||
distribution:
|
||||
>>> sstr = 'mean = %6.4f, variance = %6.4f, skew = %6.4f, kurtosis = %6.4f'
|
||||
>>> print sstr %(m, v, s ,k)
|
||||
mean = 0.0000, variance = 1.2500, skew = 0.0000, kurtosis = 1.0000
|
||||
>>> print 'sample: ',
|
||||
sample:
|
||||
>>> print sstr %(sm, sv, ss, sk)
|
||||
mean = 0.0141, variance = 1.2903, skew = 0.2165, kurtosis = 1.0556
|
||||
|
||||
Note: stats.describe uses the unbiased estimator for the variance, while
|
||||
np.var is the biased estimator.
|
||||
|
||||
|
||||
For our sample the sample statistics differ a by a small amount from
|
||||
their theoretical counterparts.
|
||||
|
||||
|
||||
T-test and KS-test
|
||||
^^^^^^^^^^^^^^^^^^
|
||||
|
||||
We can use the t-test to test whether the mean of our sample differs
|
||||
in a statistcally significant way from the theoretical expectation.
|
||||
|
||||
>>> print 't-statistic = %6.3f pvalue = %6.4f' % stats.ttest_1samp(x, m)
|
||||
t-statistic = 0.391 pvalue = 0.6955
|
||||
|
||||
The pvalue is 0.7, this means that with an alpha error of, for
|
||||
example, 10%, we cannot reject the hypothesis that the sample mean
|
||||
is equal to zero, the expectation of the standard t-distribution.
|
||||
|
||||
|
||||
As an exercise, we can calculate our ttest also directly without
|
||||
using the provided function, which should give us the same answer,
|
||||
and so it does:
|
||||
|
||||
>>> tt = (sm-m)/np.sqrt(sv/float(n)) # t-statistic for mean
|
||||
>>> pval = stats.t.sf(np.abs(tt), n-1)*2 # two-sided pvalue = Prob(abs(t)>tt)
|
||||
>>> print 't-statistic = %6.3f pvalue = %6.4f' % (tt, pval)
|
||||
t-statistic = 0.391 pvalue = 0.6955
|
||||
|
||||
The Kolmogorov-Smirnov test can be used to test the hypothesis that
|
||||
the sample comes from the standard t-distribution
|
||||
|
||||
>>> print 'KS-statistic D = %6.3f pvalue = %6.4f' % stats.kstest(x, 't', (10,))
|
||||
KS-statistic D = 0.016 pvalue = 0.9606
|
||||
|
||||
Again the p-value is high enough that we cannot reject the
|
||||
hypothesis that the random sample really is distributed according to the
|
||||
t-distribution. In real applications, we don't know what the
|
||||
underlying distribution is. If we perform the Kolmogorov-Smirnov
|
||||
test of our sample against the standard normal distribution, then we
|
||||
also cannot reject the hypothesis that our sample was generated by the
|
||||
normal distribution given that in this example the p-value is almost 40%.
|
||||
|
||||
>>> print 'KS-statistic D = %6.3f pvalue = %6.4f' % stats.kstest(x,'norm')
|
||||
KS-statistic D = 0.028 pvalue = 0.3949
|
||||
|
||||
However, the standard normal distribution has a variance of 1, while our
|
||||
sample has a variance of 1.29. If we standardize our sample and test it
|
||||
against the normal distribution, then the p-value is again large enough
|
||||
that we cannot reject the hypothesis that the sample came form the
|
||||
normal distribution.
|
||||
|
||||
>>> d, pval = stats.kstest((x-x.mean())/x.std(), 'norm')
|
||||
>>> print 'KS-statistic D = %6.3f pvalue = %6.4f' % (d, pval)
|
||||
KS-statistic D = 0.032 pvalue = 0.2402
|
||||
|
||||
Note: The Kolmogorov-Smirnov test assumes that we test against a
|
||||
distribution with given parameters, since in the last case we
|
||||
estimated mean and variance, this assumption is violated, and the
|
||||
distribution of the test statistic on which the p-value is based, is
|
||||
not correct.
|
||||
|
||||
Tails of the distribution
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Finally, we can check the upper tail of the distribution. We can use
|
||||
the percent point function ppf, which is the inverse of the cdf
|
||||
function, to obtain the critical values, or, more directly, we can use
|
||||
the inverse of the survival function
|
||||
|
||||
>>> crit01, crit05, crit10 = stats.t.ppf([1-0.01, 1-0.05, 1-0.10], 10)
|
||||
>>> print 'critical values from ppf at 1%%, 5%% and 10%% %8.4f %8.4f %8.4f'% (crit01, crit05, crit10)
|
||||
critical values from ppf at 1%, 5% and 10% 2.7638 1.8125 1.3722
|
||||
>>> print 'critical values from isf at 1%%, 5%% and 10%% %8.4f %8.4f %8.4f'% tuple(stats.t.isf([0.01,0.05,0.10],10))
|
||||
critical values from isf at 1%, 5% and 10% 2.7638 1.8125 1.3722
|
||||
|
||||
>>> freq01 = np.sum(x>crit01) / float(n) * 100
|
||||
>>> freq05 = np.sum(x>crit05) / float(n) * 100
|
||||
>>> freq10 = np.sum(x>crit10) / float(n) * 100
|
||||
>>> print 'sample %%-frequency at 1%%, 5%% and 10%% tail %8.4f %8.4f %8.4f'% (freq01, freq05, freq10)
|
||||
sample %-frequency at 1%, 5% and 10% tail 1.4000 5.8000 10.5000
|
||||
|
||||
In all three cases, our sample has more weight in the top tail than the
|
||||
underlying distribution.
|
||||
We can briefly check a larger sample to see if we get a closer match. In this
|
||||
case the empirical frequency is quite close to the theoretical probability,
|
||||
but if we repeat this several times the fluctuations are still pretty large.
|
||||
|
||||
>>> freq05l = np.sum(stats.t.rvs(10, size=10000) > crit05) / 10000.0 * 100
|
||||
>>> print 'larger sample %%-frequency at 5%% tail %8.4f'% freq05l
|
||||
larger sample %-frequency at 5% tail 4.8000
|
||||
|
||||
We can also compare it with the tail of the normal distribution, which
|
||||
has less weight in the tails:
|
||||
|
||||
>>> print 'tail prob. of normal at 1%%, 5%% and 10%% %8.4f %8.4f %8.4f'% \
|
||||
... tuple(stats.norm.sf([crit01, crit05, crit10])*100)
|
||||
tail prob. of normal at 1%, 5% and 10% 0.2857 3.4957 8.5003
|
||||
|
||||
The chisquare test can be used to test, whether for a finite number of bins,
|
||||
the observed frequencies differ significantly from the probabilites of the
|
||||
hypothesized distribution.
|
||||
|
||||
>>> quantiles = [0.0, 0.01, 0.05, 0.1, 1-0.10, 1-0.05, 1-0.01, 1.0]
|
||||
>>> crit = stats.t.ppf(quantiles, 10)
|
||||
>>> print crit
|
||||
[ -Inf -2.76376946 -1.81246112 -1.37218364 1.37218364 1.81246112
|
||||
2.76376946 Inf]
|
||||
>>> n_sample = x.size
|
||||
>>> freqcount = np.histogram(x, bins=crit)[0]
|
||||
>>> tprob = np.diff(quantiles)
|
||||
>>> nprob = np.diff(stats.norm.cdf(crit))
|
||||
>>> tch, tpval = stats.chisquare(freqcount, tprob*n_sample)
|
||||
>>> nch, npval = stats.chisquare(freqcount, nprob*n_sample)
|
||||
>>> print 'chisquare for t: chi2 = %6.3f pvalue = %6.4f' % (tch, tpval)
|
||||
chisquare for t: chi2 = 2.300 pvalue = 0.8901
|
||||
>>> print 'chisquare for normal: chi2 = %6.3f pvalue = %6.4f' % (nch, npval)
|
||||
chisquare for normal: chi2 = 64.605 pvalue = 0.0000
|
||||
|
||||
We see that the standard normal distribution is clearly rejected while the
|
||||
standard t-distribution cannot be rejected. Since the variance of our sample
|
||||
differs from both standard distribution, we can again redo the test taking
|
||||
the estimate for scale and location into account.
|
||||
|
||||
The fit method of the distributions can be used to estimate the parameters
|
||||
of the distribution, and the test is repeated using probabilites of the
|
||||
estimated distribution.
|
||||
|
||||
>>> tdof, tloc, tscale = stats.t.fit(x)
|
||||
>>> nloc, nscale = stats.norm.fit(x)
|
||||
>>> tprob = np.diff(stats.t.cdf(crit, tdof, loc=tloc, scale=tscale))
|
||||
>>> nprob = np.diff(stats.norm.cdf(crit, loc=nloc, scale=nscale))
|
||||
>>> tch, tpval = stats.chisquare(freqcount, tprob*n_sample)
|
||||
>>> nch, npval = stats.chisquare(freqcount, nprob*n_sample)
|
||||
>>> print 'chisquare for t: chi2 = %6.3f pvalue = %6.4f' % (tch, tpval)
|
||||
chisquare for t: chi2 = 1.577 pvalue = 0.9542
|
||||
>>> print 'chisquare for normal: chi2 = %6.3f pvalue = %6.4f' % (nch, npval)
|
||||
chisquare for normal: chi2 = 11.084 pvalue = 0.0858
|
||||
|
||||
Taking account of the estimated parameters, we can still reject the
|
||||
hypothesis that our sample came from a normal distribution (at the 5% level),
|
||||
but again, with a p-value of 0.95, we cannot reject the t distribution.
|
||||
|
||||
|
||||
|
||||
Special tests for normal distributions
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Since the normal distribution is the most common distribution in statistics,
|
||||
there are several additional functions available to test whether a sample
|
||||
could have been drawn from a normal distribution
|
||||
|
||||
First we can test if skew and kurtosis of our sample differ significantly from
|
||||
those of a normal distribution:
|
||||
|
||||
>>> print 'normal skewtest teststat = %6.3f pvalue = %6.4f' % stats.skewtest(x)
|
||||
normal skewtest teststat = 2.785 pvalue = 0.0054
|
||||
>>> print 'normal kurtosistest teststat = %6.3f pvalue = %6.4f' % stats.kurtosistest(x)
|
||||
normal kurtosistest teststat = 4.757 pvalue = 0.0000
|
||||
|
||||
These two tests are combined in the normality test
|
||||
|
||||
>>> print 'normaltest teststat = %6.3f pvalue = %6.4f' % stats.normaltest(x)
|
||||
normaltest teststat = 30.379 pvalue = 0.0000
|
||||
|
||||
In all three tests the p-values are very low and we can reject the hypothesis
|
||||
that the our sample has skew and kurtosis of the normal distribution.
|
||||
|
||||
Since skew and kurtosis of our sample are based on central moments, we get
|
||||
exactly the same results if we test the standardized sample:
|
||||
|
||||
>>> print 'normaltest teststat = %6.3f pvalue = %6.4f' % \
|
||||
... stats.normaltest((x-x.mean())/x.std())
|
||||
normaltest teststat = 30.379 pvalue = 0.0000
|
||||
|
||||
Because normality is rejected so strongly, we can check whether the
|
||||
normaltest gives reasonable results for other cases:
|
||||
|
||||
>>> print 'normaltest teststat = %6.3f pvalue = %6.4f' % stats.normaltest(stats.t.rvs(10, size=100))
|
||||
normaltest teststat = 4.698 pvalue = 0.0955
|
||||
>>> print 'normaltest teststat = %6.3f pvalue = %6.4f' % stats.normaltest(stats.norm.rvs(size=1000))
|
||||
normaltest teststat = 0.613 pvalue = 0.7361
|
||||
|
||||
When testing for normality of a small sample of t-distributed observations
|
||||
and a large sample of normal distributed observation, then in neither case
|
||||
can we reject the null hypothesis that the sample comes from a normal
|
||||
distribution. In the first case this is because the test is not powerful
|
||||
enough to distinguish a t and a normally distributed random variable in a
|
||||
small sample.
|
||||
|
||||
|
||||
Comparing two samples
|
||||
---------------------
|
||||
|
||||
In the following, we are given two samples, which can come either from the
|
||||
same or from different distribution, and we want to test whether these
|
||||
samples have the same statistical properties.
|
||||
|
||||
Comparing means
|
||||
^^^^^^^^^^^^^^^
|
||||
|
||||
Test with sample with identical means:
|
||||
|
||||
>>> rvs1 = stats.norm.rvs(loc=5, scale=10, size=500)
|
||||
>>> rvs2 = stats.norm.rvs(loc=5, scale=10, size=500)
|
||||
>>> stats.ttest_ind(rvs1, rvs2)
|
||||
(-0.54890361750888583, 0.5831943748663857)
|
||||
|
||||
|
||||
Test with sample with different means:
|
||||
|
||||
>>> rvs3 = stats.norm.rvs(loc=8, scale=10, size=500)
|
||||
>>> stats.ttest_ind(rvs1, rvs3)
|
||||
(-4.5334142901750321, 6.507128186505895e-006)
|
||||
|
||||
|
||||
|
||||
Kolmogorov-Smirnov test for two samples ks_2samp
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
For the example where both samples are drawn from the same distribution,
|
||||
we cannot reject the null hypothesis since the pvalue is high
|
||||
|
||||
>>> stats.ks_2samp(rvs1, rvs2)
|
||||
(0.025999999999999995, 0.99541195173064878)
|
||||
|
||||
In the second example, with different location, i.e. means, we can
|
||||
reject the null hypothesis since the pvalue is below 1%
|
||||
|
||||
>>> stats.ks_2samp(rvs1, rvs3)
|
||||
(0.11399999999999999, 0.0027132103661283141)
|
2564
pythonPackages/scipy-0.8.0/doc/source/tutorial/stats/continuous.rst
Executable file
2564
pythonPackages/scipy-0.8.0/doc/source/tutorial/stats/continuous.rst
Executable file
File diff suppressed because it is too large
Load diff
690
pythonPackages/scipy-0.8.0/doc/source/tutorial/stats/discrete.rst
Executable file
690
pythonPackages/scipy-0.8.0/doc/source/tutorial/stats/discrete.rst
Executable file
|
@ -0,0 +1,690 @@
|
|||
.. _discrete-random-variables:
|
||||
|
||||
|
||||
==================================
|
||||
Discrete Statistical Distributions
|
||||
==================================
|
||||
|
||||
Discrete random variables take on only a countable number of values.
|
||||
The commonly used distributions are included in SciPy and described in
|
||||
this document. Each discrete distribution can take one extra integer
|
||||
parameter: :math:`L.` The relationship between the general distribution
|
||||
:math:`p` and the standard distribution :math:`p_{0}` is
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ p\left(x\right)=p_{0}\left(x-L\right)\]
|
||||
|
||||
which allows for shifting of the input. When a distribution generator
|
||||
is initialized, the discrete distribution can either specify the
|
||||
beginning and ending (integer) values :math:`a` and :math:`b` which must be such that
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ p_{0}\left(x\right)=0\quad x<a\textrm{ or }x>b\]
|
||||
|
||||
in which case, it is assumed that the pdf function is specified on the
|
||||
integers :math:`a+mk\leq b` where :math:`k` is a non-negative integer ( :math:`0,1,2,\ldots` ) and :math:`m` is a positive integer multiplier. Alternatively, the two lists :math:`x_{k}` and :math:`p\left(x_{k}\right)` can be provided directly in which case a dictionary is set up
|
||||
internally to evaulate probabilities and generate random variates.
|
||||
|
||||
|
||||
Probability Mass Function (PMF)
|
||||
-------------------------------
|
||||
|
||||
The probability mass function of a random variable X is defined as the
|
||||
probability that the random variable takes on a particular value.
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ p\left(x_{k}\right)=P\left[X=x_{k}\right]\]
|
||||
|
||||
This is also sometimes called the probability density function,
|
||||
although technically
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ f\left(x\right)=\sum_{k}p\left(x_{k}\right)\delta\left(x-x_{k}\right)\]
|
||||
|
||||
is the probability density function for a discrete distribution [#]_ .
|
||||
|
||||
|
||||
|
||||
.. [#]
|
||||
XXX: Unknown layout Plain Layout: Note that we will be using :math:`p` to represent the probability mass function and a parameter (a
|
||||
XXX: probability). The usage should be obvious from context.
|
||||
|
||||
|
||||
|
||||
Cumulative Distribution Function (CDF)
|
||||
--------------------------------------
|
||||
|
||||
The cumulative distribution function is
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ F\left(x\right)=P\left[X\leq x\right]=\sum_{x_{k}\leq x}p\left(x_{k}\right)\]
|
||||
|
||||
and is also useful to be able to compute. Note that
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ F\left(x_{k}\right)-F\left(x_{k-1}\right)=p\left(x_{k}\right)\]
|
||||
|
||||
|
||||
|
||||
|
||||
Survival Function
|
||||
-----------------
|
||||
|
||||
The survival function is just
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ S\left(x\right)=1-F\left(x\right)=P\left[X>k\right]\]
|
||||
|
||||
the probability that the random variable is strictly larger than :math:`k` .
|
||||
|
||||
|
||||
Percent Point Function (Inverse CDF)
|
||||
------------------------------------
|
||||
|
||||
The percent point function is the inverse of the cumulative
|
||||
distribution function and is
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ G\left(q\right)=F^{-1}\left(q\right)\]
|
||||
|
||||
for discrete distributions, this must be modified for cases where
|
||||
there is no :math:`x_{k}` such that :math:`F\left(x_{k}\right)=q.` In these cases we choose :math:`G\left(q\right)` to be the smallest value :math:`x_{k}=G\left(q\right)` for which :math:`F\left(x_{k}\right)\geq q` . If :math:`q=0` then we define :math:`G\left(0\right)=a-1` . This definition allows random variates to be defined in the same way
|
||||
as with continuous rv's using the inverse cdf on a uniform
|
||||
distribution to generate random variates.
|
||||
|
||||
|
||||
Inverse survival function
|
||||
-------------------------
|
||||
|
||||
The inverse survival function is the inverse of the survival function
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ Z\left(\alpha\right)=S^{-1}\left(\alpha\right)=G\left(1-\alpha\right)\]
|
||||
|
||||
and is thus the smallest non-negative integer :math:`k` for which :math:`F\left(k\right)\geq1-\alpha` or the smallest non-negative integer :math:`k` for which :math:`S\left(k\right)\leq\alpha.`
|
||||
|
||||
|
||||
Hazard functions
|
||||
----------------
|
||||
|
||||
If desired, the hazard function and the cumulative hazard function
|
||||
could be defined as
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ h\left(x_{k}\right)=\frac{p\left(x_{k}\right)}{1-F\left(x_{k}\right)}\]
|
||||
|
||||
and
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ H\left(x\right)=\sum_{x_{k}\leq x}h\left(x_{k}\right)=\sum_{x_{k}\leq x}\frac{F\left(x_{k}\right)-F\left(x_{k-1}\right)}{1-F\left(x_{k}\right)}.\]
|
||||
|
||||
|
||||
|
||||
|
||||
Moments
|
||||
-------
|
||||
|
||||
Non-central moments are defined using the PDF
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ \mu_{m}^{\prime}=E\left[X^{m}\right]=\sum_{k}x_{k}^{m}p\left(x_{k}\right).\]
|
||||
|
||||
Central moments are computed similarly :math:`\mu=\mu_{1}^{\prime}`
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\begin{eqnarray*} \mu_{m}=E\left[\left(X-\mu\right)^{m}\right] & = & \sum_{k}\left(x_{k}-\mu\right)^{m}p\left(x_{k}\right)\\ & = & \sum_{k=0}^{m}\left(-1\right)^{m-k}\left(\begin{array}{c} m\\ k\end{array}\right)\mu^{m-k}\mu_{k}^{\prime}\end{eqnarray*}
|
||||
|
||||
The mean is the first moment
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ \mu=\mu_{1}^{\prime}=E\left[X\right]=\sum_{k}x_{k}p\left(x_{k}\right)\]
|
||||
|
||||
the variance is the second central moment
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ \mu_{2}=E\left[\left(X-\mu\right)^{2}\right]=\sum_{x_{k}}x_{k}^{2}p\left(x_{k}\right)-\mu^{2}.\]
|
||||
|
||||
Skewness is defined as
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ \gamma_{1}=\frac{\mu_{3}}{\mu_{2}^{3/2}}\]
|
||||
|
||||
while (Fisher) kurtosis is
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ \gamma_{2}=\frac{\mu_{4}}{\mu_{2}^{2}}-3,\]
|
||||
|
||||
so that a normal distribution has a kurtosis of zero.
|
||||
|
||||
|
||||
Moment generating function
|
||||
--------------------------
|
||||
|
||||
The moment generating funtion is defined as
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ M_{X}\left(t\right)=E\left[e^{Xt}\right]=\sum_{x_{k}}e^{x_{k}t}p\left(x_{k}\right)\]
|
||||
|
||||
Moments are found as the derivatives of the moment generating function
|
||||
evaluated at :math:`0.`
|
||||
|
||||
|
||||
Fitting data
|
||||
------------
|
||||
|
||||
To fit data to a distribution, maximizing the likelihood function is
|
||||
common. Alternatively, some distributions have well-known minimum
|
||||
variance unbiased estimators. These will be chosen by default, but the
|
||||
likelihood function will always be available for minimizing.
|
||||
|
||||
If :math:`f_{i}\left(k;\boldsymbol{\theta}\right)` is the PDF of a random-variable where :math:`\boldsymbol{\theta}` is a vector of parameters ( *e.g.* :math:`L` and :math:`S` ), then for a collection of :math:`N` independent samples from this distribution, the joint distribution the
|
||||
random vector :math:`\mathbf{k}` is
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ f\left(\mathbf{k};\boldsymbol{\theta}\right)=\prod_{i=1}^{N}f_{i}\left(k_{i};\boldsymbol{\theta}\right).\]
|
||||
|
||||
The maximum likelihood estimate of the parameters :math:`\boldsymbol{\theta}` are the parameters which maximize this function with :math:`\mathbf{x}` fixed and given by the data:
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\begin{eqnarray*} \hat{\boldsymbol{\theta}} & = & \arg\max_{\boldsymbol{\theta}}f\left(\mathbf{k};\boldsymbol{\theta}\right)\\ & = & \arg\min_{\boldsymbol{\theta}}l_{\mathbf{k}}\left(\boldsymbol{\theta}\right).\end{eqnarray*}
|
||||
|
||||
Where
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\begin{eqnarray*} l_{\mathbf{k}}\left(\boldsymbol{\theta}\right) & = & -\sum_{i=1}^{N}\log f\left(k_{i};\boldsymbol{\theta}\right)\\ & = & -N\overline{\log f\left(k_{i};\boldsymbol{\theta}\right)}\end{eqnarray*}
|
||||
|
||||
|
||||
|
||||
|
||||
Standard notation for mean
|
||||
--------------------------
|
||||
|
||||
We will use
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ \overline{y\left(\mathbf{x}\right)}=\frac{1}{N}\sum_{i=1}^{N}y\left(x_{i}\right)\]
|
||||
|
||||
where :math:`N` should be clear from context.
|
||||
|
||||
|
||||
Combinations
|
||||
------------
|
||||
|
||||
Note that
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ k!=k\cdot\left(k-1\right)\cdot\left(k-2\right)\cdot\cdots\cdot1=\Gamma\left(k+1\right)\]
|
||||
|
||||
and has special cases of
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\begin{eqnarray*} 0! & \equiv & 1\\ k! & \equiv & 0\quad k<0\end{eqnarray*}
|
||||
|
||||
and
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ \left(\begin{array}{c} n\\ k\end{array}\right)=\frac{n!}{\left(n-k\right)!k!}.\]
|
||||
|
||||
If :math:`n<0` or :math:`k<0` or :math:`k>n` we define :math:`\left(\begin{array}{c} n\\ k\end{array}\right)=0`
|
||||
|
||||
|
||||
Bernoulli
|
||||
=========
|
||||
|
||||
A Bernoulli random variable of parameter :math:`p` takes one of only two values :math:`X=0` or :math:`X=1` . The probability of success ( :math:`X=1` ) is :math:`p` , and the probability of failure ( :math:`X=0` ) is :math:`1-p.` It can be thought of as a binomial random variable with :math:`n=1` . The PMF is :math:`p\left(k\right)=0` for :math:`k\neq0,1` and
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\begin{eqnarray*} p\left(k;p\right) & = & \begin{cases} 1-p & k=0\\ p & k=1\end{cases}\\ F\left(x;p\right) & = & \begin{cases} 0 & x<0\\ 1-p & 0\le x<1\\ 1 & 1\leq x\end{cases}\\ G\left(q;p\right) & = & \begin{cases} 0 & 0\leq q<1-p\\ 1 & 1-p\leq q\leq1\end{cases}\\ \mu & = & p\\ \mu_{2} & = & p\left(1-p\right)\\ \gamma_{3} & = & \frac{1-2p}{\sqrt{p\left(1-p\right)}}\\ \gamma_{4} & = & \frac{1-6p\left(1-p\right)}{p\left(1-p\right)}\end{eqnarray*}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ M\left(t\right)=1-p\left(1-e^{t}\right)\]
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ \mu_{m}^{\prime}=p\]
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ h\left[X\right]=p\log p+\left(1-p\right)\log\left(1-p\right)\]
|
||||
|
||||
|
||||
|
||||
|
||||
Binomial
|
||||
========
|
||||
|
||||
A binomial random variable with parameters :math:`\left(n,p\right)` can be described as the sum of :math:`n` independent Bernoulli random variables of parameter :math:`p;`
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ Y=\sum_{i=1}^{n}X_{i}.\]
|
||||
|
||||
Therefore, this random variable counts the number of successes in :math:`n` independent trials of a random experiment where the probability of
|
||||
success is :math:`p.`
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\begin{eqnarray*} p\left(k;n,p\right) & = & \left(\begin{array}{c} n\\ k\end{array}\right)p^{k}\left(1-p\right)^{n-k}\,\, k\in\left\{ 0,1,\ldots n\right\} ,\\ F\left(x;n,p\right) & = & \sum_{k\leq x}\left(\begin{array}{c} n\\ k\end{array}\right)p^{k}\left(1-p\right)^{n-k}=I_{1-p}\left(n-\left\lfloor x\right\rfloor ,\left\lfloor x\right\rfloor +1\right)\quad x\geq0\end{eqnarray*}
|
||||
|
||||
where the incomplete beta integral is
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ I_{x}\left(a,b\right)=\frac{\Gamma\left(a+b\right)}{\Gamma\left(a\right)\Gamma\left(b\right)}\int_{0}^{x}t^{a-1}\left(1-t\right)^{b-1}dt.\]
|
||||
|
||||
Now
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\begin{eqnarray*} \mu & = & np\\ \mu_{2} & = & np\left(1-p\right)\\ \gamma_{1} & = & \frac{1-2p}{\sqrt{np\left(1-p\right)}}\\ \gamma_{2} & = & \frac{1-6p\left(1-p\right)}{np\left(1-p\right)}.\end{eqnarray*}
|
||||
|
||||
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ M\left(t\right)=\left[1-p\left(1-e^{t}\right)\right]^{n}\]
|
||||
|
||||
|
||||
|
||||
|
||||
Boltzmann (truncated Planck)
|
||||
============================
|
||||
|
||||
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\begin{eqnarray*} p\left(k;N,\lambda\right) & = & \frac{1-e^{-\lambda}}{1-e^{-\lambda N}}\exp\left(-\lambda k\right)\quad k\in\left\{ 0,1,\ldots,N-1\right\} \\ F\left(x;N,\lambda\right) & = & \left\{ \begin{array}{cc} 0 & x<0\\ \frac{1-\exp\left[-\lambda\left(\left\lfloor x\right\rfloor +1\right)\right]}{1-\exp\left(-\lambda N\right)} & 0\leq x\leq N-1\\ 1 & x\geq N-1\end{array}\right.\\ G\left(q,\lambda\right) & = & \left\lceil -\frac{1}{\lambda}\log\left[1-q\left(1-e^{-\lambda N}\right)\right]-1\right\rceil \end{eqnarray*}
|
||||
|
||||
Define :math:`z=e^{-\lambda}`
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\begin{eqnarray*} \mu & = & \frac{z}{1-z}-\frac{Nz^{N}}{1-z^{N}}\\ \mu_{2} & = & \frac{z}{\left(1-z\right)^{2}}-\frac{N^{2}z^{N}}{\left(1-z^{N}\right)^{2}}\\ \gamma_{1} & = & \frac{z\left(1+z\right)\left(\frac{1-z^{N}}{1-z}\right)^{3}-N^{3}z^{N}\left(1+z^{N}\right)}{\left[z\left(\frac{1-z^{N}}{1-z}\right)^{2}-N^{2}z^{N}\right]^{3/2}}\\ \gamma_{2} & = & \frac{z\left(1+4z+z^{2}\right)\left(\frac{1-z^{N}}{1-z}\right)^{4}-N^{4}z^{N}\left(1+4z^{N}+z^{2N}\right)}{\left[z\left(\frac{1-z^{N}}{1-z}\right)^{2}-N^{2}z^{N}\right]^{2}}\end{eqnarray*}
|
||||
|
||||
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ M\left(t\right)=\frac{1-e^{N\left(t-\lambda\right)}}{1-e^{t-\lambda}}\frac{1-e^{-\lambda}}{1-e^{-\lambda N}}\]
|
||||
|
||||
|
||||
|
||||
|
||||
Planck (discrete exponential)
|
||||
=============================
|
||||
|
||||
Named Planck because of its relationship to the black-body problem he
|
||||
solved.
|
||||
|
||||
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\begin{eqnarray*} p\left(k;\lambda\right) & = & \left(1-e^{-\lambda}\right)e^{-\lambda k}\quad k\lambda\geq0\\ F\left(x;\lambda\right) & = & 1-e^{-\lambda\left(\left\lfloor x\right\rfloor +1\right)}\quad x\lambda\geq0\\ G\left(q;\lambda\right) & = & \left\lceil -\frac{1}{\lambda}\log\left[1-q\right]-1\right\rceil .\end{eqnarray*}
|
||||
|
||||
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\begin{eqnarray*} \mu & = & \frac{1}{e^{\lambda}-1}\\ \mu_{2} & = & \frac{e^{-\lambda}}{\left(1-e^{-\lambda}\right)^{2}}\\ \gamma_{1} & = & 2\cosh\left(\frac{\lambda}{2}\right)\\ \gamma_{2} & = & 4+2\cosh\left(\lambda\right)\end{eqnarray*}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ M\left(t\right)=\frac{1-e^{-\lambda}}{1-e^{t-\lambda}}\]
|
||||
|
||||
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ h\left[X\right]=\frac{\lambda e^{-\lambda}}{1-e^{-\lambda}}-\log\left(1-e^{-\lambda}\right)\]
|
||||
|
||||
|
||||
|
||||
|
||||
Poisson
|
||||
=======
|
||||
|
||||
The Poisson random variable counts the number of successes in :math:`n` independent Bernoulli trials in the limit as :math:`n\rightarrow\infty` and :math:`p\rightarrow0` where the probability of success in each trial is :math:`p` and :math:`np=\lambda\geq0` is a constant. It can be used to approximate the Binomial random
|
||||
variable or in it's own right to count the number of events that occur
|
||||
in the interval :math:`\left[0,t\right]` for a process satisfying certain "sparsity "constraints. The functions are
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\begin{eqnarray*} p\left(k;\lambda\right) & = & e^{-\lambda}\frac{\lambda^{k}}{k!}\quad k\geq0,\\ F\left(x;\lambda\right) & = & \sum_{n=0}^{\left\lfloor x\right\rfloor }e^{-\lambda}\frac{\lambda^{n}}{n!}=\frac{1}{\Gamma\left(\left\lfloor x\right\rfloor +1\right)}\int_{\lambda}^{\infty}t^{\left\lfloor x\right\rfloor }e^{-t}dt,\\ \mu & = & \lambda\\ \mu_{2} & = & \lambda\\ \gamma_{1} & = & \frac{1}{\sqrt{\lambda}}\\ \gamma_{2} & = & \frac{1}{\lambda}.\end{eqnarray*}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ M\left(t\right)=\exp\left[\lambda\left(e^{t}-1\right)\right].\]
|
||||
|
||||
|
||||
|
||||
|
||||
Geometric
|
||||
=========
|
||||
|
||||
The geometric random variable with parameter :math:`p\in\left(0,1\right)` can be defined as the number of trials required to obtain a success
|
||||
where the probability of success on each trial is :math:`p` . Thus,
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\begin{eqnarray*} p\left(k;p\right) & = & \left(1-p\right)^{k-1}p\quad k\geq1\\ F\left(x;p\right) & = & 1-\left(1-p\right)^{\left\lfloor x\right\rfloor }\quad x\geq1\\ G\left(q;p\right) & = & \left\lceil \frac{\log\left(1-q\right)}{\log\left(1-p\right)}\right\rceil \\ \mu & = & \frac{1}{p}\\ \mu_{2} & = & \frac{1-p}{p^{2}}\\ \gamma_{1} & = & \frac{2-p}{\sqrt{1-p}}\\ \gamma_{2} & = & \frac{p^{2}-6p+6}{1-p}.\end{eqnarray*}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\begin{eqnarray*} M\left(t\right) & = & \frac{p}{e^{-t}-\left(1-p\right)}\end{eqnarray*}
|
||||
|
||||
|
||||
|
||||
|
||||
Negative Binomial
|
||||
=================
|
||||
|
||||
The negative binomial random variable with parameters :math:`n` and :math:`p\in\left(0,1\right)` can be defined as the number of *extra* independent trials (beyond :math:`n` ) required to accumulate a total of :math:`n` successes where the probability of a success on each trial is :math:`p.` Equivalently, this random variable is the number of failures
|
||||
encoutered while accumulating :math:`n` successes during independent trials of an experiment that succeeds
|
||||
with probability :math:`p.` Thus,
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\begin{eqnarray*} p\left(k;n,p\right) & = & \left(\begin{array}{c} k+n-1\\ n-1\end{array}\right)p^{n}\left(1-p\right)^{k}\quad k\geq0\\ F\left(x;n,p\right) & = & \sum_{i=0}^{\left\lfloor x\right\rfloor }\left(\begin{array}{c} i+n-1\\ i\end{array}\right)p^{n}\left(1-p\right)^{i}\quad x\geq0\\ & = & I_{p}\left(n,\left\lfloor x\right\rfloor +1\right)\quad x\geq0\\ \mu & = & n\frac{1-p}{p}\\ \mu_{2} & = & n\frac{1-p}{p^{2}}\\ \gamma_{1} & = & \frac{2-p}{\sqrt{n\left(1-p\right)}}\\ \gamma_{2} & = & \frac{p^{2}+6\left(1-p\right)}{n\left(1-p\right)}.\end{eqnarray*}
|
||||
|
||||
Recall that :math:`I_{p}\left(a,b\right)` is the incomplete beta integral.
|
||||
|
||||
|
||||
Hypergeometric
|
||||
==============
|
||||
|
||||
The hypergeometric random variable with parameters :math:`\left(M,n,N\right)` counts the number of "good "objects in a sample of size :math:`N` chosen without replacement from a population of :math:`M` objects where :math:`n` is the number of "good "objects in the total population.
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\begin{eqnarray*} p\left(k;N,n,M\right) & = & \frac{\left(\begin{array}{c} n\\ k\end{array}\right)\left(\begin{array}{c} M-n\\ N-k\end{array}\right)}{\left(\begin{array}{c} M\\ N\end{array}\right)}\quad N-\left(M-n\right)\leq k\leq\min\left(n,N\right)\\ F\left(x;N,n,M\right) & = & \sum_{k=0}^{\left\lfloor x\right\rfloor }\frac{\left(\begin{array}{c} m\\ k\end{array}\right)\left(\begin{array}{c} N-m\\ n-k\end{array}\right)}{\left(\begin{array}{c} N\\ n\end{array}\right)},\\ \mu & = & \frac{nN}{M}\\ \mu_{2} & = & \frac{nN\left(M-n\right)\left(M-N\right)}{M^{2}\left(M-1\right)}\\ \gamma_{1} & = & \frac{\left(M-2n\right)\left(M-2N\right)}{M-2}\sqrt{\frac{M-1}{nN\left(M-m\right)\left(M-n\right)}}\\ \gamma_{2} & = & \frac{g\left(N,n,M\right)}{nN\left(M-n\right)\left(M-3\right)\left(M-2\right)\left(N-M\right)}\end{eqnarray*}
|
||||
|
||||
where (defining :math:`m=M-n` )
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\begin{eqnarray*} g\left(N,n,M\right) & = & m^{3}-m^{5}+3m^{2}n-6m^{3}n+m^{4}n+3mn^{2}\\ & & -12m^{2}n^{2}+8m^{3}n^{2}+n^{3}-6mn^{3}+8m^{2}n^{3}\\ & & +mn^{4}-n^{5}-6m^{3}N+6m^{4}N+18m^{2}nN\\ & & -6m^{3}nN+18mn^{2}N-24m^{2}n^{2}N-6n^{3}N\\ & & -6mn^{3}N+6n^{4}N+6m^{2}N^{2}-6m^{3}N^{2}-24mnN^{2}\\ & & +12m^{2}nN^{2}+6n^{2}N^{2}+12mn^{2}N^{2}-6n^{3}N^{2}.\end{eqnarray*}
|
||||
|
||||
|
||||
|
||||
|
||||
Zipf (Zeta)
|
||||
===========
|
||||
|
||||
A random variable has the zeta distribution (also called the zipf
|
||||
distribution) with parameter :math:`\alpha>1` if it's probability mass function is given by
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\begin{eqnarray*} p\left(k;\alpha\right) & = & \frac{1}{\zeta\left(\alpha\right)k^{\alpha}}\quad k\geq1\end{eqnarray*}
|
||||
|
||||
where
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ \zeta\left(\alpha\right)=\sum_{n=1}^{\infty}\frac{1}{n^{\alpha}}\]
|
||||
|
||||
is the Riemann zeta function. Other functions of this distribution are
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\begin{eqnarray*} F\left(x;\alpha\right) & = & \frac{1}{\zeta\left(\alpha\right)}\sum_{k=1}^{\left\lfloor x\right\rfloor }\frac{1}{k^{\alpha}}\\ \mu & = & \frac{\zeta_{1}}{\zeta_{0}}\quad\alpha>2\\ \mu_{2} & = & \frac{\zeta_{2}\zeta_{0}-\zeta_{1}^{2}}{\zeta_{0}^{2}}\quad\alpha>3\\ \gamma_{1} & = & \frac{\zeta_{3}\zeta_{0}^{2}-3\zeta_{0}\zeta_{1}\zeta_{2}+2\zeta_{1}^{3}}{\left[\zeta_{2}\zeta_{0}-\zeta_{1}^{2}\right]^{3/2}}\quad\alpha>4\\ \gamma_{2} & = & \frac{\zeta_{4}\zeta_{0}^{3}-4\zeta_{3}\zeta_{1}\zeta_{0}^{2}+12\zeta_{2}\zeta_{1}^{2}\zeta_{0}-6\zeta_{1}^{4}-3\zeta_{2}^{2}\zeta_{0}^{2}}{\left(\zeta_{2}\zeta_{0}-\zeta_{1}^{2}\right)^{2}}.\end{eqnarray*}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\begin{eqnarray*} M\left(t\right) & = & \frac{\textrm{Li}_{\alpha}\left(e^{t}\right)}{\zeta\left(\alpha\right)}\end{eqnarray*}
|
||||
|
||||
where :math:`\zeta_{i}=\zeta\left(\alpha-i\right)` and :math:`\textrm{Li}_{n}\left(z\right)` is the :math:`n^{\textrm{th}}` polylogarithm function of :math:`z` defined as
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ \textrm{Li}_{n}\left(z\right)\equiv\sum_{k=1}^{\infty}\frac{z^{k}}{k^{n}}\]
|
||||
|
||||
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ \mu_{n}^{\prime}=\left.M^{\left(n\right)}\left(t\right)\right|_{t=0}=\left.\frac{\textrm{Li}_{\alpha-n}\left(e^{t}\right)}{\zeta\left(a\right)}\right|_{t=0}=\frac{\zeta\left(\alpha-n\right)}{\zeta\left(\alpha\right)}\]
|
||||
|
||||
|
||||
|
||||
|
||||
Logarithmic (Log-Series, Series)
|
||||
================================
|
||||
|
||||
The logarimthic distribution with parameter :math:`p` has a probability mass function with terms proportional to the Taylor
|
||||
series expansion of :math:`\log\left(1-p\right)`
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\begin{eqnarray*} p\left(k;p\right) & = & -\frac{p^{k}}{k\log\left(1-p\right)}\quad k\geq1\\ F\left(x;p\right) & = & -\frac{1}{\log\left(1-p\right)}\sum_{k=1}^{\left\lfloor x\right\rfloor }\frac{p^{k}}{k}=1+\frac{p^{1+\left\lfloor x\right\rfloor }\Phi\left(p,1,1+\left\lfloor x\right\rfloor \right)}{\log\left(1-p\right)}\end{eqnarray*}
|
||||
|
||||
where
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ \Phi\left(z,s,a\right)=\sum_{k=0}^{\infty}\frac{z^{k}}{\left(a+k\right)^{s}}\]
|
||||
|
||||
is the Lerch Transcendent. Also define :math:`r=\log\left(1-p\right)`
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\begin{eqnarray*} \mu & = & -\frac{p}{\left(1-p\right)r}\\ \mu_{2} & = & -\frac{p\left[p+r\right]}{\left(1-p\right)^{2}r^{2}}\\ \gamma_{1} & = & -\frac{2p^{2}+3pr+\left(1+p\right)r^{2}}{r\left(p+r\right)\sqrt{-p\left(p+r\right)}}r\\ \gamma_{2} & = & -\frac{6p^{3}+12p^{2}r+p\left(4p+7\right)r^{2}+\left(p^{2}+4p+1\right)r^{3}}{p\left(p+r\right)^{2}}.\end{eqnarray*}
|
||||
|
||||
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\begin{eqnarray*} M\left(t\right) & = & -\frac{1}{\log\left(1-p\right)}\sum_{k=1}^{\infty}\frac{e^{tk}p^{k}}{k}\\ & = & \frac{\log\left(1-pe^{t}\right)}{\log\left(1-p\right)}\end{eqnarray*}
|
||||
|
||||
Thus,
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ \mu_{n}^{\prime}=\left.M^{\left(n\right)}\left(t\right)\right|_{t=0}=\left.\frac{\textrm{Li}_{1-n}\left(pe^{t}\right)}{\log\left(1-p\right)}\right|_{t=0}=-\frac{\textrm{Li}_{1-n}\left(p\right)}{\log\left(1-p\right)}.\]
|
||||
|
||||
|
||||
|
||||
|
||||
Discrete Uniform (randint)
|
||||
==========================
|
||||
|
||||
The discrete uniform distribution with parameters :math:`\left(a,b\right)` constructs a random variable that has an equal probability of being
|
||||
any one of the integers in the half-open range :math:`[a,b).` If :math:`a` is not given it is assumed to be zero and the only parameter is :math:`b.` Therefore,
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\begin{eqnarray*} p\left(k;a,b\right) & = & \frac{1}{b-a}\quad a\leq k<b\\ F\left(x;a,b\right) & = & \frac{\left\lfloor x\right\rfloor -a}{b-a}\quad a\leq x\leq b\\ G\left(q;a,b\right) & = & \left\lceil q\left(b-a\right)+a\right\rceil \\ \mu & = & \frac{b+a-1}{2}\\ \mu_{2} & = & \frac{\left(b-a-1\right)\left(b-a+1\right)}{12}\\ \gamma_{1} & = & 0\\ \gamma_{2} & = & -\frac{6}{5}\frac{\left(b-a\right)^{2}+1}{\left(b-a-1\right)\left(b-a+1\right)}.\end{eqnarray*}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\begin{eqnarray*} M\left(t\right) & = & \frac{1}{b-a}\sum_{k=a}^{b-1}e^{tk}\\ & = & \frac{e^{bt}-e^{at}}{\left(b-a\right)\left(e^{t}-1\right)}\end{eqnarray*}
|
||||
|
||||
|
||||
|
||||
|
||||
Discrete Laplacian
|
||||
==================
|
||||
|
||||
Defined over all integers for :math:`a>0`
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\begin{eqnarray*} p\left(k\right) & = & \tanh\left(\frac{a}{2}\right)e^{-a\left|k\right|},\\ F\left(x\right) & = & \left\{ \begin{array}{cc} \frac{e^{a\left(\left\lfloor x\right\rfloor +1\right)}}{e^{a}+1} & \left\lfloor x\right\rfloor <0,\\ 1-\frac{e^{-a\left\lfloor x\right\rfloor }}{e^{a}+1} & \left\lfloor x\right\rfloor \geq0.\end{array}\right.\\ G\left(q\right) & = & \left\{ \begin{array}{cc} \left\lceil \frac{1}{a}\log\left[q\left(e^{a}+1\right)\right]-1\right\rceil & q<\frac{1}{1+e^{-a}},\\ \left\lceil -\frac{1}{a}\log\left[\left(1-q\right)\left(1+e^{a}\right)\right]\right\rceil & q\geq\frac{1}{1+e^{-a}}.\end{array}\right.\end{eqnarray*}
|
||||
|
||||
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\begin{eqnarray*} M\left(t\right) & = & \tanh\left(\frac{a}{2}\right)\sum_{k=-\infty}^{\infty}e^{tk}e^{-a\left|k\right|}\\ & = & C\left(1+\sum_{k=1}^{\infty}e^{-\left(t+a\right)k}+\sum_{1}^{\infty}e^{\left(t-a\right)k}\right)\\ & = & \tanh\left(\frac{a}{2}\right)\left(1+\frac{e^{-\left(t+a\right)}}{1-e^{-\left(t+a\right)}}+\frac{e^{t-a}}{1-e^{t-a}}\right)\\ & = & \frac{\tanh\left(\frac{a}{2}\right)\sinh a}{\cosh a-\cosh t}.\end{eqnarray*}
|
||||
|
||||
Thus,
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ \mu_{n}^{\prime}=M^{\left(n\right)}\left(0\right)=\left[1+\left(-1\right)^{n}\right]\textrm{Li}_{-n}\left(e^{-a}\right)\]
|
||||
|
||||
where :math:`\textrm{Li}_{-n}\left(z\right)` is the polylogarithm function of order :math:`-n` evaluated at :math:`z.`
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ h\left[X\right]=-\log\left(\tanh\left(\frac{a}{2}\right)\right)+\frac{a}{\sinh a}\]
|
||||
|
||||
|
||||
|
||||
|
||||
Discrete Gaussian*
|
||||
==================
|
||||
|
||||
Defined for all :math:`\mu` and :math:`\lambda>0` and :math:`k`
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ p\left(k;\mu,\lambda\right)=\frac{1}{Z\left(\lambda\right)}\exp\left[-\lambda\left(k-\mu\right)^{2}\right]\]
|
||||
|
||||
where
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ Z\left(\lambda\right)=\sum_{k=-\infty}^{\infty}\exp\left[-\lambda k^{2}\right]\]
|
||||
|
||||
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\begin{eqnarray*} \mu & = & \mu\\ \mu_{2} & = & -\frac{\partial}{\partial\lambda}\log Z\left(\lambda\right)\\ & = & G\left(\lambda\right)e^{-\lambda}\end{eqnarray*}
|
||||
|
||||
where :math:`G\left(0\right)\rightarrow\infty` and :math:`G\left(\infty\right)\rightarrow2` with a minimum less than 2 near :math:`\lambda=1`
|
||||
|
||||
.. math::
|
||||
:nowrap:
|
||||
|
||||
\[ G\left(\lambda\right)=\frac{1}{Z\left(\lambda\right)}\sum_{k=-\infty}^{\infty}k^{2}\exp\left[-\lambda\left(k+1\right)\left(k-1\right)\right]\]
|
2538
pythonPackages/scipy-0.8.0/doc/source/tutorial/weave.rst
Executable file
2538
pythonPackages/scipy-0.8.0/doc/source/tutorial/weave.rst
Executable file
File diff suppressed because it is too large
Load diff
19
pythonPackages/scipy-0.8.0/doc/source/weave.rst
Executable file
19
pythonPackages/scipy-0.8.0/doc/source/weave.rst
Executable file
|
@ -0,0 +1,19 @@
|
|||
======================================
|
||||
C/C++ integration (:mod:`scipy.weave`)
|
||||
======================================
|
||||
|
||||
.. warning::
|
||||
|
||||
This documentation is work-in-progress and unorganized.
|
||||
|
||||
.. automodule:: scipy.weave
|
||||
:members:
|
||||
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated/
|
||||
|
||||
inline
|
||||
blitz
|
||||
ext_tools
|
||||
accelerate
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue