Fixed more bugs in distributions.py

master
Per.Andreas.Brodtkorb 11 years ago
parent 6b88f2d4cc
commit 0bfe623f5c

@ -7,12 +7,13 @@ import sys
import fractions import fractions
import numpy as np import numpy as np
from numpy import ( from numpy import (
abs, amax, any, logical_and, arange, linspace, atleast_1d, # atleast_2d, meshgrid,
array, asarray, broadcast_arrays, ceil, floor, frexp, hypot, abs, amax, any, logical_and, arange, linspace, atleast_1d,
array, asarray, ceil, floor, frexp, hypot,
sqrt, arctan2, sin, cos, exp, log, mod, diff, empty_like, sqrt, arctan2, sin, cos, exp, log, mod, diff, empty_like,
finfo, inf, pi, interp, isnan, isscalar, zeros, ones, linalg, finfo, inf, pi, interp, isnan, isscalar, zeros, ones, linalg,
r_, sign, unique, hstack, vstack, nonzero, where, extract) r_, sign, unique, hstack, vstack, nonzero, where, extract)
from scipy.special import gammaln from scipy.special import gammaln, gamma, psi
from scipy.integrate import trapz, simps from scipy.integrate import trapz, simps
import warnings import warnings
from plotbackend import plotbackend from plotbackend import plotbackend
@ -24,7 +25,8 @@ try:
except: except:
clib = None clib = None
floatinfo = finfo(float) floatinfo = finfo(float)
_TINY = np.finfo(float).tiny
_EPS = np.finfo(float).eps
__all__ = [ __all__ = [
'is_numlike', 'JITImport', 'DotDict', 'Bunch', 'printf', 'sub_dict_select', 'is_numlike', 'JITImport', 'DotDict', 'Bunch', 'printf', 'sub_dict_select',
@ -1693,6 +1695,600 @@ def gravity(phi=45):
0.0000059 * sin(2 * phir) ** 2.) 0.0000059 * sin(2 * phir) ** 2.)
def dea3(v0, v1, v2):
'''
Extrapolate a slowly convergent sequence
Parameters
----------
v0, v1, v2 : array-like
3 values of a convergent sequence to extrapolate
Returns
-------
result : array-like
extrapolated value
abserr : array-like
absolute error estimate
Description
-----------
DEA3 attempts to extrapolate nonlinearly to a better estimate
of the sequence's limiting value, thus improving the rate of
convergence. The routine is based on the epsilon algorithm of
P. Wynn, see [1]_.
Example
-------
# integrate sin(x) from 0 to pi/2
>>> import numpy as np
>>> import numdifftools as nd
>>> Ei= np.zeros(3)
>>> linfun = lambda k : np.linspace(0,np.pi/2.,2.**(k+5)+1)
>>> for k in np.arange(3):
... x = linfun(k)
... Ei[k] = np.trapz(np.sin(x),x)
>>> [En, err] = nd.dea3(Ei[0], Ei[1], Ei[2])
>>> truErr = Ei-1.
>>> (truErr, err, En)
(array([ -2.00805680e-04, -5.01999079e-05, -1.25498825e-05]),
array([ 0.00020081]), array([ 1.]))
See also
--------
dea
Reference
---------
.. [1] C. Brezinski (1977)
"Acceleration de la convergence en analyse numerique",
"Lecture Notes in Math.", vol. 584,
Springer-Verlag, New York, 1977.
'''
E0, E1, E2 = np.atleast_1d(v0, v1, v2)
abs = np.abs # @ReservedAssignment
max = np.maximum # @ReservedAssignment
delta2, delta1 = E2 - E1, E1 - E0
err2, err1 = abs(delta2), abs(delta1)
tol2, tol1 = max(abs(E2), abs(E1)) * _EPS, max(abs(E1), abs(E0)) * _EPS
with warnings.catch_warnings():
warnings.simplefilter("ignore") # ignore division by zero and overflow
ss = 1.0 / delta2 - 1.0 / delta1
smallE2 = (abs(ss * E1) <= 1.0e-3).ravel()
result = 1.0 * E2
abserr = err1 + err2 + E2 * _EPS * 10.0
converged = (err1 <= tol1) & (err2 <= tol2).ravel() | smallE2
k4, = (1 - converged).nonzero()
if k4.size > 0:
result[k4] = E1[k4] + 1.0 / ss[k4]
abserr[k4] = err1[k4] + err2[k4] + abs(result[k4] - E2[k4])
return result, abserr
def hyp2f1_taylor(a, b, c, z, tol=1e-13, itermax=500):
a, b, c, z = np.broadcast_arrays(*np.atleast_1d(a, b, c, z))
shape = a.shape
ak, bk, ck, zk = [d.ravel() for d in (a, b, c, z)]
ajm1 = np.ones(ak.shape)
bjm2 = 0.5 * np.ones(ak.shape)
bjm1 = np.ones(ak.shape)
hout = np.zeros(ak.shape)
k0 = np.arange(len(ak))
for j in range(0, itermax):
aj = ajm1 * (ak + j) * (bk + j) / (ck + j) * zk / (j + 1)
bj = bjm1 + aj
h, err = dea3(bjm2, bjm1, bj)
k = np.flatnonzero(err > tol * np.abs(h))
hout[k0] = h
if len(k) == 0:
break
k0 = k0[k]
ak, bk, ck, zk = ak[k], bk[k], ck[k], zk[k]
ajm1 = aj[k]
bjm2 = bjm1[k]
bjm1 = bj[k]
else:
warnings.warn(('Reached %d limit! \n' +
'#%d values did not converge! Max error=%g') %
(j, len(k), np.max(err)))
return hout.reshape(shape)
def hyp2f1(a, b, c, z, rho=0.5):
e1 = gammaln(a)
e2 = gammaln(b)
e3 = gammaln(c)
e4 = gammaln(b - a)
e5 = gammaln(a - b)
e6 = gammaln(c - a)
e7 = gammaln(c - b)
e8 = gammaln(c - a - b)
e9 = gammaln(a + b - c)
_cmab = c-a-b
#~(np.round(cmab) == cmab & cmab <= 0)
if abs(z) <= rho:
h = hyp2f1_taylor(a, b, c, z, 1e-15)
elif abs(1 - z) <= rho: # % Require that |arg(1-z)|<pi
h = exp(e3 + e8 - e6 - e7) * hyp2f1_taylor(a, b, a + b - c, 1 - z, 1e-15) \
+ (1 - z) ** (c - a - b) * exp(e3 + e9 - e1 - e2) \
* hyp2f1_taylor(c - a, c - b, c - a - b + 1, 1 - z, 1e-15)
elif abs(z / (z - 1)) <= rho:
h = (1 - z) ** (-a) \
* hyp2f1_taylor(a, c - b, c, (z / (z - 1)), 1e-15)
elif abs(1 / z) <= rho: # % Require that |arg(z)|<pi and |arg(1-z)|<pi
h = (-z + 0j) ** (-a) * exp(e3 + e4 - e2 - e6) \
* hyp2f1_taylor(a, a - c + 1, a - b + 1, 1. / z, 1e-15) \
+ (-z + 0j) ** (-b) * exp(e3 + e5 - e1 - e7) \
* hyp2f1_taylor(b - c + 1, b, b - a + 1, (1. / z), 1e-15)
elif abs(1. / (1 - z)) <= rho: # % Require that |arg(1-z)|<pi
h = (1 - z) ** (-a) * exp(e3 + e4 - e2 - e6) \
* hyp2f1_taylor(a, c - b, a - b + 1, (1. / (1 - z)), 1e-15)\
+ (1 - z) ** (-b) * exp(e3 + e5 - e1 - e7) \
* hyp2f1_taylor(b, c - a, b - a + 1, (1. / (1 - z)), 1e-15)
elif abs(1 - 1 / z) < rho: # % Require that |arg(z)|<pi and |arg(1-z)|<pi
h = z ** (-a) * exp(e3 + e8 - e6 - e7) \
* hyp2f1_taylor(a, a - c + 1, a + b - c + 1, (1 - 1 / z), 1e-15) \
+ z ** (a - c) * (1 - z) ** (c - a - b) * exp(e3 + e9 - e1 - e2) \
* hyp2f1_taylor(c - a, 1 - a, c - a - b + 1, (1 - 1 / z), 1e-15)
else:
warnings.warn('Another method is needed')
return h
def hyp2f1_wrong(a, b, c, z, tol=1e-13, itermax=500):
ajm1 = 0
bjm1 = 1
cjm1 = 1
xjm1 = np.ones(np.shape(c + a * b * z))
xjm2 = 2 * np.ones(xjm1.shape)
for j in range(1, itermax):
aj = (ajm1 + bjm1) * j * (c + j - 1)
bj = bjm1 * (a + j - 1) * (b + j - 1) * z
cj = cjm1 * j * (c + j - 1)
if np.any((aj == np.inf) | (bj == np.inf) | (cj == np.inf)):
break
xj = (aj + bj) / cj
h, err = dea3(xjm2, xjm1, xj)
if np.all(err <= tol * np.abs(h)) and j > 10:
break
xjm2 = xjm1
xjm1 = xj
else:
warnings.warn('Reached %d limit' % j)
return h
def hygfz(A, B, C, Z):
''' Return hypergeometric function for a complex argument, F(a,b,c,z)
Parameters
----------
a, b, c:
parameters where c <> 0,-1,-2,...
z :--- Complex argument
'''
X = np.real(Z)
Y = np.imag(Z)
EPS = 1.0e-15
L0 = C == np.round(C) and C < 0.0e0
L1 = abs(1.0 - X) < EPS and Y == 0.0 and C - A - B <= 0.0
L2 = abs(Z + 1.0) < EPS and abs(C - A + B - 1.0) < EPS
L3 = A == np.round(A) and A < 0.0
L4 = B == np.round(B) and B < 0.0
L5 = C - A == np.round(C - A) and C - A <= 0.0
L6 = C - B == np.round(C - B) and C - B <= 0.0
AA = A
BB = B
A0 = abs(Z)
if (A0 > 0.95):
EPS = 1.0e-8
PI = 3.141592653589793
EL = .5772156649015329
if (L0 or L1):
# 'The hypergeometric series is divergent'
return np.inf
NM = 0
if (A0 == 0.0 or A == 0.0 or B == 0.0):
ZHF = 1.0
elif (Z == 1.0 and C - A - B > 0.0):
GC = gamma(C)
GCAB = gamma(C - A - B)
GCA = gamma(C - A)
GCB = gamma(C - B)
ZHF = GC * GCAB / (GCA * GCB)
elif L2:
G0 = sqrt(PI) * 2.0 ** (-A)
G1 = gamma(C)
G2 = gamma(1.0 + A / 2.0 - B)
G3 = gamma(0.5 + 0.5 * A)
ZHF = G0 * G1 / (G2 * G3)
elif L3 or L4:
if (L3):
NM = int(np.round(abs(A)))
if (L4):
NM = int(np.round(abs(B)))
ZHF = 1.0
ZR = 1.0
for K in range(NM):
ZR = ZR * (A + K) * (B + K) / ((K + 1.) * (C + K)) * Z
ZHF = ZHF + ZR
elif L5 or L6:
if (L5):
NM = np.round(abs(C - A))
if (L6):
NM = np.round(abs(C - B))
ZHF = 1.0 + 0j
ZR = 1.0 + 0j
for K in range(NM):
ZR *= (C - A + K) * (C - B + K) / ((K + 1.) * (C + K)) * Z
ZHF = ZHF + ZR
ZHF = (1.0 - Z) ** (C - A - B) * ZHF
elif (A0 <= 1.0):
if (X < 0.0):
Z1 = Z / (Z - 1.0)
if (C > A and B < A and B > 0.0):
A = BB
B = AA
ZC0 = 1.0 / ((1.0 - Z) ** A)
ZHF = 1.0 + 0j
ZR0 = 1.0 + 0j
ZW = 0
for K in range(500):
ZR0 *= (A + K) * (C - B + K) / ((K + 1.0) * (C + K)) * Z1
ZHF += ZR0
if (abs(ZHF - ZW) < abs(ZHF) * EPS):
break
ZW = ZHF
ZHF = ZC0 * ZHF
elif (A0 >= 0.90):
ZW = 0.0
GM = 0.0
MCAB = np.round(C - A - B)
if (abs(C - A - B - MCAB) < EPS):
M = int(np.round(C - A - B))
GA = gamma(A)
GB = gamma(B)
GC = gamma(C)
GAM = gamma(A + M)
GBM = gamma(B + M)
PA = psi(A)
PB = psi(B)
if (M != 0):
GM = 1.0
for j in range(1, abs(M)):
GM *= j
RM = 1.0
for j in range(1, abs(M) + 1): # DO 35 J=1,abs(M)
RM *= j
ZF0 = 1.0
ZR0 = 1.0
ZR1 = 1.0
SP0 = 0.0
SP = 0.0
if (M >= 0):
ZC0 = GM * GC / (GAM * GBM)
ZC1 = -GC * (Z - 1.0) ** M / (GA * GB * RM)
for K in range(1, M):
ZR0 = ZR0 * \
(A + K - 1.) * (B + K - 1.) / \
(K * (K - M)) * (1. - Z)
ZF0 = ZF0 + ZR0
for K in range(M):
SP0 = SP0 + 1.0 / \
(A + K) + 1.0 / (B + K) - 1. / (K + 1.)
ZF1 = PA + PB + SP0 + 2.0 * EL + np.log(1.0 - Z)
for K in range(1, 501):
SP = SP + \
(1.0 - A) / (K * (A + K - 1.0)) + (
1.0 - B) / (K * (B + K - 1.0))
SM = 0.0
for J in range(1, M):
SM += (1.0 - A) / (
(J + K) * (A + J + K - 1.0)) + 1.0 / (B + J + K - 1.0)
ZP = PA + PB + 2.0 * EL + SP + SM + np.log(1.0 - Z)
ZR1 = ZR1 * \
(A + M + K - 1.0) * (B + M + K - 1.0) / (
K * (M + K)) * (1.0 - Z)
ZF1 = ZF1 + ZR1 * ZP
if (abs(ZF1 - ZW) < abs(ZF1) * EPS):
break
ZW = ZF1
ZHF = ZF0 * ZC0 + ZF1 * ZC1
elif (M < 0):
M = -M
ZC0 = GM * GC / (GA * GB * (1.0 - Z) ** M)
ZC1 = -(-1) ** M * GC / (GAM * GBM * RM)
for K in range(1, M):
ZR0 = ZR0 * \
(A - M + K - 1.0) * (B - M + K - 1.0) / (
K * (K - M)) * (1.0 - Z)
ZF0 = ZF0 + ZR0
for K in range(1, M + 1):
SP0 = SP0 + 1.0 / K
ZF1 = PA + PB - SP0 + 2.0 * EL + np.log(1.0 - Z)
for K in range(1, 501):
SP = SP + \
(1.0 - A) / (K * (A + K - 1.0)) + (
1.0 - B) / (K * (B + K - 1.0))
SM = 0.0
for J in range(1, M + 1):
SM = SM + 1.0 / (J + K)
ZP = PA + PB + 2.0 * EL + SP - SM + np.log(1.0 - Z)
ZR1 = ZR1 * \
(A + K - 1.) * (B + K - 1.) / \
(K * (M + K)) * (1. - Z)
ZF1 = ZF1 + ZR1 * ZP
if (abs(ZF1 - ZW) < abs(ZF1) * EPS):
break
ZW = ZF1
ZHF = ZF0 * ZC0 + ZF1 * ZC1
else:
GA = gamma(A)
GB = gamma(B)
GC = gamma(C)
GCA = gamma(C - A)
GCB = gamma(C - B)
GCAB = gamma(C - A - B)
GABC = gamma(A + B - C)
ZC0 = GC * GCAB / (GCA * GCB)
ZC1 = GC * GABC / (GA * GB) * (1.0 - Z) ** (C - A - B)
ZHF = 0 + 0j
ZR0 = ZC0
ZR1 = ZC1
for K in range(1, 501):
ZR0 = ZR0 * \
(A + K - 1.) * (B + K - 1.) / \
(K * (A + B - C + K)) * (1. - Z)
ZR1 = ZR1 * \
(C - A + K - 1.0) * (C - B + K - 1.0) / (
K * (C - A - B + K)) * (1.0 - Z)
ZHF = ZHF + ZR0 + ZR1
if (abs(ZHF - ZW) < abs(ZHF) * EPS):
break
ZW = ZHF
ZHF = ZHF + ZC0 + ZC1
else:
ZW = 0.0
Z00 = 1.0 #+ 0j
if (C - A < A and C - B < B):
Z00 = (1.0 - Z) ** (C - A - B)
A = C - A
B = C - B
ZHF = 1.0
ZR = 1.0
for K in range(1, 501):
ZR = ZR * \
(A + K - 1.0) * (B + K - 1.0) / (K * (C + K - 1.0)) * Z
ZHF = ZHF + ZR
if (abs(ZHF - ZW) <= abs(ZHF) * EPS):
break
ZW = ZHF
ZHF = Z00 * ZHF
elif (A0 > 1.0):
MAB = np.round(A - B)
if (abs(A - B - MAB) < EPS and A0 <= 1.1):
B = B + EPS
if (abs(A - B - MAB) > EPS):
GA = gamma(A)
GB = gamma(B)
GC = gamma(C)
GAB = gamma(A - B)
GBA = gamma(B - A)
GCA = gamma(C - A)
GCB = gamma(C - B)
ZC0 = GC * GBA / (GCA * GB * (-Z) ** A)
ZC1 = GC * GAB / (GCB * GA * (-Z) ** B)
ZR0 = ZC0
ZR1 = ZC1
ZHF = 0.0 + 0j
for K in range(1, 501):
ZR0 = ZR0 * (A + K - 1.0) * (A - C + K) / ((A - B + K) * K * Z)
ZR1 = ZR1 * (B + K - 1.0) * (B - C + K) / ((B - A + K) * K * Z)
ZHF = ZHF + ZR0 + ZR1
if (abs((ZHF - ZW) / ZHF) <= EPS):
break
ZW = ZHF
ZHF = ZHF + ZC0 + ZC1
else:
if (A - B < 0.0):
A = BB
B = AA
CA = C - A
CB = C - B
NCA = np.round(CA)
NCB = np.round(CB)
if (abs(CA - NCA) < EPS or abs(CB - NCB) < EPS):
C = C + EPS
GA = gamma(A)
GC = gamma(C)
GCB = gamma(C - B)
PA = psi(A)
PCA = psi(C - A)
PAC = psi(A - C)
MAB = np.round(A - B + EPS)
ZC0 = GC / (GA * (-Z) ** B)
GM = gamma(A - B)
ZF0 = GM / GCB * ZC0
ZR = ZC0
for K in range(1, MAB):
ZR = ZR * (B + K - 1.0) / (K * Z)
T0 = A - B - K
G0 = gamma(T0)
GCBK = gamma(C - B - K)
ZF0 = ZF0 + ZR * G0 / GCBK
if (MAB == 0):
ZF0 = 0.0 + 0j
ZC1 = GC / (GA * GCB * (-Z) ** A)
SP = -2.0 * EL - PA - PCA
for J in range(1, MAB + 1):
SP = SP + 1.0 / J
ZP0 = SP + np.log(-Z)
SQ = 1.0
for J in range(1, MAB + 1):
SQ = SQ * (B + J - 1.0) * (B - C + J) / J
ZF1 = (SQ * ZP0) * ZC1
ZR = ZC1
RK1 = 1.0
SJ1 = 0.0
W0 = 0.0
for K in range(1, 10001):
ZR = ZR / Z
RK1 = RK1 * (B + K - 1.0) * (B - C + K) / (K * K)
RK2 = RK1
for J in range(K + 1, K + MAB + 1):
RK2 = RK2 * (B + J - 1.0) * (B - C + J) / J
SJ1 = SJ1 + \
(A - 1.0) / (K * (A + K - 1.0)) + \
(A - C - 1.0) / (K * (A - C + K - 1.0))
SJ2 = SJ1
for J in range(K + 1, K + MAB + 1):
SJ2 = SJ2 + 1.0 / J
ZP = -2.0 * EL - PA - PAC + SJ2 - 1.0 / \
(K + A - C) - PI / np.tan(PI * (K + A - C)) + np.log(-Z)
ZF1 = ZF1 + RK2 * ZR * ZP
WS = abs(ZF1)
if (abs((WS - W0) / WS) < EPS):
break
W0 = WS
ZHF = ZF0 + ZF1
A = AA
B = BB
if (K > 150):
warnings.warn('Warning! You should check the accuracy')
return ZHF
# def hypgf(a, b, c, x, abseps=0, releps=1e-13, kmax=10000):
# '''HYPGF Hypergeometric function F(a,b,c,x)
#
# CALL: [y ,abserr] = hypgf(a,b,c,x,abseps,releps)
#
# y = F(a,b,c,x)
# abserr = absolute error estimate
# a,b,c,x = input parameters
# abseps = requested absolute error
# releps = requested relative error
#
# HYPGF calculates one solution to Gauss's hypergeometric differential
# equation:
#
# x*(1-x)Y''(x)+[c-(a+b+1)*x]*Y'(x)-a*b*Y(x) = 0
# where
# F(a,b,c,x) = Y1(x) = 1 + a*b*x/c + a*(a+1)*b*(b+1)*x^2/(c*(c+1))+....
#
#
# Many elementary functions are special cases of F(a,b,c,x):
# 1/(1-x) = F(1,1,1,x) = F(1,b,b,x) = F(a,1,a,x)
# (1+x)^n = F(-n,b,b,-x)
# atan(x) = x*F(.5,1,1.5,-x^2)
# asin(x) = x*F(.5,.5,1.5,x^2)
# log(x) = x*F(1,1,2,-x)
# log(1+x)-log(1-x) = 2*x*F(.5,1,1.5,x^2)
#
# NOTE: only real x, abs(x) < 1 and c~=0,-1,-2,... are allowed.
#
# Examples:
# x = linspace(-.99,.99)';
# [Sn1,err1] = hypgf(1,1,1,x)
# plot(x,abs(Sn1-1./(1-x)),'b',x,err1,'r'),set(gca,'yscale','log')
# [Sn2,err2] = hypgf(.5,.5,1.5,x.^2);
# plot(x,abs(x.*Sn2-asin(x)),'b',x,abs(x.*err2),'r'),set(gca,'yscale','log')
#
#
# Reference:
# ---------
# Kreyszig, Erwin (1988)
# Advanced engineering mathematics
# John Wiley & Sons, sixth edition, pp 204.
# '''
# csize = common_shape(x, a, b, c)
# kmin = 2
# fsum = np.zeros(csize)
# delta = np.zeros(csize)
# err = np.zeros(csize)
#
# ok = ~((np.round(c) == c & c <= 0) | np.abs(x) > 1)
# if np.any(~ok):
# warnings.warn('HYPGF', 'Illegal input: c = 0,-1,-2,... or abs(x)>1')
# fsum[~ok] = np.NaN
# err[~ok] = np.NaN
#
# k0=find(ok & abs(x)==1);
# if any(k0)
# cmab = c(k0)-a(k0)-b(k0);
# fsum(k0) = exp(gammaln(c(k0))+gammaln(cmab)-...
# gammaln(c(k0)-a(k0))-gammaln(c(k0)-b(k0)));
# err(k0) = eps;
# k00 = find(real(cmab)<=0);
# if any(k00)
# err(k0(k00)) = nan;
# fsum(k0(k00)) = nan;
# end
# end
# k=find(ok & abs(x)<1);
# if any(k),
# delta(k) = ones(size(k));
# fsum(k) = delta(k);
#
# k1 = k;
# E = cell(1,3);
# E{3} = fsum(k);
# converge = 'n';
# for ix=0:Kmax-1,
# delta(k1) = delta(k1).*((a(k1)+ix)./(ix+1)).*((b(k1)+ix)./(c(k1)+ ix)).*x(k1);
# fsum(k1) = fsum(k1)+delta(k1);
#
# E(1:2) = E(2:3);
# E{3} = fsum(k1);
#
# if ix>Kmin
# if useDEA,
# [Sn, err(k1)] = dea3(E{:});
# k00 = find((abs(err(k1))) <= max(absEps,abs(relEps.*fsum(k1))));
# if any(k00)
# fsum(k1(k00)) = Sn(k00);
# end
# if (ix==Kmax-1)
# fsum(k1) = Sn;
# end
# k0 = (find((abs(err(k1))) > max(absEps,abs(relEps.*fsum(k1)))));
# if any(k0),% compute more terms
# %nk=length(k0);%# of values we have to compute again
# E{2} = E{2}(k0);
# E{3} = E{3}(k0);
# else
# converge='y';
# break;
# end
# else
# err(k1) = 10*abs(delta(k1));
# k0 = (find((abs(err(k1))) > max(absEps,abs(relEps.* ...
# fsum(k1)))));
# if any(k0),% compute more terms
# %nk=length(k0);%# of values we have to compute again
# else
# converge='y';
# break;
# end
# end
# k1 = k1(k0);
# end
# end
# if ~strncmpi(converge,'y',1)
# disp(sprintf('#%d values did not converge',length(k1)))
# end
# end
# %ix
# return
def nextpow2(x): def nextpow2(x):
''' '''
Return next higher power of 2 Return next higher power of 2
@ -1761,8 +2357,6 @@ def _discretize_linear(fun, a, b, tol=0.005, n=5):
''' '''
Automatic discretization of function, linear gridding Automatic discretization of function, linear gridding
''' '''
tiny = floatinfo.tiny
x = linspace(a, b, n) x = linspace(a, b, n)
y = fun(x) y = fun(x)
@ -1777,7 +2371,7 @@ def _discretize_linear(fun, a, b, tol=0.005, n=5):
x = linspace(a, b, n) x = linspace(a, b, n)
y = fun(x) y = fun(x)
y00 = interp(x, x0, y0) y00 = interp(x, x0, y0)
err = 0.5 * amax(abs((y00 - y) / (abs(y00 + y) + tiny))) err = 0.5 * amax(abs((y00 - y) / (abs(y00 + y) + _TINY)))
return x, y return x, y
@ -1785,7 +2379,6 @@ def _discretize_adaptive(fun, a, b, tol=0.005, n=5):
''' '''
Automatic discretization of function, adaptive gridding. Automatic discretization of function, adaptive gridding.
''' '''
tiny = floatinfo.tiny
n += (mod(n, 2) == 0) # make sure n is odd n += (mod(n, 2) == 0) # make sure n is odd
x = linspace(a, b, n) x = linspace(a, b, n)
fx = fun(x) fx = fun(x)
@ -1807,7 +2400,7 @@ def _discretize_adaptive(fun, a, b, tol=0.005, n=5):
fy = fun(y) fy = fun(y)
fy0 = interp(y, x, fx) fy0 = interp(y, x, fx)
erri = 0.5 * (abs((fy0 - fy) / (abs(fy0 + fy) + tiny))) erri = 0.5 * (abs((fy0 - fy) / (abs(fy0 + fy) + _TINY)))
err = erri.max() err = erri.max()
@ -1867,125 +2460,6 @@ def cart2polar(x, y, z=None):
return t, r, z return t, r, z
def meshgrid(*xi, **kwargs):
"""
Return coordinate matrices from one or more coordinate vectors.
Make N-D coordinate arrays for vectorized evaluations of
N-D scalar/vector fields over N-D grids, given
one-dimensional coordinate arrays x1, x2,..., xn.
Parameters
----------
x1, x2,..., xn : array_like
1-D arrays representing the coordinates of a grid.
indexing : 'xy' or 'ij' (optional)
cartesian ('xy', default) or matrix ('ij') indexing of output
sparse : True or False (default) (optional)
If True a sparse grid is returned in order to conserve memory.
copy : True (default) or False (optional)
If False a view into the original arrays are returned in order to
conserve memory
Returns
-------
X1, X2,..., XN : ndarray
For vectors `x1`, `x2`,..., 'xn' with lengths ``Ni=len(xi)`` ,
return ``(N1, N2, N3,...Nn)`` shaped arrays if indexing='ij'
or ``(N2, N1, N3,...Nn)`` shaped arrays if indexing='xy'
with the elements of `xi` repeated to fill the matrix along
the first dimension for `x1`, the second for `x2` and so on.
See Also
--------
index_tricks.mgrid : Construct a multi-dimensional "meshgrid"
using indexing notation.
index_tricks.ogrid : Construct an open multi-dimensional "meshgrid"
using indexing notation.
Examples
--------
>>> x = np.linspace(0,1,3) # coordinates along x axis
>>> y = np.linspace(0,1,2) # coordinates along y axis
>>> xv, yv = meshgrid(x,y) # extend x and y for a 2D xy grid
>>> xv
array([[ 0. , 0.5, 1. ],
[ 0. , 0.5, 1. ]])
>>> yv
array([[ 0., 0., 0.],
[ 1., 1., 1.]])
>>> xv, yv = meshgrid(x,y, sparse=True) # make sparse output arrays
>>> xv
array([[ 0. , 0.5, 1. ]])
>>> yv
array([[ 0.],
[ 1.]])
>>> meshgrid(x,y,sparse=True,indexing='ij') # change to matrix indexing
[array([[ 0. ],
[ 0.5],
[ 1. ]]), array([[ 0., 1.]])]
>>> meshgrid(x,y,indexing='ij')
[array([[ 0. , 0. ],
[ 0.5, 0.5],
[ 1. , 1. ]]), array([[ 0., 1.],
[ 0., 1.],
[ 0., 1.]])]
>>> meshgrid(0,1,5) # just a 3D point
[array([[[0]]]), array([[[1]]]), array([[[5]]])]
>>> map(np.squeeze,meshgrid(0,1,5)) # just a 3D point
[array(0), array(1), array(5)]
>>> meshgrid(3)
array([3])
>>> meshgrid(y) # 1D grid y is just returned
array([ 0., 1.])
`meshgrid` is very useful to evaluate functions on a grid.
>>> x = np.arange(-5, 5, 0.1)
>>> y = np.arange(-5, 5, 0.1)
>>> xx, yy = meshgrid(x, y, sparse=True)
>>> z = np.sin(xx**2+yy**2)/(xx**2+yy**2)
"""
copy_ = kwargs.get('copy', True)
args = atleast_1d(*xi)
if not isinstance(args, list):
if args.size > 0:
return args.copy() if copy_ else args
else:
raise TypeError('meshgrid() take 1 or more arguments (0 given)')
sparse = kwargs.get('sparse', False)
indexing = kwargs.get('indexing', 'xy') # 'ij'
ndim = len(args)
s0 = (1,) * ndim
output = [x.reshape(s0[:i] + (-1,) + s0[i + 1::])
for i, x in enumerate(args)]
shape = [x.size for x in output]
if indexing == 'xy':
# switch first and second axis
output[0].shape = (1, -1) + (1,) * (ndim - 2)
output[1].shape = (-1, 1) + (1,) * (ndim - 2)
shape[0], shape[1] = shape[1], shape[0]
if sparse:
if copy_:
return [x.copy() for x in output]
else:
return output
else:
# Return the full N-D matrix (not only the 1-D vector)
if copy_:
mult_fact = ones(shape, dtype=int)
return [x * mult_fact for x in output]
else:
return broadcast_arrays(*output)
def ndgrid(*args, **kwargs): def ndgrid(*args, **kwargs):
""" """
Same as calling meshgrid with indexing='ij' (see meshgrid for Same as calling meshgrid with indexing='ij' (see meshgrid for
@ -2059,8 +2533,7 @@ def trangood(x, f, min_n=None, min_x=None, max_x=None, max_n=inf):
xn = xo[-1] xn = xo[-1]
x0 = xo[0] x0 = xo[0]
L = float(xn - x0) L = float(xn - x0)
eps = floatinfo.eps if ((nf < min_n) or (max_n < nf) or any(abs(ddx) > 10 * _EPS * (L))):
if ((nf < min_n) or (max_n < nf) or any(abs(ddx) > 10 * eps * (L))):
# % pab 07.01.2001: Always choose the stepsize df so that # % pab 07.01.2001: Always choose the stepsize df so that
# % it is an exactly representable number. # % it is an exactly representable number.
# % This is important when calculating numerical derivatives and is # % This is important when calculating numerical derivatives and is
@ -2140,8 +2613,6 @@ def tranproc(x, f, x0, *xi):
-------- --------
trangood. trangood.
""" """
eps = floatinfo.eps
xo, fo, x0 = atleast_1d(x, f, x0) xo, fo, x0 = atleast_1d(x, f, x0)
xi = atleast_1d(*xi) xi = atleast_1d(*xi)
if not isinstance(xi, list): if not isinstance(xi, list):
@ -2165,7 +2636,7 @@ def tranproc(x, f, x0, *xi):
if N > 0: if N > 0:
y = [y0] y = [y0]
hn = xo[1] - xo[0] hn = xo[1] - xo[0]
if hn ** N < sqrt(eps): if hn ** N < sqrt(_EPS):
msg = ('Numerical problems may occur for the derivatives in ' + msg = ('Numerical problems may occur for the derivatives in ' +
'tranproc.\nThe sampling of the transformation may be too small.') 'tranproc.\nThe sampling of the transformation may be too small.')
warnings.warn(msg) warnings.warn(msg)
@ -2602,5 +3073,33 @@ def test_docstrings():
import doctest import doctest
doctest.testmod() doctest.testmod()
def test_hyp2f1():
# 1/(1-x) = F(1,1,1,x) = F(1,b,b,x) = F(a,1,a,x)
# (1+x)^n = F(-n,b,b,-x)
# atan(x) = x*F(.5,1,1.5,-x^2)
# asin(x) = x*F(.5,.5,1.5,x^2)
# log(x) = x*F(1,1,2,-x)
# log(1+x)-log(1-x) = 2*x*F(.5,1,1.5,x^2)
x = linspace(0., .7, 20)
y = hyp2f1_taylor(-1, -4, 1, .9)
y2 = hygfz(-1, -4, 1, .9)
y3 = hygfz(5, -300, 10, 0.5)
y4 = hyp2f1_taylor(5, -300, 10, 0.5)
#y = hyp2f1(0.1, 0.2, 0.3, 0.5)
#y = hyp2f1(1, 1.5, 3, -4 +3j)
#y = hyp2f1(5, 7.5, 2.5, 5)
# fun = lambda x : 1./(1-x)
# x = .99
# y = hyp2f1(1,1,1,x)
# print(y-fun(x))
#
plt = plotbackend
plt.interactive(False)
plt.semilogy(x, np.abs(y- 1. / (1 - x)) + 1e-20, 'r')
plt.show()
if __name__ == "__main__": if __name__ == "__main__":
test_docstrings() #test_docstrings()
test_hyp2f1()

File diff suppressed because it is too large Load Diff

@ -1,5 +1,5 @@
GFORTRAN module version '4' created from intmodule.f on Sat May 05 23:15:41 2012 GFORTRAN module version '4' created from intmodule.f on Fri Apr 05 14:43:34 2013
MD5:eb0327a40d874f78d04c89aa93e323f2 -- If you edit this, you'll get what you deserve. MD5:99db0c86db329df2a1ee0bbf67b9ec99 -- If you edit this, you'll get what you deserve.
(() () () () () () () () () () () () () () () () () () () () () () () () (() () () () () () () () () () () () () () () () () () () () () () () ()
() () ()) () () ())
@ -17,30 +17,30 @@ MD5:eb0327a40d874f78d04c89aa93e323f2 -- If you edit this, you'll get what you de
(2 'krobov' 'krobovmod' 'krobov' 1 ((PROCEDURE UNKNOWN-INTENT (2 'krobov' 'krobovmod' 'krobov' 1 ((PROCEDURE UNKNOWN-INTENT
MODULE-PROC DECL UNKNOWN 0 0 SUBROUTINE GENERIC) (UNKNOWN 0 0 0 UNKNOWN MODULE-PROC DECL UNKNOWN 0 0 SUBROUTINE GENERIC) (UNKNOWN 0 0 0 UNKNOWN
()) 3 0 (4 5 6 7 8 9 10 11 12) () 0 () () () 0 0) ()) 3 0 (4 5 6 7 8 9 10 11 12) () 0 () () () 0 0)
7 'functn' '' 'functn' 3 ((PROCEDURE UNKNOWN-INTENT UNKNOWN-PROC BODY 4 'ndim' '' 'ndim' 3 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN 0 0
UNKNOWN 0 0 DUMMY FUNCTION ALWAYS_EXPLICIT) (REAL 8 0 0 REAL ()) 13 0 ( DUMMY) (INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0)
14 15) () 7 () () () 0 0)
5 'minvls' '' 'minvls' 3 ((VARIABLE INOUT UNKNOWN-PROC UNKNOWN UNKNOWN 0
0 DUMMY) (INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0)
8 'abseps' '' 'abseps' 3 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 8 'abseps' '' 'abseps' 3 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN 0 0
DUMMY) (REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0) DUMMY) (REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0)
6 'maxvls' '' 'maxvls' 3 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN 0 0
DUMMY) (INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0)
9 'releps' '' 'releps' 3 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN 0 0
DUMMY) (REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0)
11 'finest' '' 'finest' 3 ((VARIABLE OUT UNKNOWN-PROC UNKNOWN UNKNOWN 0
0 DUMMY) (REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0)
12 'inform' '' 'inform' 3 ((VARIABLE OUT UNKNOWN-PROC UNKNOWN UNKNOWN 0 12 'inform' '' 'inform' 3 ((VARIABLE OUT UNKNOWN-PROC UNKNOWN UNKNOWN 0
0 DUMMY) (INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0) 0 DUMMY) (INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0)
5 'minvls' '' 'minvls' 3 ((VARIABLE INOUT UNKNOWN-PROC UNKNOWN UNKNOWN 0
0 DUMMY) (INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0)
10 'abserr' '' 'abserr' 3 ((VARIABLE OUT UNKNOWN-PROC UNKNOWN UNKNOWN 0 10 'abserr' '' 'abserr' 3 ((VARIABLE OUT UNKNOWN-PROC UNKNOWN UNKNOWN 0
0 DUMMY) (REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0) 0 DUMMY) (REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0)
11 'finest' '' 'finest' 3 ((VARIABLE OUT UNKNOWN-PROC UNKNOWN UNKNOWN 0 7 'functn' '' 'functn' 3 ((PROCEDURE UNKNOWN-INTENT UNKNOWN-PROC BODY
0 DUMMY) (REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0) UNKNOWN 0 0 DUMMY FUNCTION ALWAYS_EXPLICIT) (REAL 8 0 0 REAL ()) 13 0 (
4 'ndim' '' 'ndim' 3 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 14 15) () 7 () () () 0 0)
DUMMY) (INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0)
9 'releps' '' 'releps' 3 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN 0 0
DUMMY) (REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0)
6 'maxvls' '' 'maxvls' 3 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN 0 0
DUMMY) (INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0)
14 'n' '' 'n' 13 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 DUMMY) (
INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0)
15 'z' '' 'z' 13 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 15 'z' '' 'z' 13 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN 0 0
DIMENSION DUMMY) (REAL 8 0 0 REAL ()) 0 0 () (1 ASSUMED_SHAPE (CONSTANT DIMENSION DUMMY) (REAL 8 0 0 REAL ()) 0 0 () (1 ASSUMED_SHAPE (CONSTANT
(INTEGER 4 0 0 INTEGER ()) 0 '1') ()) 0 () () () 0 0) (INTEGER 4 0 0 INTEGER ()) 0 '1') ()) 0 () () () 0 0)
14 'n' '' 'n' 13 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 DUMMY) (
INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0)
) )
('krobov' 0 2) ('krobov' 0 2)

