Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.8/site-packages/scipy/fft/_pocketfft/realtransforms.py: 34%
64 statements
« prev ^ index » next coverage.py v7.3.2, created at 2023-12-12 06:31 +0000
« prev ^ index » next coverage.py v7.3.2, created at 2023-12-12 06:31 +0000
1import numpy as np
2from . import pypocketfft as pfft
3from .helper import (_asfarray, _init_nd_shape_and_axes, _datacopied,
4 _fix_shape, _fix_shape_1d, _normalization, _workers)
5import functools
8def _r2r(forward, transform, x, type=2, n=None, axis=-1, norm=None,
9 overwrite_x=False, workers=None, orthogonalize=None):
10 """Forward or backward 1-D DCT/DST
12 Parameters
13 ----------
14 forward : bool
15 Transform direction (determines type and normalisation)
16 transform : {pypocketfft.dct, pypocketfft.dst}
17 The transform to perform
18 """
19 tmp = _asfarray(x)
20 overwrite_x = overwrite_x or _datacopied(tmp, x)
21 norm = _normalization(norm, forward)
22 workers = _workers(workers)
24 if not forward:
25 if type == 2:
26 type = 3
27 elif type == 3:
28 type = 2
30 if n is not None:
31 tmp, copied = _fix_shape_1d(tmp, n, axis)
32 overwrite_x = overwrite_x or copied
33 elif tmp.shape[axis] < 1:
34 raise ValueError("invalid number of data points ({0}) specified"
35 .format(tmp.shape[axis]))
37 out = (tmp if overwrite_x else None)
39 # For complex input, transform real and imaginary components separably
40 if np.iscomplexobj(x):
41 out = np.empty_like(tmp) if out is None else out
42 transform(tmp.real, type, (axis,), norm, out.real, workers)
43 transform(tmp.imag, type, (axis,), norm, out.imag, workers)
44 return out
46 return transform(tmp, type, (axis,), norm, out, workers, orthogonalize)
49dct = functools.partial(_r2r, True, pfft.dct)
50dct.__name__ = 'dct'
51idct = functools.partial(_r2r, False, pfft.dct)
52idct.__name__ = 'idct'
54dst = functools.partial(_r2r, True, pfft.dst)
55dst.__name__ = 'dst'
56idst = functools.partial(_r2r, False, pfft.dst)
57idst.__name__ = 'idst'
60def _r2rn(forward, transform, x, type=2, s=None, axes=None, norm=None,
61 overwrite_x=False, workers=None, orthogonalize=None):
62 """Forward or backward nd DCT/DST
64 Parameters
65 ----------
66 forward : bool
67 Transform direction (determines type and normalisation)
68 transform : {pypocketfft.dct, pypocketfft.dst}
69 The transform to perform
70 """
71 tmp = _asfarray(x)
73 shape, axes = _init_nd_shape_and_axes(tmp, s, axes)
74 overwrite_x = overwrite_x or _datacopied(tmp, x)
76 if len(axes) == 0:
77 return x
79 tmp, copied = _fix_shape(tmp, shape, axes)
80 overwrite_x = overwrite_x or copied
82 if not forward:
83 if type == 2:
84 type = 3
85 elif type == 3:
86 type = 2
88 norm = _normalization(norm, forward)
89 workers = _workers(workers)
90 out = (tmp if overwrite_x else None)
92 # For complex input, transform real and imaginary components separably
93 if np.iscomplexobj(x):
94 out = np.empty_like(tmp) if out is None else out
95 transform(tmp.real, type, axes, norm, out.real, workers)
96 transform(tmp.imag, type, axes, norm, out.imag, workers)
97 return out
99 return transform(tmp, type, axes, norm, out, workers, orthogonalize)
102dctn = functools.partial(_r2rn, True, pfft.dct)
103dctn.__name__ = 'dctn'
104idctn = functools.partial(_r2rn, False, pfft.dct)
105idctn.__name__ = 'idctn'
107dstn = functools.partial(_r2rn, True, pfft.dst)
108dstn.__name__ = 'dstn'
109idstn = functools.partial(_r2rn, False, pfft.dst)
110idstn.__name__ = 'idstn'