@ -1,5 +1,5 @@
GFORTRAN module version '4' created from intmodule.f on Sat May 05 23:15:40 2012 GFORTRAN module version '4' created from intmodule.f on Fri Apr 05 14:43:34 2013
MD5:f628260304c0d5215e1ef95941599430 -- If you edit this, you'll get what you deserve. MD5:c88c5a15c480306fb971bd1e5ced587e -- If you edit this, you'll get what you deserve.
(() () () () () () () () () () () () () () () () () () () () () () () () (() () () () () () () () () () () () () () () () () () () () () () () ()
() () ()) () () ())
@ -17,6 +17,14 @@ MD5:f628260304c0d5215e1ef95941599430 -- If you edit this, you'll get what you de
(2 'ranmc' 'rcrudemod' 'ranmc' 1 ((PROCEDURE UNKNOWN-INTENT MODULE-PROC (2 'ranmc' 'rcrudemod' 'ranmc' 1 ((PROCEDURE UNKNOWN-INTENT MODULE-PROC
DECL UNKNOWN 0 0 SUBROUTINE GENERIC) (UNKNOWN 0 0 0 UNKNOWN ()) 3 0 (4 5 DECL UNKNOWN 0 0 SUBROUTINE GENERIC) (UNKNOWN 0 0 0 UNKNOWN ()) 3 0 (4 5
6 7 8 9 10 11) () 0 () () () 0 0) 6 7 8 9 10 11) () 0 () () () 0 0)
8 'releps' '' 'releps' 3 ((VARIABLE UNKNOWN-INTENT UNKNOWN-PROC UNKNOWN
UNKNOWN 0 0 DUMMY) (REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0)
9 'error' '' 'error' 3 ((VARIABLE UNKNOWN-INTENT UNKNOWN-PROC UNKNOWN
UNKNOWN 0 0 DUMMY) (REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0)
10 'value' '' 'value' 3 ((VARIABLE UNKNOWN-INTENT UNKNOWN-PROC UNKNOWN
UNKNOWN 0 0 DUMMY) (REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0)
11 'inform' '' 'inform' 3 ((VARIABLE UNKNOWN-INTENT UNKNOWN-PROC UNKNOWN
UNKNOWN 0 0 DUMMY) (INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0)
4 'n' '' 'n' 3 ((VARIABLE UNKNOWN-INTENT UNKNOWN-PROC UNKNOWN UNKNOWN 0 4 'n' '' 'n' 3 ((VARIABLE UNKNOWN-INTENT UNKNOWN-PROC UNKNOWN UNKNOWN 0
0 DUMMY) (INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0) 0 DUMMY) (INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0)
5 'maxpts' '' 'maxpts' 3 ((VARIABLE UNKNOWN-INTENT UNKNOWN-PROC UNKNOWN 5 'maxpts' '' 'maxpts' 3 ((VARIABLE UNKNOWN-INTENT UNKNOWN-PROC UNKNOWN
@ -26,14 +34,6 @@ UNKNOWN 0 0 DUMMY FUNCTION ALWAYS_EXPLICIT) (REAL 8 0 0 REAL ()) 12 0 (
13 14) () 6 () () () 0 0) 13 14) () 6 () () () 0 0)
7 'abseps' '' 'abseps' 3 ((VARIABLE UNKNOWN-INTENT UNKNOWN-PROC UNKNOWN 7 'abseps' '' 'abseps' 3 ((VARIABLE UNKNOWN-INTENT UNKNOWN-PROC UNKNOWN
UNKNOWN 0 0 DUMMY) (REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0) UNKNOWN 0 0 DUMMY) (REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0)
8 'releps' '' 'releps' 3 ((VARIABLE UNKNOWN-INTENT UNKNOWN-PROC UNKNOWN
UNKNOWN 0 0 DUMMY) (REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0)
9 'error' '' 'error' 3 ((VARIABLE UNKNOWN-INTENT UNKNOWN-PROC UNKNOWN
UNKNOWN 0 0 DUMMY) (REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0)
10 'value' '' 'value' 3 ((VARIABLE UNKNOWN-INTENT UNKNOWN-PROC UNKNOWN
UNKNOWN 0 0 DUMMY) (REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0)
11 'inform' '' 'inform' 3 ((VARIABLE UNKNOWN-INTENT UNKNOWN-PROC UNKNOWN
UNKNOWN 0 0 DUMMY) (INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0)
13 'n' '' 'n' 12 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 DUMMY) ( 13 'n' '' 'n' 12 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 DUMMY) (
INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0) INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0)
14 'z' '' 'z' 12 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 14 'z' '' 'z' 12 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN 0 0

@ -1,5 +1,5 @@
GFORTRAN module version '4' created from rind71mod.f on Mon Feb 18 02:58:35 2013 GFORTRAN module version '4' created from rind71mod.f on Fri Apr 05 14:43:37 2013
MD5:520dd65f929350d1434842f22f38b888 -- If you edit this, you'll get what you deserve. MD5:c5460e9301460ce17aef8031cd82ad57 -- If you edit this, you'll get what you deserve.
(() () () () () () () () () () () () () () () () () () () () () () () (() () () () () () () () () () () () () () () () () () () () () () ()
() () () ()) () () () ())
@ -27,16 +27,26 @@ UNKNOWN ()) 10 0 (11 12 13 14 15 16 17 18) () 0 () () () 0 0)
4 'setdata' 'rind71mod' 'setdata' 1 ((PROCEDURE UNKNOWN-INTENT 4 'setdata' 'rind71mod' 'setdata' 1 ((PROCEDURE UNKNOWN-INTENT
MODULE-PROC DECL UNKNOWN 0 0 SUBROUTINE GENERIC) (UNKNOWN 0 0 0 UNKNOWN MODULE-PROC DECL UNKNOWN 0 0 SUBROUTINE GENERIC) (UNKNOWN 0 0 0 UNKNOWN
()) 19 0 (20 21 22 23 24 25 26 27 28) () 0 () () () 0 0) ()) 19 0 (20 21 22 23 24 25 26 27 28) () 0 () () () 0 0)
25 'dnit' '' 'dnit' 19 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 27 'dnint' '' 'dnint' 19 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN 0 0
DUMMY) (INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0) DUMMY) (INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0)
28 'dxsplt' '' 'dxsplt' 19 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN 0
0 DUMMY) (REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0)
20 'method' '' 'method' 19 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN 0
0 DUMMY) (INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0)
23 'dreps' '' 'dreps' 19 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN 0 0
DUMMY) (REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0)
24 'deps2' '' 'deps2' 19 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 24 'deps2' '' 'deps2' 19 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN 0 0
DUMMY) (REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0) DUMMY) (REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0)
25 'dnit' '' 'dnit' 19 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN 0 0
DUMMY) (INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0)
26 'dxc' '' 'dxc' 19 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 26 'dxc' '' 'dxc' 19 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN 0 0
DUMMY) (REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0) DUMMY) (REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0)
27 'dnint' '' 'dnint' 19 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 21 'scale' '' 'scale' 19 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN 0 0
DUMMY) (REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0)
22 'depss' '' 'depss' 19 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN 0 0
DUMMY) (REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0)
9 'speed' '' 'speed' 8 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN 0 0
DUMMY) (INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0) DUMMY) (INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0)
28 'dxsplt' '' 'dxsplt' 19 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN 0
0 DUMMY) (REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0)
7 'array' '' 'array' 6 ((VARIABLE UNKNOWN-INTENT UNKNOWN-PROC UNKNOWN 7 'array' '' 'array' 6 ((VARIABLE UNKNOWN-INTENT UNKNOWN-PROC UNKNOWN
UNKNOWN 0 0 DIMENSION DUMMY) (REAL 8 0 0 REAL ()) 0 0 () (2 UNKNOWN 0 0 DIMENSION DUMMY) (REAL 8 0 0 REAL ()) 0 0 () (2
ASSUMED_SHAPE (CONSTANT (INTEGER 4 0 0 INTEGER ()) 0 '1') () (CONSTANT ( ASSUMED_SHAPE (CONSTANT (INTEGER 4 0 0 INTEGER ()) 0 '1') () (CONSTANT (
@ -68,16 +78,6 @@ DIMENSION DUMMY) (REAL 8 0 0 REAL ()) 0 0 () (2 ASSUMED_SHAPE (CONSTANT
DIMENSION DUMMY) (REAL 8 0 0 REAL ()) 0 0 () (2 ASSUMED_SHAPE (CONSTANT DIMENSION DUMMY) (REAL 8 0 0 REAL ()) 0 0 () (2 ASSUMED_SHAPE (CONSTANT
(INTEGER 4 0 0 INTEGER ()) 0 '1') () (CONSTANT (INTEGER 4 0 0 INTEGER ()) (INTEGER 4 0 0 INTEGER ()) 0 '1') () (CONSTANT (INTEGER 4 0 0 INTEGER ())
0 '1') ()) 0 () () () 0 0) 0 '1') ()) 0 () () () 0 0)
9 'speed' '' 'speed' 8 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN 0 0
DUMMY) (INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0)
20 'method' '' 'method' 19 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN 0
0 DUMMY) (INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0)
21 'scale' '' 'scale' 19 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN 0 0
DUMMY) (REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0)
22 'depss' '' 'depss' 19 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN 0 0
DUMMY) (REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0)
23 'dreps' '' 'dreps' 19 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN 0 0
DUMMY) (REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0)
) )
('echo' 0 2 'initdata' 0 3 'rind71' 0 5 'setdata' 0 4) ('echo' 0 2 'initdata' 0 3 'rind71' 0 5 'setdata' 0 4)

@ -1,5 +1,5 @@
GFORTRAN module version '4' created from rindmod.f on Sat May 05 23:15:44 2012 GFORTRAN module version '4' created from rindmod.f on Fri Apr 05 14:43:35 2013
MD5:27b48943ab247880a4203cf14574fba3 -- If you edit this, you'll get what you deserve. MD5:dcdbb9dedca21469ecd6ba2a3e2bf880 -- If you edit this, you'll get what you deserve.
(() () () () () () () () () () () () () () () () () () () () () () () (() () () () () () () () () () () () () () () () () () () () () () ()
() () () ()) () () () ())
@ -52,12 +52,6 @@ UNKNOWN ()) 15 0 (16 17 18 19 20 21 22 23 24 25 26) () 0 () () () 0 0)
MODULE-PROC DECL UNKNOWN 0 0 SUBROUTINE GENERIC ALWAYS_EXPLICIT) ( MODULE-PROC DECL UNKNOWN 0 0 SUBROUTINE GENERIC ALWAYS_EXPLICIT) (
UNKNOWN 0 0 0 UNKNOWN ()) 27 0 (28 29 30 31 32 33 34 35 36 37) () 0 () () UNKNOWN 0 0 0 UNKNOWN ()) 27 0 (28 29 30 31 32 33 34 35 36 37) () 0 () ()
() 0 0) () 0 0)
28 'method' '' 'method' 27 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN 0
0 OPTIONAL DUMMY) (INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0)
29 'xcscale' '' 'xcscale' 27 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN
0 0 OPTIONAL DUMMY) (REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0)
30 'abseps' '' 'abseps' 27 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN 0
0 OPTIONAL DUMMY) (REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0)
31 'releps' '' 'releps' 27 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN 0 31 'releps' '' 'releps' 27 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN 0
0 OPTIONAL DUMMY) (REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0) 0 OPTIONAL DUMMY) (REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0)
32 'coveps' '' 'coveps' 27 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN 0 32 'coveps' '' 'coveps' 27 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN 0
@ -72,6 +66,12 @@ OPTIONAL DUMMY) (INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0)
0 0 OPTIONAL DUMMY) (REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0) 0 0 OPTIONAL DUMMY) (REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0)
37 'nc1c2' '' 'nc1c2' 27 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 37 'nc1c2' '' 'nc1c2' 27 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN 0 0
OPTIONAL DUMMY) (INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0) OPTIONAL DUMMY) (INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0)
28 'method' '' 'method' 27 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN 0
0 OPTIONAL DUMMY) (INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0)
29 'xcscale' '' 'xcscale' 27 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN
0 0 OPTIONAL DUMMY) (REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0)
30 'abseps' '' 'abseps' 27 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN 0
0 OPTIONAL DUMMY) (REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0)
16 'vals' '' 'vals' 15 ((VARIABLE OUT UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 16 'vals' '' 'vals' 15 ((VARIABLE OUT UNKNOWN-PROC UNKNOWN UNKNOWN 0 0
DIMENSION DUMMY) (REAL 8 0 0 REAL ()) 0 0 () (1 ASSUMED_SHAPE (CONSTANT DIMENSION DUMMY) (REAL 8 0 0 REAL ()) 0 0 () (1 ASSUMED_SHAPE (CONSTANT
(INTEGER 4 0 0 INTEGER ()) 0 '1') ()) 0 () () () 0 0) (INTEGER 4 0 0 INTEGER ()) 0 '1') ()) 0 () () () 0 0)

@ -1,5 +1,5 @@
GFORTRAN module version '4' created from swapmod.f on Sat May 05 23:15:42 2012 GFORTRAN module version '4' created from swapmod.f on Fri Apr 05 14:43:34 2013
MD5:52275e19413dc7ab9d6082dbb7b7af80 -- If you edit this, you'll get what you deserve. MD5:d3f134c81002cd5f6cec09ebff3e336f -- If you edit this, you'll get what you deserve.
(() () () () () () () () () () () () () () () () () () () () () () () () (() () () () () () () () () () () () () () () () () () () () () () () ()
() () ()) () () ())
@ -25,6 +25,12 @@ DECL UNKNOWN 0 0 SUBROUTINE) (UNKNOWN 0 0 0 UNKNOWN ()) 11 0 (12 13) ()
0 () () () 0 0) 0 () () () 0 0)
14 'swapmod' 'swapmod' 'swapmod' 1 ((MODULE UNKNOWN-INTENT UNKNOWN-PROC 14 'swapmod' 'swapmod' 'swapmod' 1 ((MODULE UNKNOWN-INTENT UNKNOWN-PROC
UNKNOWN UNKNOWN 0 0) (UNKNOWN 0 0 0 UNKNOWN ()) 0 0 () () 0 () () () 0 0) UNKNOWN UNKNOWN 0 0) (UNKNOWN 0 0 0 UNKNOWN ()) 0 0 () () 0 () () () 0 0)
12 'a' '' 'a' 11 ((VARIABLE INOUT UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 DUMMY)
(REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0)
13 'b' '' 'b' 11 ((VARIABLE INOUT UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 DUMMY)
(REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0)
9 'a' '' 'a' 8 ((VARIABLE INOUT UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 DUMMY)
(INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0)
10 'b' '' 'b' 8 ((VARIABLE INOUT UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 DUMMY) 10 'b' '' 'b' 8 ((VARIABLE INOUT UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 DUMMY)
(INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0) (INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0)
6 'a' '' 'a' 5 ((VARIABLE INOUT UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 DUMMY) 6 'a' '' 'a' 5 ((VARIABLE INOUT UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 DUMMY)
@ -33,12 +39,6 @@ UNKNOWN UNKNOWN 0 0) (UNKNOWN 0 0 0 UNKNOWN ()) 0 0 () () 0 () () () 0 0)
7 'b' '' 'b' 5 ((VARIABLE INOUT UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 DUMMY) 7 'b' '' 'b' 5 ((VARIABLE INOUT UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 DUMMY)
(CHARACTER 1 0 0 CHARACTER ((CONSTANT (INTEGER 4 0 0 INTEGER ()) 0 '1'))) (CHARACTER 1 0 0 CHARACTER ((CONSTANT (INTEGER 4 0 0 INTEGER ()) 0 '1')))
0 0 () () 0 () () () 0 0) 0 0 () () 0 () () () 0 0)
12 'a' '' 'a' 11 ((VARIABLE INOUT UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 DUMMY)
(REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0)
13 'b' '' 'b' 11 ((VARIABLE INOUT UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 DUMMY)
(REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0)
9 'a' '' 'a' 8 ((VARIABLE INOUT UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 DUMMY)
(INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0)
) )
('swap_c' 0 2 'swap_i' 0 3 'swap_r' 0 4 'swapmod' 0 14) ('swap_c' 0 2 'swap_i' 0 3 'swap_r' 0 4 'swapmod' 0 14)

@ -0,0 +1,402 @@
from __future__ import division, print_function, absolute_import
import warnings
import numpy as np
from scipy.lib.six import callable
def binned_statistic(x, values, statistic='mean',
bins=10, range=None):
"""
Compute a binned statistic for a set of data.
This is a generalization of a histogram function. A histogram divides
the space into bins, and returns the count of the number of points in
each bin. This function allows the computation of the sum, mean, median,
or other statistic of the values within each bin.
.. versionadded:: 0.11.0
Parameters
----------
x : array_like
A sequence of values to be binned.
values : array_like
The values on which the statistic will be computed. This must be
the same shape as `x`.
statistic : string or callable, optional
The statistic to compute (default is 'mean').
The following statistics are available:
* 'mean' : compute the mean of values for points within each bin.
Empty bins will be represented by NaN.
* 'median' : compute the median of values for points within each
bin. Empty bins will be represented by NaN.
* 'count' : compute the count of points within each bin. This is
identical to an unweighted histogram. `values` array is not
referenced.
* 'sum' : compute the sum of values for points within each bin.
This is identical to a weighted histogram.
* function : a user-defined function which takes a 1D array of
values, and outputs a single numerical statistic. This function
will be called on the values in each bin. Empty bins will be
represented by function([]), or NaN if this returns an error.
bins : int or sequence of scalars, optional
If `bins` is an int, it defines the number of equal-width
bins in the given range (10, by default). If `bins` is a sequence,
it defines the bin edges, including the rightmost edge, allowing
for non-uniform bin widths.
range : (float, float) or [(float, float)], optional
The lower and upper range of the bins. If not provided, range
is simply ``(x.min(), x.max())``. Values outside the range are
ignored.
Returns
-------
statistic : array
The values of the selected statistic in each bin.
bin_edges : array of dtype float
Return the bin edges ``(length(statistic)+1)``.
binnumber : 1-D ndarray of ints
This assigns to each observation an integer that represents the bin
in which this observation falls. Array has the same length as values.
See Also
--------
numpy.histogram, binned_statistic_2d, binned_statistic_dd
Notes
-----
All but the last (righthand-most) bin is half-open. In other words, if
`bins` is::
[1, 2, 3, 4]
then the first bin is ``[1, 2)`` (including 1, but excluding 2) and the
second ``[2, 3)``. The last bin, however, is ``[3, 4]``, which *includes*
4.
Examples
--------
>>> stats.binned_statistic([1, 2, 1, 2, 4], np.arange(5), statistic='mean',
... bins=3)
(array([ 1., 2., 4.]), array([ 1., 2., 3., 4.]), array([1, 2, 1, 2, 3]))
>>> stats.binned_statistic([1, 2, 1, 2, 4], np.arange(5), statistic='mean', bins=3)
(array([ 1., 2., 4.]), array([ 1., 2., 3., 4.]), array([1, 2, 1, 2, 3]))
"""
try:
N = len(bins)
except TypeError:
N = 1
if N != 1:
bins = [np.asarray(bins, float)]
if range is not None:
if len(range) == 2:
range = [range]
medians, edges, xy = binned_statistic_dd([x], values, statistic,
bins, range)
return medians, edges[0], xy
def binned_statistic_2d(x, y, values, statistic='mean',
bins=10, range=None):
"""
Compute a bidimensional binned statistic for a set of data.
This is a generalization of a histogram2d function. A histogram divides
the space into bins, and returns the count of the number of points in
each bin. This function allows the computation of the sum, mean, median,
or other statistic of the values within each bin.
.. versionadded:: 0.11.0
Parameters
----------
x : (N,) array_like
A sequence of values to be binned along the first dimension.
y : (M,) array_like
A sequence of values to be binned along the second dimension.
values : (N,) array_like
The values on which the statistic will be computed. This must be
the same shape as `x`.
statistic : string or callable, optional
The statistic to compute (default is 'mean').
The following statistics are available:
* 'mean' : compute the mean of values for points within each bin.
Empty bins will be represented by NaN.
* 'median' : compute the median of values for points within each
bin. Empty bins will be represented by NaN.
* 'count' : compute the count of points within each bin. This is
identical to an unweighted histogram. `values` array is not
referenced.
* 'sum' : compute the sum of values for points within each bin.
This is identical to a weighted histogram.
* function : a user-defined function which takes a 1D array of
values, and outputs a single numerical statistic. This function
will be called on the values in each bin. Empty bins will be
represented by function([]), or NaN if this returns an error.
bins : int or [int, int] or array-like or [array, array], optional
The bin specification:
* the number of bins for the two dimensions (nx=ny=bins),
* the number of bins in each dimension (nx, ny = bins),
* the bin edges for the two dimensions (x_edges = y_edges = bins),
* the bin edges in each dimension (x_edges, y_edges = bins).
range : (2,2) array_like, optional
The leftmost and rightmost edges of the bins along each dimension
(if not specified explicitly in the `bins` parameters):
[[xmin, xmax], [ymin, ymax]]. All values outside of this range will be
considered outliers and not tallied in the histogram.
Returns
-------
statistic : (nx, ny) ndarray
The values of the selected statistic in each two-dimensional bin
xedges : (nx + 1) ndarray
The bin edges along the first dimension.
yedges : (ny + 1) ndarray
The bin edges along the second dimension.
binnumber : 1-D ndarray of ints
This assigns to each observation an integer that represents the bin
in which this observation falls. Array has the same length as `values`.
See Also
--------
numpy.histogram2d, binned_statistic, binned_statistic_dd
"""
# This code is based on np.histogram2d
try:
N = len(bins)
except TypeError:
N = 1
if N != 1 and N != 2:
xedges = yedges = np.asarray(bins, float)
bins = [xedges, yedges]
medians, edges, xy = binned_statistic_dd([x, y], values, statistic,
bins, range)
return medians, edges[0], edges[1], xy
def binned_statistic_dd(sample, values, statistic='mean',
bins=10, range=None):
"""
Compute a multidimensional binned statistic for a set of data.
This is a generalization of a histogramdd function. A histogram divides
the space into bins, and returns the count of the number of points in
each bin. This function allows the computation of the sum, mean, median,
or other statistic of the values within each bin.
.. versionadded:: 0.11.0
Parameters
----------
sample : array_like
Data to histogram passed as a sequence of D arrays of length N, or
as an (N,D) array.
values : array_like
The values on which the statistic will be computed. This must be
the same shape as x.
statistic : string or callable, optional
The statistic to compute (default is 'mean').
The following statistics are available:
* 'mean' : compute the mean of values for points within each bin.
Empty bins will be represented by NaN.
* 'median' : compute the median of values for points within each
bin. Empty bins will be represented by NaN.
* 'count' : compute the count of points within each bin. This is
identical to an unweighted histogram. `values` array is not
referenced.
* 'sum' : compute the sum of values for points within each bin.
This is identical to a weighted histogram.
* function : a user-defined function which takes a 1D array of
values, and outputs a single numerical statistic. This function
will be called on the values in each bin. Empty bins will be
represented by function([]), or NaN if this returns an error.
bins : sequence or int, optional
The bin specification:
* A sequence of arrays describing the bin edges along each dimension.
* The number of bins for each dimension (nx, ny, ... =bins)
* The number of bins for all dimensions (nx=ny=...=bins).
range : sequence, optional
A sequence of lower and upper bin edges to be used if the edges are
not given explicitely in `bins`. Defaults to the minimum and maximum
values along each dimension.
Returns
-------
statistic : ndarray, shape(nx1, nx2, nx3,...)
The values of the selected statistic in each two-dimensional bin
edges : list of ndarrays
A list of D arrays describing the (nxi + 1) bin edges for each
dimension
binnumber : 1-D ndarray of ints
This assigns to each observation an integer that represents the bin
in which this observation falls. Array has the same length as values.
See Also
--------
np.histogramdd, binned_statistic, binned_statistic_2d
"""
if type(statistic) == str:
if statistic not in ['mean', 'median', 'count', 'sum', 'std']:
raise ValueError('unrecognized statistic "%s"' % statistic)
elif callable(statistic):
pass
else:
raise ValueError("statistic not understood")
# This code is based on np.histogramdd
try:
# Sample is an ND-array.
N, D = sample.shape
except (AttributeError, ValueError):
# Sample is a sequence of 1D arrays.
sample = np.atleast_2d(sample).T
N, D = sample.shape
nbin = np.empty(D, int)
edges = D * [None]
dedges = D * [None]
try:
M = len(bins)
if M != D:
raise AttributeError('The dimension of bins must be equal '
'to the dimension of the sample x.')
except TypeError:
bins = D * [bins]
# Select range for each dimension
# Used only if number of bins is given.
if range is None:
smin = np.atleast_1d(np.array(sample.min(0), float))
smax = np.atleast_1d(np.array(sample.max(0), float))
else:
smin = np.zeros(D)
smax = np.zeros(D)
for i in np.arange(D):
smin[i], smax[i] = range[i]
# Make sure the bins have a finite width.
for i in np.arange(len(smin)):
if smin[i] == smax[i]:
smin[i] = smin[i] - .5
smax[i] = smax[i] + .5
# Create edge arrays
for i in np.arange(D):
if np.isscalar(bins[i]):
nbin[i] = bins[i] + 2 # +2 for outlier bins
edges[i] = np.linspace(smin[i], smax[i], nbin[i] - 1)
else:
edges[i] = np.asarray(bins[i], float)
nbin[i] = len(edges[i]) + 1 # +1 for outlier bins
dedges[i] = np.diff(edges[i])
nbin = np.asarray(nbin)
# Compute the bin number each sample falls into.
Ncount = {}
for i in np.arange(D):
Ncount[i] = np.digitize(sample[:, i], edges[i])
# Using digitize, values that fall on an edge are put in the right bin.
# For the rightmost bin, we want values equal to the right
# edge to be counted in the last bin, and not as an outlier.
for i in np.arange(D):
# Rounding precision
decimal = int(-np.log10(dedges[i].min())) + 6
# Find which points are on the rightmost edge.
on_edge = np.where(np.around(sample[:, i], decimal)
== np.around(edges[i][-1], decimal))[0]
# Shift these points one bin to the left.
Ncount[i][on_edge] -= 1
# Compute the sample indices in the flattened statistic matrix.
ni = nbin.argsort()
xy = np.zeros(N, int)
for i in np.arange(0, D - 1):
xy += Ncount[ni[i]] * nbin[ni[i + 1:]].prod()
xy += Ncount[ni[-1]]
result = np.empty(nbin.prod(), float)
if statistic == 'mean':
result.fill(np.nan)
flatcount = np.bincount(xy, None)
flatsum = np.bincount(xy, values)
a = flatcount.nonzero()
result[a] = flatsum[a] / flatcount[a]
elif statistic == 'std':
result.fill(0)
flatcount = np.bincount(xy, None)
flatsum = np.bincount(xy, values)
flatsum2 = np.bincount(xy, values ** 2)
a = flatcount.nonzero()
result[a] = np.sqrt(flatsum2[a] / flatcount[a]
- (flatsum[a] / flatcount[a]) ** 2)
elif statistic == 'count':
result.fill(0)
flatcount = np.bincount(xy, None)
a = np.arange(len(flatcount))
result[a] = flatcount
elif statistic == 'sum':
result.fill(0)
flatsum = np.bincount(xy, values)
a = np.arange(len(flatsum))
result[a] = flatsum
elif statistic == 'median':
result.fill(np.nan)
for i in np.unique(xy):
result[i] = np.median(values[xy == i])
elif callable(statistic):
with warnings.catch_warnings():
# Numpy generates a warnings for mean/std/... with empty list
warnings.filterwarnings('ignore', category=RuntimeWarning)
old = np.seterr(invalid='ignore')
try:
null = statistic([])
except:
null = np.nan
np.seterr(**old)
result.fill(null)
for i in np.unique(xy):
result[i] = statistic(values[xy == i])
# Shape into a proper matrix
result = result.reshape(np.sort(nbin))
for i in np.arange(nbin.size):
j = ni.argsort()[i]
result = result.swapaxes(i, j)
ni[i], ni[j] = ni[j], ni[i]
# Remove outliers (indices 0 and -1 for each dimension).
core = D * [slice(1, -1)]
result = result[core]
if (result.shape != nbin - 2).any():
raise RuntimeError('Internal Shape Error')
return result, edges, xy

@ -0,0 +1,24 @@
"""
Statistics-related constants.
"""
from __future__ import division, print_function, absolute_import
import numpy as np
# The smallest representable positive number such that 1.0 + _EPS != 1.0.
_EPS = np.finfo(float).eps
# The largest [in magnitude] usable floating value.
_XMAX = np.finfo(float).machar.xmax
# The smallest [in magnitude] usable floating value.
_XMIN = np.finfo(float).machar.xmin
# -special.psi(1)
_EULER = 0.577215664901532860606512090082402431042
# special.zeta(3, 1) Apery's constant
_ZETA3 = 1.202056903159594285399738161511449990765

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

@ -455,7 +455,7 @@ class rv_frozen(object):
def __init__(self, dist, *args, **kwds): def __init__(self, dist, *args, **kwds):
self.dist = dist self.dist = dist
args, loc, scale = dist._parse_args(*args, **kwds) args, loc, scale = dist._parse_args(*args, **kwds)
if len(args) == dist.numargs - 2: # isinstance(dist, rv_continuous): if isinstance(dist, rv_continuous):
self.par = args + (loc, scale) self.par = args + (loc, scale)
else: # rv_discrete else: # rv_discrete
self.par = args + (loc,) self.par = args + (loc,)

@ -0,0 +1,15 @@
# -*- coding: utf-8 -*-
"""
Created on Tue Dec 06 16:02:47 2011
@author: pab
"""
import numpy as np
import wafo.kdetools as wk
n = 100
x = np.sort(5*np.random.rand(1,n)-2.5, axis=-1).ravel()
y = (np.cos(x)>2*np.random.rand(n, 1)-1).ravel()
kreg = wk.KRegression(x,y)
f = kreg(output='plotobj', title='Kernel regression', plotflag=1)
f.plot()

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

@ -1,154 +1,156 @@
from __future__ import division, print_function, absolute_import from __future__ import division, print_function, absolute_import
import inspect import inspect
import warnings import warnings
import numpy as np import numpy as np
import numpy.testing as npt import numpy.testing as npt
#from scipy.lib._version import NumpyVersion #from scipy.lib._version import NumpyVersion
from scipy import stats from scipy import stats
#NUMPY_BELOW_1_7 = NumpyVersion(np.__version__) < '1.7.0' #NUMPY_BELOW_1_7 = NumpyVersion(np.__version__) < '1.7.0'
NUMPY_BELOW_1_7 =np.__version__ < '1.7.0' NUMPY_BELOW_1_7 = np.__version__ < '1.7.0'
def check_normalization(distfn, args, distname): def check_normalization(distfn, args, distname):
norm_moment = distfn.moment(0, *args) norm_moment = distfn.moment(0, *args)
npt.assert_allclose(norm_moment, 1.0) npt.assert_allclose(norm_moment, 1.0)
# this is a temporary plug: either ncf or expect is problematic; # this is a temporary plug: either ncf or expect is problematic;
# best be marked as a knownfail, but I've no clue how to do it. # best be marked as a knownfail, but I've no clue how to do it.
if distname == "ncf": if distname == "ncf":
atol, rtol = 1e-5, 0 atol, rtol = 1e-5, 0
else: else:
atol, rtol = 1e-7, 1e-7 atol, rtol = 1e-7, 1e-7
normalization_expect = distfn.expect(lambda x: 1, args=args) normalization_expect = distfn.expect(lambda x: 1, args=args)
npt.assert_allclose(normalization_expect, 1.0, atol=atol, rtol=rtol, npt.assert_allclose(normalization_expect, 1.0, atol=atol, rtol=rtol,
err_msg=distname, verbose=True) err_msg=distname, verbose=True)
normalization_cdf = distfn.cdf(distfn.b, *args) normalization_cdf = distfn.cdf(distfn.b, *args)
npt.assert_allclose(normalization_cdf, 1.0) npt.assert_allclose(normalization_cdf, 1.0)
def check_moment(distfn, arg, m, v, msg): def check_moment(distfn, arg, m, v, msg):
m1 = distfn.moment(1, *arg) m1 = distfn.moment(1, *arg)
m2 = distfn.moment(2, *arg) m2 = distfn.moment(2, *arg)
if not np.isinf(m): if not np.isinf(m):
npt.assert_almost_equal(m1, m, decimal=10, err_msg=msg + npt.assert_almost_equal(m1, m, decimal=10, err_msg=msg +
' - 1st moment') ' - 1st moment')
else: # or np.isnan(m1), else: # or np.isnan(m1),
npt.assert_(np.isinf(m1), npt.assert_(np.isinf(m1),
msg + ' - 1st moment -infinite, m1=%s' % str(m1)) msg + ' - 1st moment -infinite, m1=%s' % str(m1))
if not np.isinf(v): if not np.isinf(v):
npt.assert_almost_equal(m2 - m1 * m1, v, decimal=10, err_msg=msg + npt.assert_almost_equal(m2 - m1 * m1, v, decimal=10, err_msg=msg +
' - 2ndt moment') ' - 2ndt moment')
else: # or np.isnan(m2), else: # or np.isnan(m2),
npt.assert_(np.isinf(m2), npt.assert_(np.isinf(m2),
msg + ' - 2nd moment -infinite, m2=%s' % str(m2)) msg + ' - 2nd moment -infinite, m2=%s' % str(m2))
def check_mean_expect(distfn, arg, m, msg): def check_mean_expect(distfn, arg, m, msg):
if np.isfinite(m): if np.isfinite(m):
m1 = distfn.expect(lambda x: x, arg) m1 = distfn.expect(lambda x: x, arg)
npt.assert_almost_equal(m1, m, decimal=5, err_msg=msg + npt.assert_almost_equal(m1, m, decimal=5, err_msg=msg +
' - 1st moment (expect)') ' - 1st moment (expect)')
def check_var_expect(distfn, arg, m, v, msg): def check_var_expect(distfn, arg, m, v, msg):
if np.isfinite(v): if np.isfinite(v):
m2 = distfn.expect(lambda x: x*x, arg) m2 = distfn.expect(lambda x: x * x, arg)
npt.assert_almost_equal(m2, v + m*m, decimal=5, err_msg=msg + npt.assert_almost_equal(m2, v + m * m, decimal=5, err_msg=msg +
' - 2st moment (expect)') ' - 2st moment (expect)')
def check_skew_expect(distfn, arg, m, v, s, msg): def check_skew_expect(distfn, arg, m, v, s, msg):
if np.isfinite(s): if np.isfinite(s):
m3e = distfn.expect(lambda x: np.power(x-m, 3), arg) m3e = distfn.expect(lambda x: np.power(x - m, 3), arg)
npt.assert_almost_equal(m3e, s * np.power(v, 1.5), npt.assert_almost_equal(m3e, s * np.power(v, 1.5),
decimal=5, err_msg=msg + ' - skew') decimal=5, err_msg=msg + ' - skew')
else: else:
npt.assert_(np.isnan(s)) npt.assert_(np.isnan(s))
def check_kurt_expect(distfn, arg, m, v, k, msg): def check_kurt_expect(distfn, arg, m, v, k, msg):
if np.isfinite(k): if np.isfinite(k):
m4e = distfn.expect(lambda x: np.power(x-m, 4), arg) m4e = distfn.expect(lambda x: np.power(x - m, 4), arg)
npt.assert_allclose(m4e, (k + 3.) * np.power(v, 2), atol=1e-5, rtol=1e-5, npt.assert_allclose(
err_msg=msg + ' - kurtosis') m4e, (k + 3.) * np.power(v, 2), atol=1e-5, rtol=1e-5,
else: err_msg=msg + ' - kurtosis')
npt.assert_(np.isnan(k)) else:
npt.assert_(np.isnan(k))
def check_entropy(distfn, arg, msg):
ent = distfn.entropy(*arg) def check_entropy(distfn, arg, msg):
npt.assert_(not np.isnan(ent), msg + 'test Entropy is nan') ent = distfn.entropy(*arg)
npt.assert_(not np.isnan(ent), msg + 'test Entropy is nan')
def check_private_entropy(distfn, args, superclass):
# compare a generic _entropy with the distribution-specific implementation def check_private_entropy(distfn, args, superclass):
npt.assert_allclose(distfn._entropy(*args), # compare a generic _entropy with the distribution-specific implementation
superclass._entropy(distfn, *args)) npt.assert_allclose(distfn._entropy(*args),
superclass._entropy(distfn, *args))
def check_edge_support(distfn, args):
# Make sure the x=self.a and self.b are handled correctly. def check_edge_support(distfn, args):
x = [distfn.a, distfn.b] # Make sure the x=self.a and self.b are handled correctly.
if isinstance(distfn, stats.rv_continuous): x = [distfn.a, distfn.b]
npt.assert_equal(distfn.cdf(x, *args), [0.0, 1.0]) if isinstance(distfn, stats.rv_continuous):
npt.assert_equal(distfn.logcdf(x, *args), [-np.inf, 0.0]) npt.assert_equal(distfn.cdf(x, *args), [0.0, 1.0])
npt.assert_equal(distfn.logcdf(x, *args), [-np.inf, 0.0])
npt.assert_equal(distfn.sf(x, *args), [1.0, 0.0])
npt.assert_equal(distfn.logsf(x, *args), [0.0, -np.inf]) npt.assert_equal(distfn.sf(x, *args), [1.0, 0.0])
npt.assert_equal(distfn.logsf(x, *args), [0.0, -np.inf])
if isinstance(distfn, stats.rv_discrete):
x = [distfn.a - 1, distfn.b] if isinstance(distfn, stats.rv_discrete):
npt.assert_equal(distfn.ppf([0.0, 1.0], *args), x) x = [distfn.a - 1, distfn.b]
npt.assert_equal(distfn.isf([0.0, 1.0], *args), x[::-1]) npt.assert_equal(distfn.ppf([0.0, 1.0], *args), x)
npt.assert_equal(distfn.isf([0.0, 1.0], *args), x[::-1])
# out-of-bounds for isf & ppf
npt.assert_(np.isnan(distfn.isf([-1, 2], *args)).all()) # out-of-bounds for isf & ppf
npt.assert_(np.isnan(distfn.ppf([-1, 2], *args)).all()) npt.assert_(np.isnan(distfn.isf([-1, 2], *args)).all())
npt.assert_(np.isnan(distfn.ppf([-1, 2], *args)).all())
def check_named_args(distfn, x, shape_args, defaults, meths):
## Check calling w/ named arguments. def check_named_args(distfn, x, shape_args, defaults, meths):
# Check calling w/ named arguments.
# check consistency of shapes, numargs and _parse signature
signature = inspect.getargspec(distfn._parse_args) # check consistency of shapes, numargs and _parse signature
npt.assert_(signature.varargs is None) signature = inspect.getargspec(distfn._parse_args)
npt.assert_(signature.keywords is None) npt.assert_(signature.varargs is None)
npt.assert_(signature.defaults == defaults) npt.assert_(signature.keywords is None)
npt.assert_(signature.defaults == defaults)
shape_argnames = signature.args[1:-len(defaults)] # self, a, b, loc=0, scale=1
if distfn.shapes: # self, a, b, loc=0, scale=1
shapes_ = distfn.shapes.replace(',', ' ').split() shape_argnames = signature.args[1:-len(defaults)]
else: if distfn.shapes:
shapes_ = '' shapes_ = distfn.shapes.replace(',', ' ').split()
npt.assert_(len(shapes_) == distfn.numargs) else:
npt.assert_(len(shapes_) == len(shape_argnames)) shapes_ = ''
npt.assert_(len(shapes_) == distfn.numargs)
# check calling w/ named arguments npt.assert_(len(shapes_) == len(shape_argnames))
shape_args = list(shape_args)
# check calling w/ named arguments
vals = [meth(x, *shape_args) for meth in meths] shape_args = list(shape_args)
npt.assert_(np.all(np.isfinite(vals)))
vals = [meth(x, *shape_args) for meth in meths]
names, a, k = shape_argnames[:], shape_args[:], {} npt.assert_(np.all(np.isfinite(vals)))
while names:
k.update({names.pop(): a.pop()}) names, a, k = shape_argnames[:], shape_args[:], {}
v = [meth(x, *a, **k) for meth in meths] while names:
npt.assert_array_equal(vals, v) k.update({names.pop(): a.pop()})
if not 'n' in k.keys(): v = [meth(x, *a, **k) for meth in meths]
# `n` is first parameter of moment(), so can't be used as named arg npt.assert_array_equal(vals, v)
with warnings.catch_warnings(): if not 'n' in k.keys():
warnings.simplefilter("ignore", UserWarning) # `n` is first parameter of moment(), so can't be used as named arg
npt.assert_equal(distfn.moment(1, *a, **k), with warnings.catch_warnings():
distfn.moment(1, *shape_args)) warnings.simplefilter("ignore", UserWarning)
npt.assert_equal(distfn.moment(1, *a, **k),
# unknown arguments should not go through: distfn.moment(1, *shape_args))
k.update({'kaboom': 42})
npt.assert_raises(TypeError, distfn.cdf, x, **k) # unknown arguments should not go through:
k.update({'kaboom': 42})
npt.assert_raises(TypeError, distfn.cdf, x, **k)

@ -1,5 +1,4 @@
from __future__ import division, print_function, absolute_import from __future__ import division, print_function, absolute_import
import numpy as np import numpy as np
from numpy.testing import assert_array_almost_equal, run_module_suite from numpy.testing import assert_array_almost_equal, run_module_suite
from scipy.stats import \ from scipy.stats import \
@ -235,4 +234,5 @@ class TestBinnedStatistic(object):
if __name__ == "__main__": if __name__ == "__main__":
#unittest.main()
run_module_suite() run_module_suite()

@ -6,8 +6,9 @@ import numpy as np
import numpy.testing as npt import numpy.testing as npt
from scipy import integrate from scipy import integrate
from scipy import stats from wafo import stats
from common_tests import (check_normalization, check_moment, check_mean_expect, from wafo.stats.tests.common_tests import (check_normalization, check_moment,
check_mean_expect,
check_var_expect, check_skew_expect, check_kurt_expect, check_var_expect, check_skew_expect, check_kurt_expect,
check_entropy, check_private_entropy, NUMPY_BELOW_1_7, check_entropy, check_private_entropy, NUMPY_BELOW_1_7,
check_edge_support, check_named_args) check_edge_support, check_named_args)
@ -158,7 +159,7 @@ distmissing = ['wald', 'gausshyper', 'genexpon', 'rv_continuous',
'johnsonsb', 'truncexpon', 'rice', 'invgauss', 'invgamma', 'johnsonsb', 'truncexpon', 'rice', 'invgauss', 'invgamma',
'powerlognorm'] 'powerlognorm']
distmiss = [[dist,args] for dist,args in distcont if dist in distmissing] distmiss = [[dist, args] for dist, args in distcont if dist in distmissing]
distslow = ['rdist', 'gausshyper', 'recipinvgauss', 'ksone', 'genexpon', distslow = ['rdist', 'gausshyper', 'recipinvgauss', 'ksone', 'genexpon',
'vonmises', 'vonmises_line', 'mielke', 'semicircular', 'vonmises', 'vonmises_line', 'mielke', 'semicircular',
'cosine', 'invweibull', 'powerlognorm', 'johnsonsu', 'kstwobign'] 'cosine', 'invweibull', 'powerlognorm', 'johnsonsu', 'kstwobign']
@ -181,7 +182,8 @@ def _silence_fp_errors(func):
def test_cont_basic(): def test_cont_basic():
# this test skips slow distributions # this test skips slow distributions
with warnings.catch_warnings(): with warnings.catch_warnings():
warnings.filterwarnings('ignore', category=integrate.IntegrationWarning) # warnings.filterwarnings('ignore',
# category=integrate.IntegrationWarning)
for distname, arg in distcont[:]: for distname, arg in distcont[:]:
if distname in distslow: if distname in distslow:
continue continue
@ -233,14 +235,15 @@ def test_cont_basic():
def test_cont_basic_slow(): def test_cont_basic_slow():
# same as above for slow distributions # same as above for slow distributions
with warnings.catch_warnings(): with warnings.catch_warnings():
warnings.filterwarnings('ignore', category=integrate.IntegrationWarning) # warnings.filterwarnings('ignore',
# category=integrate.IntegrationWarning)
for distname, arg in distcont[:]: for distname, arg in distcont[:]:
if distname not in distslow: if distname not in distslow:
continue continue
distfn = getattr(stats, distname) distfn = getattr(stats, distname)
np.random.seed(765456) np.random.seed(765456)
sn = 500 sn = 500
rvs = distfn.rvs(size=sn,*arg) rvs = distfn.rvs(size=sn, *arg)
sm = rvs.mean() sm = rvs.mean()
sv = rvs.var() sv = rvs.var()
m, v = distfn.stats(*arg) m, v = distfn.stats(*arg)
@ -284,7 +287,8 @@ def test_cont_basic_slow():
@npt.dec.slow @npt.dec.slow
def test_moments(): def test_moments():
with warnings.catch_warnings(): with warnings.catch_warnings():
warnings.filterwarnings('ignore', category=integrate.IntegrationWarning) # warnings.filterwarnings('ignore',
# category=integrate.IntegrationWarning)
knf = npt.dec.knownfailureif knf = npt.dec.knownfailureif
fail_normalization = set(['vonmises', 'ksone']) fail_normalization = set(['vonmises', 'ksone'])
fail_higher = set(['vonmises', 'ksone', 'ncf']) fail_higher = set(['vonmises', 'ksone', 'ncf'])
@ -312,124 +316,130 @@ def check_sample_meanvar_(distfn, arg, m, v, sm, sv, sn, msg):
check_sample_var(sv, sn, v) check_sample_var(sv, sn, v)
def check_sample_mean(sm,v,n, popmean): def check_sample_mean(sm, v, n, popmean):
# from stats.stats.ttest_1samp(a, popmean): # from stats.stats.ttest_1samp(a, popmean):
# Calculates the t-obtained for the independent samples T-test on ONE group # Calculates the t-obtained for the independent samples T-test on ONE group
# of scores a, given a population mean. # of scores a, given a population mean.
# #
# Returns: t-value, two-tailed prob # Returns: t-value, two-tailed prob
df = n-1 df = n - 1
svar = ((n-1)*v) / float(df) # looks redundant svar = ((n - 1) * v) / float(df) # looks redundant
t = (sm-popmean) / np.sqrt(svar*(1.0/n)) t = (sm - popmean) / np.sqrt(svar * (1.0 / n))
prob = stats.betai(0.5*df, 0.5, df/(df+t*t)) prob = stats.betai(0.5 * df, 0.5, df / (df + t * t))
# return t,prob # return t,prob
npt.assert_(prob > 0.01, 'mean fail, t,prob = %f, %f, m, sm=%f,%f' % npt.assert_(prob > 0.01, 'mean fail, t,prob = %f, %f, m, sm=%f,%f' %
(t, prob, popmean, sm)) (t, prob, popmean, sm))
def check_sample_var(sv,n, popvar): def check_sample_var(sv, n, popvar):
# two-sided chisquare test for sample variance equal to hypothesized variance # two-sided chisquare test for sample variance equal to hypothesized
df = n-1 # variance
chi2 = (n-1)*popvar/float(popvar) df = n - 1
pval = stats.chisqprob(chi2,df)*2 chi2 = (n - 1) * popvar / float(popvar)
npt.assert_(pval > 0.01, 'var fail, t, pval = %f, %f, v, sv=%f, %f' % pval = stats.chisqprob(chi2, df) * 2
(chi2,pval,popvar,sv)) npt.assert_(pval > 0.01, 'var fail, t, pval = %f, %f, v, sv=%f, %f' %
(chi2, pval, popvar, sv))
def check_cdf_ppf(distfn,arg,msg):
def check_cdf_ppf(distfn, arg, msg):
values = [0.001, 0.5, 0.999] values = [0.001, 0.5, 0.999]
npt.assert_almost_equal(distfn.cdf(distfn.ppf(values, *arg), *arg), npt.assert_almost_equal(distfn.cdf(distfn.ppf(values, *arg), *arg),
values, decimal=DECIMAL, err_msg=msg + values, decimal=DECIMAL, err_msg=msg +
' - cdf-ppf roundtrip') ' - cdf-ppf roundtrip')
def check_sf_isf(distfn,arg,msg): def check_sf_isf(distfn, arg, msg):
npt.assert_almost_equal(distfn.sf(distfn.isf([0.1,0.5,0.9], *arg), *arg), npt.assert_almost_equal(distfn.sf(distfn.isf([0.1, 0.5, 0.9], *arg), *arg),
[0.1,0.5,0.9], decimal=DECIMAL, err_msg=msg + [0.1, 0.5, 0.9], decimal=DECIMAL, err_msg=msg +
' - sf-isf roundtrip') ' - sf-isf roundtrip')
npt.assert_almost_equal(distfn.cdf([0.1,0.9], *arg), npt.assert_almost_equal(distfn.cdf([0.1, 0.9], *arg),
1.0-distfn.sf([0.1,0.9], *arg), 1.0 - distfn.sf([0.1, 0.9], *arg),
decimal=DECIMAL, err_msg=msg + decimal=DECIMAL, err_msg=msg +
' - cdf-sf relationship') ' - cdf-sf relationship')
def check_pdf(distfn, arg, msg): def check_pdf(distfn, arg, msg):
# compares pdf at median with numerical derivative of cdf # compares pdf at median with numerical derivative of cdf
median = distfn.ppf(0.5, *arg) median = distfn.ppf(0.5, *arg)
eps = 1e-6 eps = 1e-6
pdfv = distfn.pdf(median, *arg) pdfv = distfn.pdf(median, *arg)
if (pdfv < 1e-4) or (pdfv > 1e4): if (pdfv < 1e-4) or (pdfv > 1e4):
# avoid checking a case where pdf is close to zero or huge (singularity) # avoid checking a case where pdf is close to zero or huge
median = median + 0.1 # (singularity)
pdfv = distfn.pdf(median, *arg) median = median + 0.1
cdfdiff = (distfn.cdf(median + eps, *arg) - pdfv = distfn.pdf(median, *arg)
distfn.cdf(median - eps, *arg))/eps/2.0 cdfdiff = (distfn.cdf(median + eps, *arg) -
# replace with better diff and better test (more points), distfn.cdf(median - eps, *arg)) / eps / 2.0
# actually, this works pretty well # replace with better diff and better test (more points),
npt.assert_almost_equal(pdfv, cdfdiff, # actually, this works pretty well
decimal=DECIMAL, err_msg=msg + ' - cdf-pdf relationship') npt.assert_almost_equal(pdfv, cdfdiff, decimal=DECIMAL,
err_msg=msg + ' - cdf-pdf relationship')
def check_pdf_logpdf(distfn, args, msg):
# compares pdf at several points with the log of the pdf def check_pdf_logpdf(distfn, args, msg):
points = np.array([0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8]) # compares pdf at several points with the log of the pdf
vals = distfn.ppf(points, *args) points = np.array([0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8])
pdf = distfn.pdf(vals, *args) vals = distfn.ppf(points, *args)
logpdf = distfn.logpdf(vals, *args) pdf = distfn.pdf(vals, *args)
pdf = pdf[pdf != 0] logpdf = distfn.logpdf(vals, *args)
logpdf = logpdf[np.isfinite(logpdf)] pdf = pdf[pdf != 0]
npt.assert_almost_equal(np.log(pdf), logpdf, decimal=7, err_msg=msg + " - logpdf-log(pdf) relationship") logpdf = logpdf[np.isfinite(logpdf)]
npt.assert_almost_equal(np.log(pdf), logpdf, decimal=7,
err_msg=msg + " - logpdf-log(pdf) relationship")
def check_sf_logsf(distfn, args, msg):
# compares sf at several points with the log of the sf
points = np.array([0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8]) def check_sf_logsf(distfn, args, msg):
vals = distfn.ppf(points, *args) # compares sf at several points with the log of the sf
sf = distfn.sf(vals, *args) points = np.array([0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8])
logsf = distfn.logsf(vals, *args) vals = distfn.ppf(points, *args)
sf = sf[sf != 0] sf = distfn.sf(vals, *args)
logsf = logsf[np.isfinite(logsf)] logsf = distfn.logsf(vals, *args)
npt.assert_almost_equal(np.log(sf), logsf, decimal=7, err_msg=msg + " - logsf-log(sf) relationship") sf = sf[sf != 0]
logsf = logsf[np.isfinite(logsf)]
npt.assert_almost_equal(np.log(sf), logsf, decimal=7,
def check_cdf_logcdf(distfn, args, msg): err_msg=msg + " - logsf-log(sf) relationship")
# compares cdf at several points with the log of the cdf
points = np.array([0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8])
vals = distfn.ppf(points, *args) def check_cdf_logcdf(distfn, args, msg):
cdf = distfn.cdf(vals, *args) # compares cdf at several points with the log of the cdf
logcdf = distfn.logcdf(vals, *args) points = np.array([0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8])
cdf = cdf[cdf != 0] vals = distfn.ppf(points, *args)
logcdf = logcdf[np.isfinite(logcdf)] cdf = distfn.cdf(vals, *args)
npt.assert_almost_equal(np.log(cdf), logcdf, decimal=7, err_msg=msg + " - logcdf-log(cdf) relationship") logcdf = distfn.logcdf(vals, *args)
cdf = cdf[cdf != 0]
logcdf = logcdf[np.isfinite(logcdf)]
def check_distribution_rvs(dist, args, alpha, rvs): npt.assert_almost_equal(np.log(cdf), logcdf, decimal=7,
# test from scipy.stats.tests err_msg=msg + " - logcdf-log(cdf) relationship")
# this version reuses existing random variables
D,pval = stats.kstest(rvs, dist, args=args, N=1000)
if (pval < alpha): def check_distribution_rvs(dist, args, alpha, rvs):
D,pval = stats.kstest(dist,'',args=args, N=1000) # test from scipy.stats.tests
npt.assert_(pval > alpha, "D = " + str(D) + "; pval = " + str(pval) + # this version reuses existing random variables
"; alpha = " + str(alpha) + "\nargs = " + str(args)) D, pval = stats.kstest(rvs, dist, args=args, N=1000)
if (pval < alpha):
D, pval = stats.kstest(dist, '', args=args, N=1000)
def check_vecentropy(distfn, args): npt.assert_(pval > alpha, "D = " + str(D) + "; pval = " + str(pval) +
npt.assert_equal(distfn.vecentropy(*args), distfn._entropy(*args)) "; alpha = " + str(alpha) + "\nargs = " + str(args))
@npt.dec.skipif(NUMPY_BELOW_1_7)
def check_loc_scale(distfn, arg, m, v, msg): def check_vecentropy(distfn, args):
loc, scale = 10.0, 10.0 npt.assert_equal(distfn.vecentropy(*args), distfn._entropy(*args))
mt, vt = distfn.stats(loc=loc, scale=scale, *arg)
npt.assert_allclose(m*scale + loc, mt)
npt.assert_allclose(v*scale*scale, vt) @npt.dec.skipif(NUMPY_BELOW_1_7)
def check_loc_scale(distfn, arg, m, v, msg):
loc, scale = 10.0, 10.0
def check_ppf_private(distfn, arg, msg): mt, vt = distfn.stats(loc=loc, scale=scale, *arg)
#fails by design for truncnorm self.nb not defined npt.assert_allclose(m * scale + loc, mt)
ppfs = distfn._ppf(np.array([0.1, 0.5, 0.9]), *arg) npt.assert_allclose(v * scale * scale, vt)
npt.assert_(not np.any(np.isnan(ppfs)), msg + 'ppf private is nan')
def check_ppf_private(distfn, arg, msg):
if __name__ == "__main__": # fails by design for truncnorm self.nb not defined
npt.run_module_suite() ppfs = distfn._ppf(np.array([0.1, 0.5, 0.9]), *arg)
npt.assert_(not np.any(np.isnan(ppfs)), msg + 'ppf private is nan')
if __name__ == "__main__":
npt.run_module_suite()

@ -3,25 +3,26 @@ from __future__ import division, print_function, absolute_import
import numpy.testing as npt import numpy.testing as npt
import numpy as np import numpy as np
try: try:
from scipy.lib.six import xrange from wafo.stats.six import xrange
except: except:
pass pass
from scipy import stats from wafo import stats
from .common_tests import (check_normalization, check_moment, check_mean_expect, from wafo.stats.tests.common_tests import (check_normalization, check_moment,
check_mean_expect,
check_var_expect, check_skew_expect, check_kurt_expect, check_var_expect, check_skew_expect, check_kurt_expect,
check_entropy, check_private_entropy, check_edge_support, check_entropy, check_private_entropy, check_edge_support,
check_named_args) check_named_args)
knf = npt.dec.knownfailureif knf = npt.dec.knownfailureif
distdiscrete = [ distdiscrete = [
['bernoulli',(0.3,)], ['bernoulli', (0.3, )],
['binom', (5, 0.4)], ['binom', (5, 0.4)],
['boltzmann',(1.4, 19)], ['boltzmann', (1.4, 19)],
['dlaplace', (0.8,)], # 0.5 ['dlaplace', (0.8,)], # 0.5
['geom', (0.5,)], ['geom', (0.5,)],
['hypergeom',(30, 12, 6)], ['hypergeom', (30, 12, 6)],
['hypergeom',(21,3,12)], # numpy.random (3,18,12) numpy ticket:921 ['hypergeom', (21, 3, 12)], # numpy.random (3,18,12) numpy ticket:921
['hypergeom',(21,18,11)], # numpy.random (18,3,11) numpy ticket:921 ['hypergeom', (21, 18, 11)], # numpy.random (18,3,11) numpy ticket:921
['logser', (0.6,)], # reenabled, numpy ticket:921 ['logser', (0.6,)], # reenabled, numpy ticket:921
['nbinom', (5, 0.5)], ['nbinom', (5, 0.5)],
['nbinom', (0.4, 0.4)], # from tickets: 583 ['nbinom', (0.4, 0.4)], # from tickets: 583
@ -39,7 +40,7 @@ def test_discrete_basic():
np.random.seed(9765456) np.random.seed(9765456)
rvs = distfn.rvs(size=2000, *arg) rvs = distfn.rvs(size=2000, *arg)
supp = np.unique(rvs) supp = np.unique(rvs)
m, v = distfn.stats(*arg) #_m, v = distfn.stats(*arg)
yield check_cdf_ppf, distfn, arg, supp, distname + ' cdf_ppf' yield check_cdf_ppf, distfn, arg, supp, distname + ' cdf_ppf'
yield check_pmf_cdf, distfn, arg, distname yield check_pmf_cdf, distfn, arg, distname
@ -55,7 +56,7 @@ def test_discrete_basic():
if distname in seen: if distname in seen:
continue continue
seen.add(distname) seen.add(distname)
distfn = getattr(stats,distname) distfn = getattr(stats, distname)
locscale_defaults = (0,) locscale_defaults = (0,)
meths = [distfn.pmf, distfn.logpmf, distfn.cdf, distfn.logcdf, meths = [distfn.pmf, distfn.logpmf, distfn.cdf, distfn.logcdf,
distfn.logsf] distfn.logsf]
@ -73,7 +74,7 @@ def test_discrete_basic():
def test_moments(): def test_moments():
for distname, arg in distdiscrete: for distname, arg in distdiscrete:
distfn = getattr(stats,distname) distfn = getattr(stats, distname)
m, v, s, k = distfn.stats(*arg, moments='mvsk') m, v, s, k = distfn.stats(*arg, moments='mvsk')
yield check_normalization, distfn, arg, distname yield check_normalization, distfn, arg, distname
@ -89,7 +90,7 @@ def test_moments():
# frozen distr moments # frozen distr moments
yield check_moment_frozen, distfn, arg, m, 1 yield check_moment_frozen, distfn, arg, m, 1
yield check_moment_frozen, distfn, arg, v+m*m, 2 yield check_moment_frozen, distfn, arg, v + m * m, 2
def check_cdf_ppf(distfn, arg, supp, msg): def check_cdf_ppf(distfn, arg, supp, msg):
@ -107,7 +108,7 @@ def check_cdf_ppf(distfn, arg, supp, msg):
def check_pmf_cdf(distfn, arg, distname): def check_pmf_cdf(distfn, arg, distname):
startind = np.int(distfn.ppf(0.01, *arg) - 1) startind = np.int(distfn.ppf(0.01, *arg) - 1)
index = list(range(startind, startind + 10)) index = list(range(startind, startind + 10))
cdfs, pmfs_cum = distfn.cdf(index,*arg), distfn.pmf(index, *arg).cumsum() cdfs, pmfs_cum = distfn.cdf(index, *arg), distfn.pmf(index, *arg).cumsum()
atol, rtol = 1e-10, 1e-10 atol, rtol = 1e-10, 1e-10
if distname == 'skellam': # ncx2 accuracy if distname == 'skellam': # ncx2 accuracy
@ -157,7 +158,7 @@ def check_discrete_chisquare(distfn, arg, rvs, alpha, msg):
""" """
n = len(rvs) n = len(rvs)
nsupp = 20 nsupp = 20
wsupp = 1.0/nsupp wsupp = 1.0 / nsupp
# construct intervals with minimum mass 1/nsupp # construct intervals with minimum mass 1/nsupp
# intervals are left-half-open as in a cdf difference # intervals are left-half-open as in a cdf difference
@ -166,30 +167,30 @@ def check_discrete_chisquare(distfn, arg, rvs, alpha, msg):
distsupp = [max(distfn.a, -1000)] distsupp = [max(distfn.a, -1000)]
distmass = [] distmass = []
for ii in distsupport: for ii in distsupport:
current = distfn.cdf(ii,*arg) current = distfn.cdf(ii, *arg)
if current - last >= wsupp-1e-14: if current - last >= wsupp - 1e-14:
distsupp.append(ii) distsupp.append(ii)
distmass.append(current - last) distmass.append(current - last)
last = current last = current
if current > (1-wsupp): if current > (1 - wsupp):
break break
if distsupp[-1] < distfn.b: if distsupp[-1] < distfn.b:
distsupp.append(distfn.b) distsupp.append(distfn.b)
distmass.append(1-last) distmass.append(1 - last)
distsupp = np.array(distsupp) distsupp = np.array(distsupp)
distmass = np.array(distmass) distmass = np.array(distmass)
# convert intervals to right-half-open as required by histogram # convert intervals to right-half-open as required by histogram
histsupp = distsupp+1e-8 histsupp = distsupp + 1e-8
histsupp[0] = distfn.a histsupp[0] = distfn.a
# find sample frequencies and perform chisquare test # find sample frequencies and perform chisquare test
freq,hsupp = np.histogram(rvs,histsupp) freq, _hsupp = np.histogram(rvs, histsupp)
cdfs = distfn.cdf(distsupp,*arg) #cdfs = distfn.cdf(distsupp, *arg)
(chis,pval) = stats.chisquare(np.array(freq),n*distmass) (_chis, pval) = stats.chisquare(np.array(freq), n * distmass)
npt.assert_(pval > alpha, 'chisquare - test for %s' npt.assert_(pval > alpha, 'chisquare - test for %s'
' at arg = %s with pval = %s' % (msg,str(arg),str(pval))) ' at arg = %s with pval = %s' % (msg, str(arg), str(pval)))
def check_scale_docstring(distfn): def check_scale_docstring(distfn):

File diff suppressed because it is too large Load Diff

@ -7,7 +7,7 @@ from numpy.testing import dec
from wafo import stats from wafo import stats
from .test_continuous_basic import distcont from wafo.stats.tests.test_continuous_basic import distcont
# this is not a proper statistical test for convergence, but only # this is not a proper statistical test for convergence, but only
# verifies that the estimate and true values don't differ by too much # verifies that the estimate and true values don't differ by too much
@ -45,14 +45,14 @@ skip_fit = [
def test_cont_fit(): def test_cont_fit():
# this tests the closeness of the estimated parameters to the true # this tests the closeness of the estimated parameters to the true
# parameters with fit method of continuous distributions # parameters with fit method of continuous distributions
# Note: is slow, some distributions don't converge with sample size <= 10000 # Note: slow, some distributions don't converge with sample size <= 10000
for distname, arg in distcont: for distname, arg in distcont:
if distname not in skip_fit: if distname not in skip_fit:
yield check_cont_fit, distname,arg yield check_cont_fit, distname, arg
def check_cont_fit(distname,arg): def check_cont_fit(distname, arg):
if distname in failing_fits: if distname in failing_fits:
# Skip failing fits unless overridden # Skip failing fits unless overridden
xfail = True xfail = True
@ -62,14 +62,16 @@ def check_cont_fit(distname,arg):
pass pass
if xfail: if xfail:
msg = "Fitting %s doesn't work reliably yet" % distname msg = "Fitting %s doesn't work reliably yet" % distname
msg += " [Set environment variable SCIPY_XFAIL=1 to run this test nevertheless.]" msg += " [Set environment variable SCIPY_XFAIL=1 to run this " + \
"test nevertheless.]"
dec.knownfailureif(True, msg)(lambda: None)() dec.knownfailureif(True, msg)(lambda: None)()
distfn = getattr(stats, distname) distfn = getattr(stats, distname)
truearg = np.hstack([arg,[0.0,1.0]]) truearg = np.hstack([arg, [0.0, 1.0]])
diffthreshold = np.max(np.vstack([truearg*thresh_percent, diffthreshold = np.max(np.vstack([
np.ones(distfn.numargs+2)*thresh_min]),0) truearg * thresh_percent,
np.ones(distfn.numargs + 2) * thresh_min]), 0)
for fit_size in fit_sizes: for fit_size in fit_sizes:
# Note that if a fit succeeds, the other fit_sizes are skipped # Note that if a fit succeeds, the other fit_sizes are skipped
@ -77,12 +79,16 @@ def check_cont_fit(distname,arg):
with np.errstate(all='ignore'): with np.errstate(all='ignore'):
rvs = distfn.rvs(size=fit_size, *arg) rvs = distfn.rvs(size=fit_size, *arg)
est = distfn.fit(rvs) # start with default values #phat = distfn.fit2(rvs)
phat = distfn.fit2(rvs, method='mps')
est = phat.par
#est = distfn.fit(rvs) # start with default values
diff = est - truearg diff = est - truearg
# threshold for location # threshold for location
diffthreshold[-2] = np.max([np.abs(rvs.mean())*thresh_percent,thresh_min]) diffthreshold[-2] = np.max([np.abs(rvs.mean()) * thresh_percent,
thresh_min])
if np.any(np.isnan(est)): if np.any(np.isnan(est)):
raise AssertionError('nan returned in fit') raise AssertionError('nan returned in fit')

File diff suppressed because it is too large Load Diff

@ -11,11 +11,11 @@ import numpy
import numpy as np import numpy as np
import scipy.linalg import scipy.linalg
import scipy.stats._multivariate #import wafo.stats._multivariate
from scipy.stats import multivariate_normal from wafo.stats import multivariate_normal
from scipy.stats import norm from wafo.stats import norm
from scipy.stats._multivariate import _psd_pinv_decomposed_log_pdet from wafo.stats._multivariate import _psd_pinv_decomposed_log_pdet
from scipy.integrate import romb from scipy.integrate import romb
@ -70,7 +70,7 @@ def test_large_pseudo_determinant():
#assert_allclose(np.linalg.slogdet(cov[:npos, :npos]), (1, large_total_log)) #assert_allclose(np.linalg.slogdet(cov[:npos, :npos]), (1, large_total_log))
# Check the pseudo-determinant. # Check the pseudo-determinant.
U, log_pdet = scipy.stats._multivariate._psd_pinv_decomposed_log_pdet(cov) U, log_pdet = _psd_pinv_decomposed_log_pdet(cov)
assert_allclose(log_pdet, large_total_log) assert_allclose(log_pdet, large_total_log)

@ -4,7 +4,7 @@ import numpy as np
from numpy.testing import TestCase, run_module_suite, assert_equal, \ from numpy.testing import TestCase, run_module_suite, assert_equal, \
assert_array_equal assert_array_equal
from scipy.stats import rankdata, tiecorrect from wafo.stats import rankdata, tiecorrect
class TestTieCorrect(TestCase): class TestTieCorrect(TestCase):

@ -18,7 +18,7 @@ def test_tukeylambda_stats_known_exact():
# lambda = 0 # lambda = 0
var = tukeylambda_variance(0) var = tukeylambda_variance(0)
assert_allclose(var, np.pi**2 / 3, atol=1e-12) assert_allclose(var, np.pi ** 2 / 3, atol=1e-12)
kurt = tukeylambda_kurtosis(0) kurt = tukeylambda_kurtosis(0)
assert_allclose(kurt, 1.2, atol=1e-10) assert_allclose(kurt, 1.2, atol=1e-10)
@ -26,7 +26,7 @@ def test_tukeylambda_stats_known_exact():
var = tukeylambda_variance(0.5) var = tukeylambda_variance(0.5)
assert_allclose(var, 4 - np.pi, atol=1e-12) assert_allclose(var, 4 - np.pi, atol=1e-12)
kurt = tukeylambda_kurtosis(0.5) kurt = tukeylambda_kurtosis(0.5)
desired = (5./3 - np.pi/2) / (np.pi/4 - 1)**2 - 3 desired = (5. / 3 - np.pi / 2) / (np.pi / 4 - 1) ** 2 - 3
assert_allclose(kurt, desired, atol=1e-10) assert_allclose(kurt, desired, atol=1e-10)
# lambda = 1 # lambda = 1

@ -1,523 +1,470 @@
import numpy as np # @UnusedImport
#@UnusedImport from numpy.testing import (run_module_suite, assert_equal, assert_almost_equal,
from numpy import cos, exp, linspace, pi, sin, diff, arange, ones assert_array_equal, assert_array_almost_equal)
from numpy.random import randn # @UnusedImport
from wafo.data import sea # @UnusedImport import numpy as np
from wafo.misc import (JITImport, Bunch, detrendma, DotDict, findcross, ecross, findextrema, # @UnusedImport from numpy import array, cos, exp, linspace, pi, sin, diff, arange, ones
#@UnusedImport from wafo.data import sea
findrfc, rfcfilter, findtp, findtc, findoutliers, from wafo.misc import (JITImport, Bunch, detrendma, DotDict, findcross, ecross,
common_shape, argsreduce, stirlerr, getshipchar, betaloge, findextrema, findrfc, rfcfilter, findtp, findtc,
#@UnusedImport findoutliers, common_shape, argsreduce, stirlerr,
#@UnusedImport getshipchar, betaloge, hygfz,
gravity, nextpow2, discretize, polar2cart, gravity, nextpow2, discretize, polar2cart,
cart2polar, meshgrid, tranproc) # @UnusedImport cart2polar, tranproc)
def test_JITImport(): def test_JITImport():
''' np = JITImport('numpy')
>>> np = JITImport('numpy') assert_equal(1.0, np.exp(0))
>>> np.exp(0)==1.0
True
'''
def test_bunch(): def test_bunch():
''' d = Bunch(test1=1, test2=3)
>>> d = Bunch(test1=1,test2=3) assert_equal(1, d.test1)
>>> d.test1; d.test2 assert_equal(3, d.test2)
1
3
'''
def test_dotdict(): def test_dotdict():
''' d = DotDict(test1=1, test2=3)
>>> d = DotDict(test1=1,test2=3) assert_equal(1, d.test1)
>>> d.test1; d.test2 assert_equal(3, d.test2)
1
3
'''
def test_detrendma(): def test_detrendma():
''' x = linspace(0, 1, 200)
>>> x = linspace(0,1,200) y = exp(x) + 0.1 * cos(20 * 2 * pi * x)
>>> y = exp(x)+0.1*cos(20*2*pi*x) y0 = detrendma(y, 20)
>>> y0 = detrendma(y,20); tr = y-y0 tr = y - y0
>>> y0,tr assert_array_almost_equal(
(array([ -1.05815186e-02, -2.48280355e-02, -7.01800760e-02, y0,
-1.27193089e-01, -1.71915213e-01, -1.85125121e-01, array(
-1.59745361e-01, -1.03571981e-01, -3.62676515e-02, [-1.05815186e-02, -2.48280355e-02, -7.01800760e-02,
1.82219951e-02, 4.09039083e-02, 2.50630186e-02, -1.27193089e-01, -1.71915213e-01, -1.85125121e-01,
-2.11478040e-02, -7.78521440e-02, -1.21116040e-01, -1.59745361e-01, -1.03571981e-01, -3.62676515e-02,
-1.32178923e-01, -1.04689244e-01, -4.71541301e-02, 1.82219951e-02, 4.09039083e-02, 2.50630186e-02,
2.03417510e-02, 7.38826137e-02, 8.95349902e-02, -2.11478040e-02, -7.78521440e-02, -1.21116040e-01,
6.68738432e-02, 1.46828486e-02, -4.68648556e-02, -1.32178923e-01, -1.04689244e-01, -4.71541301e-02,
-9.39871606e-02, -1.08465407e-01, -8.46710629e-02, 2.03417510e-02, 7.38826137e-02, 8.95349902e-02,
-3.17365657e-02, 2.99669288e-02, 7.66864134e-02, 6.68738432e-02, 1.46828486e-02, -4.68648556e-02,
9.04482283e-02, 6.59902473e-02, 1.27914062e-02, -9.39871606e-02, -1.08465407e-01, -8.46710629e-02,
-4.85841870e-02, -9.44185349e-02, -1.06987444e-01, -3.17365657e-02, 2.99669288e-02, 7.66864134e-02,
-8.13964951e-02, -2.74687460e-02, 3.40438793e-02, 9.04482283e-02, 6.59902473e-02, 1.27914062e-02,
7.94643163e-02, 9.13222681e-02, 6.50922520e-02, -4.85841870e-02, -9.44185349e-02, -1.06987444e-01,
1.09390148e-02, -5.02028639e-02, -9.47031411e-02, -8.13964951e-02, -2.74687460e-02, 3.40438793e-02,
-1.05349757e-01, -7.79872833e-02, -2.31196073e-02, 7.94643163e-02, 9.13222681e-02, 6.50922520e-02,
3.81412653e-02, 8.22178144e-02, 9.21605209e-02, 1.09390148e-02, -5.02028639e-02, -9.47031411e-02,
6.41850565e-02, 9.13184690e-03, -5.17149253e-02, -1.05349757e-01, -7.79872833e-02, -2.31196073e-02,
-9.48363260e-02, -1.03549587e-01, -7.44424124e-02, 3.81412653e-02, 8.22178144e-02, 9.21605209e-02,
-1.86890490e-02, 4.22594607e-02, 8.49486437e-02, 6.41850565e-02, 9.13184690e-03, -5.17149253e-02,
9.29666543e-02, 6.32740911e-02, 7.37625254e-03, -9.48363260e-02, -1.03549587e-01, -7.44424124e-02,
-5.31142920e-02, -9.48133620e-02, -1.01584110e-01, -1.86890490e-02, 4.22594607e-02, 8.49486437e-02,
-7.07607748e-02, -1.41768231e-02, 4.63990484e-02, 9.29666543e-02, 6.32740911e-02, 7.37625254e-03,
8.76587937e-02, 9.37446001e-02, 6.23650231e-02, -5.31142920e-02, -9.48133620e-02, -1.01584110e-01,
5.67876495e-03, -5.43947621e-02, -9.46294406e-02, -7.07607748e-02, -1.41768231e-02, 4.63990484e-02,
-9.94504301e-02, -6.69411601e-02, -9.58252265e-03, 8.76587937e-02, 9.37446001e-02, 6.23650231e-02,
5.05608316e-02, 9.03505172e-02, 9.44985623e-02, 5.67876495e-03, -5.43947621e-02, -9.46294406e-02,
6.14637631e-02, 4.04610591e-03, -5.55500040e-02, -9.94504301e-02, -6.69411601e-02, -9.58252265e-03,
-9.42796647e-02, -9.71455674e-02, -6.29822440e-02, 5.05608316e-02, 9.03505172e-02, 9.44985623e-02,
-4.90556961e-03, 5.47458452e-02, 9.30263409e-02, 6.14637631e-02, 4.04610591e-03, -5.55500040e-02,
9.52330253e-02, 6.05764719e-02, 2.48519180e-03, -9.42796647e-02, -9.71455674e-02, -6.29822440e-02,
-5.65735506e-02, -9.37590405e-02, -9.46664506e-02, -4.90556961e-03, 5.47458452e-02, 9.30263409e-02,
-5.88825766e-02, -1.45202622e-04, 5.89553685e-02, 9.52330253e-02, 6.05764719e-02, 2.48519180e-03,
9.56890756e-02, 9.59527629e-02, 5.97095676e-02, -5.65735506e-02, -9.37590405e-02, -9.46664506e-02,
1.00314001e-03, -5.74587921e-02, -9.30624694e-02, -5.88825766e-02, -1.45202622e-04, 5.89553685e-02,
-9.20099048e-02, -5.46405701e-02, 4.69953603e-03, 9.56890756e-02, 9.59527629e-02, 5.97095676e-02,
6.31909369e-02, 9.83418277e-02, 9.66628470e-02, 1.00314001e-03, -5.74587921e-02, -9.30624694e-02,
5.88697331e-02, -3.92724035e-04, -5.81989687e-02, -9.20099048e-02, -5.46405701e-02, 4.69953603e-03,
-9.21847386e-02, -8.91726414e-02, -5.02544862e-02, 6.31909369e-02, 9.83418277e-02, 9.66628470e-02,
9.62981387e-03, 6.74543554e-02, 1.00988010e-01, 5.88697331e-02, -3.92724035e-04, -5.81989687e-02,
9.73686580e-02, 5.80639242e-02, -1.69485946e-03, -9.21847386e-02, -8.91726414e-02, -5.02544862e-02,
-5.87871620e-02, -9.11205115e-02, -8.61512458e-02, 9.62981387e-03, 6.74543554e-02, 1.00988010e-01,
-4.57224228e-02, 1.46470222e-02, 7.17477118e-02, 9.73686580e-02, 5.80639242e-02, -1.69485946e-03,
1.03631355e-01, 9.80758938e-02, 5.72993780e-02, -5.87871620e-02, -9.11205115e-02, -8.61512458e-02,
-2.89550192e-03, -5.92162868e-02, -8.98643173e-02, -4.57224228e-02, 1.46470222e-02, 7.17477118e-02,
-8.29421650e-02, -4.10422999e-02, 1.97527907e-02, 1.03631355e-01, 9.80758938e-02, 5.72993780e-02,
7.60733908e-02, 1.06275925e-01, 9.87905812e-02, -2.89550192e-03, -5.92162868e-02, -8.98643173e-02,
5.65836223e-02, -3.98665495e-03, -5.94790815e-02, -8.29421650e-02, -4.10422999e-02, 1.97527907e-02,
-8.84105398e-02, -7.95416952e-02, -3.62118451e-02, 7.60733908e-02, 1.06275925e-01, 9.87905812e-02,
2.49490024e-02, 8.04340881e-02, 1.08926128e-01, 5.65836223e-02, -3.98665495e-03, -5.94790815e-02,
9.95190863e-02, 5.59244846e-02, -4.96008086e-03, -8.84105398e-02, -7.95416952e-02, -3.62118451e-02,
-5.95680980e-02, -8.67534061e-02, -7.59459673e-02, 2.49490024e-02, 8.04340881e-02, 1.08926128e-01,
-3.12285782e-02, 3.02378095e-02, 8.48328258e-02, 9.95190863e-02, 5.59244846e-02, -4.96008086e-03,
1.11586726e-01, 1.00268126e-01, 5.53301029e-02, -5.95680980e-02, -8.67534061e-02, -7.59459673e-02,
-5.80729079e-03, -5.94756912e-02, -8.48869734e-02, -3.12285782e-02, 3.02378095e-02, 8.48328258e-02,
-7.21509330e-02, -2.60897955e-02, 3.56216499e-02, 1.11586726e-01, 1.00268126e-01, 5.53301029e-02,
8.92729678e-02, 1.14262857e-01, 1.01044781e-01, -5.80729079e-03, -5.94756912e-02, -8.48869734e-02,
5.48089359e-02, -6.51953427e-03, -5.91940075e-02, -7.21509330e-02, -2.60897955e-02, 3.56216499e-02,
-8.28051165e-02, -6.81523491e-02, -2.07925530e-02, 8.92729678e-02, 1.14262857e-01, 1.01044781e-01,
4.11032641e-02, 9.37582360e-02, 1.16960041e-01, 5.48089359e-02, -6.51953427e-03, -5.91940075e-02,
1.13824241e-01, 7.82451609e-02, 2.87461256e-02, -8.28051165e-02, -6.81523491e-02, -2.07925530e-02,
-1.07566250e-02, -2.01779675e-02, 8.98967999e-03, 4.11032641e-02, 9.37582360e-02, 1.16960041e-01,
7.03952281e-02, 1.45278564e-01, 2.09706186e-01, 1.13824241e-01, 7.82451609e-02, 2.87461256e-02,
2.43802139e-01, 2.39414013e-01, 2.03257341e-01, -1.07566250e-02, -2.01779675e-02, 8.98967999e-03,
1.54325635e-01, 1.16564992e-01, 1.09638547e-01, 7.03952281e-02, 1.45278564e-01, 2.09706186e-01,
1.41342814e-01, 2.04600808e-01, 2.80191671e-01, 2.43802139e-01, 2.39414013e-01, 2.03257341e-01,
3.44164010e-01, 3.77073744e-01]), array([ 1.54325635e-01, 1.16564992e-01, 1.09638547e-01,
1.11058152, 1.11058152, 1.11058152, 1.11058152, 1.11058152, 1.41342814e-01, 2.04600808e-01, 2.80191671e-01,
1.11058152, 1.11058152, 1.11058152, 1.11058152, 1.11058152, 3.44164010e-01, 3.77073744e-01
1.11058152, 1.11058152, 1.11058152, 1.11058152, 1.11058152, ]))
1.11058152, 1.11058152, 1.11058152, 1.11058152, 1.11058152, assert_array_almost_equal(tr, array([
1.11599212, 1.12125245, 1.12643866, 1.13166607, 1.13704477, 1.11058152, 1.11058152, 1.11058152, 1.11058152, 1.11058152,
1.14263723, 1.14843422, 1.15435845, 1.16029443, 1.16613308, 1.11058152, 1.11058152, 1.11058152, 1.11058152, 1.11058152,
1.17181383, 1.17734804, 1.18281471, 1.18833001, 1.19400259, 1.11058152, 1.11058152, 1.11058152, 1.11058152, 1.11058152,
1.19989168, 1.20598434, 1.21220048, 1.21842384, 1.22454684, 1.11058152, 1.11058152, 1.11058152, 1.11058152, 1.11058152,
1.23051218, 1.23633498, 1.24209697, 1.24791509, 1.25389641, 1.11599212, 1.12125245, 1.12643866, 1.13166607, 1.13704477,
1.26009689, 1.26649987, 1.27302256, 1.27954802, 1.28597031, 1.14263723, 1.14843422, 1.15435845, 1.16029443, 1.16613308,
1.29223546, 1.29836228, 1.30443522, 1.31057183, 1.31687751, 1.17181383, 1.17734804, 1.18281471, 1.18833001, 1.19400259,
1.32340488, 1.3301336 , 1.33697825, 1.34382132, 1.35055864, 1.19989168, 1.20598434, 1.21220048, 1.21842384, 1.22454684,
1.35713958, 1.36358668, 1.36998697, 1.37645853, 1.38310497, 1.23051218, 1.23633498, 1.24209697, 1.24791509, 1.25389641,
1.38997553, 1.39704621, 1.40422902, 1.41140604, 1.41847493, 1.26009689, 1.26649987, 1.27302256, 1.27954802, 1.28597031,
1.4253885 , 1.43217295, 1.43891784, 1.44574164, 1.45274607, 1.29223546, 1.29836228, 1.30443522, 1.31057183, 1.31687751,
1.45997696, 1.46740665, 1.47494469, 1.48247285, 1.48989073, 1.32340488, 1.3301336, 1.33697825, 1.34382132, 1.35055864,
1.49715462, 1.50429437, 1.51140198, 1.51859618, 1.52597672, 1.35713958, 1.36358668, 1.36998697, 1.37645853, 1.38310497,
1.53358594, 1.54139257, 1.5493038 , 1.55720119, 1.56498641, 1.38997553, 1.39704621, 1.40422902, 1.41140604, 1.41847493,
1.57261924, 1.58013316, 1.58762252, 1.5952062 , 1.60298187, 1.4253885, 1.43217295, 1.43891784, 1.44574164, 1.45274607,
1.61098836, 1.6191908 , 1.62749412, 1.63577979, 1.64395163, 1.45997696, 1.46740665, 1.47494469, 1.48247285, 1.48989073,
1.65197298, 1.65988092, 1.66777202, 1.67576523, 1.68395602, 1.49715462, 1.50429437, 1.51140198, 1.51859618, 1.52597672,
1.69237968, 1.70099778, 1.70971307, 1.71840707, 1.72698583, 1.53358594, 1.54139257, 1.5493038, 1.55720119, 1.56498641,
1.73541631, 1.74373911, 1.75205298, 1.76047677, 1.76910369, 1.57261924, 1.58013316, 1.58762252, 1.5952062, 1.60298187,
1.77796544, 1.78702008, 1.79616827, 1.80529169, 1.81429875, 1.61098836, 1.6191908, 1.62749412, 1.63577979, 1.64395163,
1.82316 , 1.83191959, 1.84067831, 1.84955481, 1.85863994, 1.65197298, 1.65988092, 1.66777202, 1.67576523, 1.68395602,
1.86796178, 1.87747491, 1.88707803, 1.89665308, 1.9061109 , 1.69237968, 1.70099778, 1.70971307, 1.71840707, 1.72698583,
1.91542572, 1.92464514, 1.9338719 , 1.94322436, 1.9527909 , 1.73541631, 1.74373911, 1.75205298, 1.76047677, 1.76910369,
1.96259596, 1.97259069, 1.9826719 , 1.99272195, 2.00265419, 1.77796544, 1.78702008, 1.79616827, 1.80529169, 1.81429875,
2.01244653, 2.02215 , 2.0318692 , 2.04172204, 2.05179437, 1.82316, 1.83191959, 1.84067831, 1.84955481, 1.85863994,
2.06210696, 2.07260759, 2.08319129, 2.09374092, 2.10417247, 1.86796178, 1.87747491, 1.88707803, 1.89665308, 1.9061109,
2.11446752, 2.12468051, 2.13491776, 2.14529665, 2.1559004 , 1.91542572, 1.92464514, 1.9338719, 1.94322436, 1.9527909,
2.16674609, 2.17777817, 2.18889002, 2.19996511, 2.21092214, 1.96259596, 1.97259069, 1.9826719, 1.99272195, 2.00265419,
2.22174641, 2.23249567, 2.24327791, 2.25420982, 2.26537192, 2.01244653, 2.02215, 2.0318692, 2.04172204, 2.05179437,
2.2767776 , 2.28836802, 2.30003501, 2.3116628 , 2.32317284, 2.06210696, 2.07260759, 2.08319129, 2.09374092, 2.10417247,
2.33455419, 2.34586786, 2.35722337, 2.36873665, 2.38048542, 2.11446752, 2.12468051, 2.13491776, 2.14529665, 2.1559004,
2.39247934, 2.4046564 , 2.41690694, 2.42911606, 2.44120808, 2.16674609, 2.17777817, 2.18889002, 2.19996511, 2.21092214,
2.44120808, 2.44120808, 2.44120808, 2.44120808, 2.44120808, 2.22174641, 2.23249567, 2.24327791, 2.25420982, 2.26537192,
2.44120808, 2.44120808, 2.44120808, 2.44120808, 2.44120808, 2.2767776, 2.28836802, 2.30003501, 2.3116628, 2.32317284,
2.44120808, 2.44120808, 2.44120808, 2.44120808, 2.44120808, 2.33455419, 2.34586786, 2.35722337, 2.36873665, 2.38048542,
2.44120808, 2.44120808, 2.44120808, 2.44120808, 2.44120808])) 2.39247934, 2.4046564, 2.41690694, 2.42911606, 2.44120808,
''' 2.44120808, 2.44120808, 2.44120808, 2.44120808, 2.44120808,
2.44120808, 2.44120808, 2.44120808, 2.44120808, 2.44120808,
2.44120808, 2.44120808, 2.44120808, 2.44120808, 2.44120808,
2.44120808, 2.44120808, 2.44120808, 2.44120808, 2.44120808]))
def test_findcross_and_ecross(): def test_findcross_and_ecross():
''' assert_array_equal(findcross([0, 0, 1, -1, 1], 0), np.array([1, 2, 3]))
>>> findcross([0, 0, 1, -1, 1],0) assert_array_equal(findcross([0, 1, -1, 1], 0), np.array([0, 1, 2]))
array([1, 2, 3])
>>> findcross([0, 1, -1, 1],0) t = linspace(0, 7 * pi, 250)
array([0, 1, 2]) x = sin(t)
ind = findcross(x, 0.75)
>>> t = linspace(0,7*pi,250) assert_array_equal(ind, np.array([9, 25, 80, 97, 151, 168, 223, 239]))
>>> x = sin(t) t0 = ecross(t, x, ind, 0.75)
>>> ind = findcross(x,0.75) assert_array_almost_equal(t0, np.array([0.84910514, 2.2933879, 7.13205663,
>>> ind 8.57630119, 13.41484739, 14.85909194,
array([ 9, 25, 80, 97, 151, 168, 223, 239]) 19.69776067, 21.14204343]))
>>> t0 = ecross(t,x,ind,0.75)
>>> t0
array([ 0.84910514, 2.2933879 , 7.13205663, 8.57630119,
13.41484739, 14.85909194, 19.69776067, 21.14204343])
'''
def test_findextrema(): def test_findextrema():
''' t = linspace(0, 7 * pi, 250)
>>> t = linspace(0,7*pi,250) x = sin(t)
>>> x = sin(t) ind = findextrema(x)
>>> ind = findextrema(x) assert_array_almost_equal(ind, np.array([18, 53, 89, 125, 160, 196, 231]))
>>> ind
array([ 18, 53, 89, 125, 160, 196, 231])
'''
def test_findrfc(): def test_findrfc():
''' t = linspace(0, 7 * pi, 250)
>>> t = linspace(0,7*pi,250) x = sin(t) + 0.1 * sin(50 * t)
>>> x = sin(t)+0.1*sin(50*t) ind = findextrema(x)
>>> ind = findextrema(x) assert_array_almost_equal(
>>> ind ind,
array([ 1, 3, 4, 6, 7, 9, 11, 13, 14, 16, 18, 19, 21, np.array(
23, 25, 26, 28, 29, 31, 33, 35, 36, 38, 39, 41, 43, [1, 3, 4, 6, 7, 9, 11, 13, 14, 16, 18, 19, 21,
45, 46, 48, 50, 51, 53, 55, 56, 58, 60, 61, 63, 65, 23, 25, 26, 28, 29, 31, 33, 35, 36, 38, 39, 41, 43,
67, 68, 70, 71, 73, 75, 77, 78, 80, 81, 83, 85, 87, 45, 46, 48, 50, 51, 53, 55, 56, 58, 60, 61, 63, 65,
88, 90, 92, 93, 95, 97, 99, 100, 102, 103, 105, 107, 109, 67, 68, 70, 71, 73, 75, 77, 78, 80, 81, 83, 85, 87,
110, 112, 113, 115, 117, 119, 120, 122, 124, 125, 127, 129, 131, 88, 90, 92, 93, 95, 97, 99, 100, 102, 103, 105, 107, 109,
132, 134, 135, 137, 139, 141, 142, 144, 145, 147, 149, 151, 152, 110, 112, 113, 115, 117, 119, 120, 122, 124, 125, 127, 129, 131,
154, 156, 157, 159, 161, 162, 164, 166, 167, 169, 171, 173, 174, 132, 134, 135, 137, 139, 141, 142, 144, 145, 147, 149, 151, 152,
176, 177, 179, 181, 183, 184, 186, 187, 189, 191, 193, 194, 196, 154, 156, 157, 159, 161, 162, 164, 166, 167, 169, 171, 173, 174,
198, 199, 201, 203, 205, 206, 208, 209, 211, 213, 215, 216, 218, 176, 177, 179, 181, 183, 184, 186, 187, 189, 191, 193, 194, 196,
219, 221, 223, 225, 226, 228, 230, 231, 233, 235, 237, 238, 240, 198, 199, 201, 203, 205, 206, 208, 209, 211, 213, 215, 216, 218,
241, 243, 245, 247, 248]) 219, 221, 223, 225, 226, 228, 230, 231, 233, 235, 237, 238, 240,
>>> ti, tp = t[ind], x[ind] 241, 243, 245, 247, 248]))
>>> ind1 = findrfc(tp,0.3) _ti, tp = t[ind], x[ind]
>>> ind1 ind1 = findrfc(tp, 0.3)
array([ 0, 9, 32, 53, 74, 95, 116, 137]) assert_array_almost_equal(
>>> tp[ind1] ind1,
array([-0.00743352, 1.08753972, -1.07206545, 1.09550837, -1.07940458, np.array([0, 9, 32, 53, 74, 95, 116, 137]))
1.07849396, -1.0995006 , 1.08094452]) assert_array_almost_equal(
''' tp[ind1],
np.array(
[-0.00743352, 1.08753972, -1.07206545, 1.09550837, -1.07940458,
1.07849396, -1.0995006, 1.08094452]))
def test_rfcfilter(): def test_rfcfilter():
''' # 1. Filtered signal y is the turning points of x.
# 1. Filtered signal y is the turning points of x. x = sea()
>>> x = sea() y = rfcfilter(x[:, 1], h=0, method=1)
>>> y = rfcfilter(x[:,1], h=0, method=1) assert_array_almost_equal(
>>> y[0:5] y[0:5],
array([-1.2004945 , 0.83950546, -0.09049454, -0.02049454, -0.09049454]) np.array([-1.2004945, 0.83950546, -0.09049454,
-0.02049454, -0.09049454]))
# 2. This removes all rainflow cycles with range less than 0.5. # 2. This removes all rainflow cycles with range less than 0.5.
>>> y1 = rfcfilter(x[:,1], h=0.5) y1 = rfcfilter(x[:, 1], h=0.5)
>>> y1[0:5] assert_array_almost_equal(
array([-1.2004945 , 0.83950546, -0.43049454, 0.34950546, -0.51049454]) y1[0:5],
np.array([-1.2004945, 0.83950546, -0.43049454,
>>> t = linspace(0,7*pi,250) 0.34950546, -0.51049454]))
>>> x = sin(t)+0.1*sin(50*t)
>>> ind = findextrema(x) t = linspace(0, 7 * pi, 250)
>>> ind x = sin(t) + 0.1 * sin(50 * t)
array([ 1, 3, 4, 6, 7, 9, 11, 13, 14, 16, 18, 19, 21, ind = findextrema(x)
23, 25, 26, 28, 29, 31, 33, 35, 36, 38, 39, 41, 43, assert_array_almost_equal(
45, 46, 48, 50, 51, 53, 55, 56, 58, 60, 61, 63, 65, ind,
67, 68, 70, 71, 73, 75, 77, 78, 80, 81, 83, 85, 87, np.array(
88, 90, 92, 93, 95, 97, 99, 100, 102, 103, 105, 107, 109, [1, 3, 4, 6, 7, 9, 11, 13, 14, 16, 18, 19, 21,
110, 112, 113, 115, 117, 119, 120, 122, 124, 125, 127, 129, 131, 23, 25, 26, 28, 29, 31, 33, 35, 36, 38, 39, 41, 43,
132, 134, 135, 137, 139, 141, 142, 144, 145, 147, 149, 151, 152, 45, 46, 48, 50, 51, 53, 55, 56, 58, 60, 61, 63, 65,
154, 156, 157, 159, 161, 162, 164, 166, 167, 169, 171, 173, 174, 67, 68, 70, 71, 73, 75, 77, 78, 80, 81, 83, 85, 87,
176, 177, 179, 181, 183, 184, 186, 187, 189, 191, 193, 194, 196, 88, 90, 92, 93, 95, 97, 99, 100, 102, 103, 105, 107, 109,
198, 199, 201, 203, 205, 206, 208, 209, 211, 213, 215, 216, 218, 110, 112, 113, 115, 117, 119, 120, 122, 124, 125, 127, 129, 131,
219, 221, 223, 225, 226, 228, 230, 231, 233, 235, 237, 238, 240, 132, 134, 135, 137, 139, 141, 142, 144, 145, 147, 149, 151, 152,
241, 243, 245, 247, 248]) 154, 156, 157, 159, 161, 162, 164, 166, 167, 169, 171, 173, 174,
>>> ti, tp = t[ind], x[ind] 176, 177, 179, 181, 183, 184, 186, 187, 189, 191, 193, 194, 196,
>>> tp03 = rfcfilter(tp,0.3) 198, 199, 201, 203, 205, 206, 208, 209, 211, 213, 215, 216, 218,
>>> tp03 219, 221, 223, 225, 226, 228, 230, 231, 233, 235, 237, 238, 240,
array([-0.00743352, 1.08753972, -1.07206545, 1.09550837, -1.07940458, 241, 243, 245, 247, 248]))
1.07849396, -1.0995006 , 1.08094452, 0.11983423]) _ti, tp = t[ind], x[ind]
''' tp03 = rfcfilter(tp, 0.3)
assert_array_almost_equal(
tp03,
np.array(
[-0.00743352, 1.08753972, -1.07206545, 1.09550837, -1.07940458,
1.07849396, -1.0995006, 1.08094452, 0.11983423]))
def test_findtp(): def test_findtp():
''' x = sea()
>>> import numpy as np x1 = x[0:200, :]
>>> x = sea() itp = findtp(x1[:, 1], 0, 'Mw')
>>> x1 = x[0:200,:] itph = findtp(x1[:, 1], 0.3, 'Mw')
>>> itp = findtp(x1[:,1],0,'Mw') assert_array_almost_equal(
>>> itph = findtp(x1[:,1],0.3,'Mw') itp,
>>> itp np.array(
array([ 11, 21, 22, 24, 26, 28, 31, 39, 43, 45, 47, 51, 56, [11, 21, 22, 24, 26, 28, 31, 39, 43, 45, 47, 51, 56,
64, 70, 78, 82, 84, 89, 94, 101, 108, 119, 131, 141, 148, 64, 70, 78, 82, 84, 89, 94, 101, 108, 119, 131, 141, 148,
149, 150, 159, 173, 184, 190, 199]) 149, 150, 159, 173, 184, 190, 199]))
>>> itph assert_array_almost_equal(
array([ 11, 28, 31, 39, 47, 51, 56, 64, 70, 78, 89, 94, 101, itph,
108, 119, 131, 141, 148, 159, 173, 184, 190, 199]) np.array(
''' [11, 28, 31, 39, 47, 51, 56, 64, 70, 78, 89, 94, 101,
108, 119, 131, 141, 148, 159, 173, 184, 190, 199]))
def test_findtc(): def test_findtc():
''' x = sea()
>>> x = sea() x1 = x[0:200, :]
>>> x1 = x[0:200,:] itc, iv = findtc(x1[:, 1], 0, 'dw')
>>> itc, iv = findtc(x1[:,1],0,'dw') assert_array_almost_equal(
>>> itc itc,
array([ 28, 31, 39, 56, 64, 69, 78, 82, 83, 89, 94, 101, 108, np.array(
119, 131, 140, 148, 159, 173, 184]) [28, 31, 39, 56, 64, 69, 78, 82, 83, 89, 94, 101, 108,
>>> iv 119, 131, 140, 148, 159, 173, 184]))
array([ 19, 29, 34, 53, 60, 67, 76, 81, 82, 84, 90, 99, 103, assert_array_almost_equal(
112, 127, 137, 143, 154, 166, 180, 185]) iv,
''' np.array(
[19, 29, 34, 53, 60, 67, 76, 81, 82, 84, 90, 99, 103,
112, 127, 137, 143, 154, 166, 180, 185]))
def test_findoutliers(): def test_findoutliers():
''' xx = sea()
>>> xx = sea() dt = diff(xx[:2, 0])
>>> dt = diff(xx[:2,0]) dcrit = 5 * dt
>>> dcrit = 5*dt ddcrit = 9.81 / 2 * dt * dt
>>> ddcrit = 9.81/2*dt*dt zcrit = 0
>>> zcrit = 0 [inds, indg] = findoutliers(xx[:, 1], zcrit, dcrit, ddcrit, verbose=False)
>>> [inds, indg] = findoutliers(xx[:,1],zcrit,dcrit,ddcrit,verbose=True) assert_array_almost_equal(inds[np.r_[0, 1, 2, -3, -2, -1]],
Found 0 spurious positive jumps of Dx np.array([6, 7, 8, 9509, 9510, 9511]))
Found 0 spurious negative jumps of Dx assert_array_almost_equal(indg[np.r_[0, 1, 2, -3, -2, -1]],
Found 37 spurious positive jumps of D^2x np.array([0, 1, 2, 9521, 9522, 9523]))
Found 200 spurious negative jumps of D^2x
Found 244 consecutive equal values
Found the total of 1152 spurious points def test_hygfz():
>>> inds #y = hyp2f1_taylor(-1, -4, 1, .9)
array([ 6, 7, 8, ..., 9509, 9510, 9511]) assert_equal(4.6, hygfz(-1, -4, 1, .9))
>>> indg assert_almost_equal(1.0464328112173522, hygfz(0.1, 0.2, 0.3, 0.5))
array([ 0, 1, 2, ..., 9521, 9522, 9523]) assert_almost_equal(1.2027034401166194, hygfz(0.1, 0.2, 0.3, 0.95))
''' #assert_equal(1.661006238211309e-07, hygfz(5, -300, 10, 0.5))
assert_equal(0.118311386286, hygfz(0.5, -99.0, 1.5, 0.5625))
assert_equal(0.0965606007742, hygfz(0.5, -149.0, 1.5, 0.5625))
assert_equal(0.49234384000963544+0.60513406166123973j, hygfz(1, 1, 4, 3+4j))
def test_common_shape(): def test_common_shape():
''' A = np.ones((4, 1))
>>> import numpy as np B = 2
>>> A = np.ones((4,1)) C = np.ones((1, 5)) * 5
>>> B = 2 assert_array_equal(common_shape(A, B, C), (4, 5))
>>> C = np.ones((1,5))*5 assert_array_equal(common_shape(A, B, C, shape=(3, 4, 1)), (3, 4, 5))
>>> common_shape(A,B,C) A = np.ones((4, 1))
(4, 5) B = 2
>>> common_shape(A,B,C,shape=(3,4,1)) C = np.ones((1, 5)) * 5
(3, 4, 5) assert_array_equal(common_shape(A, B, C), (4, 5))
>>> A = np.ones((4,1)) assert_array_equal(common_shape(A, B, C, shape=(3, 4, 1)), (3, 4, 5))
>>> B = 2
>>> C = np.ones((1,5))*5
>>> common_shape(A,B,C)
(4, 5)
>>> common_shape(A,B,C,shape=(3,4,1))
(3, 4, 5)
'''
def test_argsreduce(): def test_argsreduce():
''' A = linspace(0, 19, 20).reshape((4, 5))
>>> import numpy as np B = 2
>>> rand = np.random.random_sample C = range(5)
>>> A = linspace(0,19,20).reshape((4,5)) cond = np.ones(A.shape)
>>> B = 2 [_A1, B1, _C1] = argsreduce(cond, A, B, C)
>>> C = range(5) assert_equal(B1.shape, (20,))
>>> cond = np.ones(A.shape) cond[2, :] = 0
>>> [A1,B1,C1] = argsreduce(cond,A,B,C) [A2, B2, C2] = argsreduce(cond, A, B, C)
>>> B1.shape assert_equal(B2.shape, (15,))
(20,) assert_array_equal(A2,
>>> cond[2,:] = 0 np.array([0., 1., 2., 3., 4., 5., 6., 7.,
>>> [A2,B2,C2] = argsreduce(cond,A,B,C) 8., 9., 15., 16., 17., 18., 19.]))
>>> B2.shape assert_array_equal(
(15,) B2, np.array([2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]))
>>> A2;B2;C2 assert_array_equal(
array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9., 15., C2, np.array([0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4]))
16., 17., 18., 19.])
array([2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])
array([0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4])
'''
def test_stirlerr(): def test_stirlerr():
''' assert_array_almost_equal(stirlerr(range(5)),
>>> stirlerr(range(5)) np.array([np.inf, 0.08106147, 0.0413407, 0.02767793,
array([ inf, 0.08106147, 0.0413407 , 0.02767793, 0.02079067]) 0.02079067]))
'''
def test_getshipchar(): def test_getshipchar():
''' sc = getshipchar(10, 'service_speed')
>>> sc = getshipchar(10,'service_speed') true_sc = dict(beam=29,
>>> names = ['beam', 'beamSTD', 'draught', beamSTD=2.9,
... 'draughtSTD', 'length', 'lengthSTD', draught=9.6,
... 'max_deadweight', 'max_deadweightSTD', 'propeller_diameter', draughtSTD=2.112,
... 'propeller_diameterSTD', 'service_speed', 'service_speedSTD'] length=216,
>>> for name in names: print( '%s : %g' % (name, sc[name])) lengthSTD=2.011309883194276,
beam : 29 max_deadweight=30969,
beamSTD : 2.9 max_deadweightSTD=3096.9,
draught : 9.6 propeller_diameter=6.761165385916601,
draughtSTD : 2.112 propeller_diameterSTD=0.20267047566705432,
length : 216 service_speed=10,
lengthSTD : 2.01131 service_speedSTD=0)
max_deadweight : 30969
max_deadweightSTD : 3096.9 for name, val in true_sc.iteritems():
propeller_diameter : 6.76117 assert_almost_equal(val, sc[name])
propeller_diameterSTD : 0.20267
service_speed : 10
service_speedSTD : 0
'''
def test_betaloge(): def test_betaloge():
''' assert_array_almost_equal(betaloge(3, arange(4)),
>>> betaloge(3, arange(4)) np.array([np.inf, -1.09861229, -2.48490665, -3.40119738]))
array([ inf, -1.09861229, -2.48490665, -3.40119738])
'''
def test_gravity(): def test_gravity():
''' phi = linspace(0, 45, 5)
>>> phi = linspace(0,45,5) assert_array_almost_equal(gravity(phi),
>>> gravity(phi) np.array([9.78049, 9.78245014, 9.78803583,
array([ 9.78049 , 9.78245014, 9.78803583, 9.79640552, 9.80629387]) 9.79640552, 9.80629387]))
'''
def test_nextpow2(): def test_nextpow2():
''' assert_equal(nextpow2(10), 4)
>>> nextpow2(10) assert_equal(nextpow2(np.arange(5)), 3)
4
>>> nextpow2(np.arange(5))
3
'''
def test_discretize(): def test_discretize():
''' x, y = discretize(np.cos, 0, np.pi)
>>> x, y = discretize(np.cos,0,np.pi) assert_array_almost_equal(
>>> x; y x,
array([ 0. , 0.19634954, 0.39269908, 0.58904862, 0.78539816, np.array(
0.9817477 , 1.17809725, 1.37444679, 1.57079633, 1.76714587, [0., 0.19634954, 0.39269908, 0.58904862, 0.78539816,
1.96349541, 2.15984495, 2.35619449, 2.55254403, 2.74889357, 0.9817477, 1.17809725, 1.37444679, 1.57079633, 1.76714587,
2.94524311, 3.14159265]) 1.96349541, 2.15984495, 2.35619449, 2.55254403, 2.74889357,
array([ 1.00000000e+00, 9.80785280e-01, 9.23879533e-01, 2.94524311, 3.14159265]))
8.31469612e-01, 7.07106781e-01, 5.55570233e-01, assert_array_almost_equal(
3.82683432e-01, 1.95090322e-01, 6.12323400e-17, y, np.array([1.00000000e+00, 9.80785280e-01,
-1.95090322e-01, -3.82683432e-01, -5.55570233e-01, 9.23879533e-01,
-7.07106781e-01, -8.31469612e-01, -9.23879533e-01, 8.31469612e-01, 7.07106781e-01, 5.55570233e-01,
-9.80785280e-01, -1.00000000e+00]) 3.82683432e-01, 1.95090322e-01, 6.12323400e-17,
''' -1.95090322e-01, -3.82683432e-01, -5.55570233e-01,
-7.07106781e-01, -8.31469612e-01, -9.23879533e-01,
-9.80785280e-01, -1.00000000e+00]))
def test_discretize_adaptive(): def test_discretize_adaptive():
''' x, y = discretize(np.cos, 0, np.pi, method='adaptive')
>>> x, y = discretize(np.cos,0,np.pi, method='adaptive') assert_array_almost_equal(
>>> x; y x,
array([ 0. , 0.19634954, 0.39269908, 0.58904862, 0.78539816, np.array(
0.9817477 , 1.17809725, 1.37444679, 1.57079633, 1.76714587, [0., 0.19634954, 0.39269908, 0.58904862, 0.78539816,
1.96349541, 2.15984495, 2.35619449, 2.55254403, 2.74889357, 0.9817477, 1.17809725, 1.37444679, 1.57079633, 1.76714587,
2.94524311, 3.14159265]) 1.96349541, 2.15984495, 2.35619449, 2.55254403, 2.74889357,
array([ 1.00000000e+00, 9.80785280e-01, 9.23879533e-01, 2.94524311, 3.14159265]))
8.31469612e-01, 7.07106781e-01, 5.55570233e-01, assert_array_almost_equal(
3.82683432e-01, 1.95090322e-01, 6.12323400e-17, y,
-1.95090322e-01, -3.82683432e-01, -5.55570233e-01, np.array(
-7.07106781e-01, -8.31469612e-01, -9.23879533e-01, [1.00000000e+00, 9.80785280e-01, 9.23879533e-01,
-9.80785280e-01, -1.00000000e+00]) 8.31469612e-01, 7.07106781e-01, 5.55570233e-01,
''' 3.82683432e-01, 1.95090322e-01, 6.12323400e-17,
-1.95090322e-01, -3.82683432e-01, -5.55570233e-01,
-7.07106781e-01, -8.31469612e-01, -9.23879533e-01,
def test_pol2cart_n_cart2pol(): -9.80785280e-01, -1.00000000e+00]))
'''
>>> r = 5
>>> t = linspace(0,pi,20) def test_polar2cart_n_cart2polar():
>>> x, y = polar2cart(t,r) r = 5
>>> x; y t = linspace(0, pi, 20)
array([ 5. , 4.93180652, 4.72908621, 4.39736876, 3.94570255, x, y = polar2cart(t, r)
3.38640786, 2.73474079, 2.00847712, 1.22742744, 0.41289673, assert_array_almost_equal(
-0.41289673, -1.22742744, -2.00847712, -2.73474079, -3.38640786, x,
-3.94570255, -4.39736876, -4.72908621, -4.93180652, -5. ]) np.array(
array([ 0.00000000e+00, 8.22972951e-01, 1.62349735e+00, [5., 4.93180652, 4.72908621, 4.39736876, 3.94570255,
2.37973697e+00, 3.07106356e+00, 3.67861955e+00, 3.38640786, 2.73474079, 2.00847712, 1.22742744, 0.41289673,
4.18583239e+00, 4.57886663e+00, 4.84700133e+00, -0.41289673, -1.22742744, -2.00847712, -2.73474079, -3.38640786,
4.98292247e+00, 4.98292247e+00, 4.84700133e+00, -3.94570255, -4.39736876, -4.72908621, -4.93180652, -5.]))
4.57886663e+00, 4.18583239e+00, 3.67861955e+00, assert_array_almost_equal(
3.07106356e+00, 2.37973697e+00, 1.62349735e+00, y,
8.22972951e-01, 6.12323400e-16]) np.array(
>>> ti, ri = cart2polar(x,y) [0.00000000e+00, 8.22972951e-01, 1.62349735e+00,
>>> ti;ri 2.37973697e+00, 3.07106356e+00, 3.67861955e+00,
array([ 0. , 0.16534698, 0.33069396, 0.49604095, 0.66138793, 4.18583239e+00, 4.57886663e+00, 4.84700133e+00,
0.82673491, 0.99208189, 1.15742887, 1.32277585, 1.48812284, 4.98292247e+00, 4.98292247e+00, 4.84700133e+00,
1.65346982, 1.8188168 , 1.98416378, 2.14951076, 2.31485774, 4.57886663e+00, 4.18583239e+00, 3.67861955e+00,
2.48020473, 2.64555171, 2.81089869, 2.97624567, 3.14159265]) 3.07106356e+00, 2.37973697e+00, 1.62349735e+00,
array([ 5., 5., 5., 5., 5., 5., 5., 5., 5., 5., 5., 5., 5., 8.22972951e-01, 6.12323400e-16]))
5., 5., 5., 5., 5., 5., 5.]) ti, ri = cart2polar(x, y)
''' assert_array_almost_equal(
ti,
np.array(
def test_meshgrid(): [0., 0.16534698, 0.33069396, 0.49604095, 0.66138793,
''' 0.82673491, 0.99208189, 1.15742887, 1.32277585, 1.48812284,
>>> x = np.linspace(0,1,3) # coordinates along x axis 1.65346982, 1.8188168, 1.98416378, 2.14951076, 2.31485774,
>>> y = np.linspace(0,1,2) # coordinates along y axis 2.48020473, 2.64555171, 2.81089869, 2.97624567, 3.14159265]))
>>> xv, yv = meshgrid(x,y) # extend x and y for a 2D xy grid assert_array_almost_equal(
>>> xv ri,
array([[ 0. , 0.5, 1. ], np.array(
[ 0. , 0.5, 1. ]]) [5., 5., 5., 5., 5., 5., 5., 5., 5., 5., 5., 5., 5.,
>>> yv 5., 5., 5., 5., 5., 5., 5.]))
array([[ 0., 0., 0.],
[ 1., 1., 1.]])
>>> xv, yv = meshgrid(x,y, sparse=True) # make sparse output arrays
>>> xv
array([[ 0. , 0.5, 1. ]])
>>> yv
array([[ 0.],
[ 1.]])
>>> meshgrid(x,y,sparse=True,indexing='ij') # change to matrix indexing
[array([[ 0. ],
[ 0.5],
[ 1. ]]), array([[ 0., 1.]])]
>>> meshgrid(x,y,indexing='ij')
[array([[ 0. , 0. ],
[ 0.5, 0.5],
[ 1. , 1. ]]), array([[ 0., 1.],
[ 0., 1.],
[ 0., 1.]])]
>>> meshgrid(0,1,5) # just a 3D point
[array([[[0]]]), array([[[1]]]), array([[[5]]])]
>>> map(np.squeeze,meshgrid(0,1,5)) # just a 3D point
[array(0), array(1), array(5)]
>>> meshgrid(3)
array([3])
>>> meshgrid(y) # 1D grid y is just returned
array([ 0., 1.])
`meshgrid` is very useful to evaluate functions on a grid.
>>> x = np.arange(-5, 5, 0.1)
>>> y = np.arange(-5, 5, 0.1)
>>> xx, yy = meshgrid(x, y, sparse=True)
>>> z = np.sin(xx**2+yy**2)/(xx**2+yy**2)
'''
def test_tranproc(): def test_tranproc():
''' import wafo.transform.models as wtm
>>> import wafo.transform.models as wtm tr = wtm.TrHermite()
>>> tr = wtm.TrHermite() x = linspace(-5, 5, 501)
>>> x = linspace(-5,5,501) g = tr(x)
>>> g = tr(x) y0, y1 = tranproc(x, g, range(5), ones(5))
>>> y0, y1 = tranproc(x, g, range(5), ones(5)) assert_array_almost_equal(
>>> y0;y1 y0,
array([ 0.02659612, 1.00115284, 1.92872532, 2.81453257, 3.66292878]) np.array([0.02659612, 1.00115284, 1.92872532,
array([ 1.00005295, 0.9501118 , 0.90589954, 0.86643821, 0.83096482]) 2.81453257, 3.66292878]))
''' assert_array_almost_equal(
y1,
np.array([1.00005295, 0.9501118, 0.90589954,
0.86643821, 0.83096482]))
if __name__ == '__main__': if __name__ == '__main__':
import doctest run_module_suite()
doctest.testmod()

Loading…
Cancel
Save