pywavelet 0.2.3__tar.gz → 0.2.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. {pywavelet-0.2.3 → pywavelet-0.2.4}/CHANGELOG.rst +22 -0
  2. {pywavelet-0.2.3 → pywavelet-0.2.4}/PKG-INFO +1 -1
  3. {pywavelet-0.2.3 → pywavelet-0.2.4}/src/pywavelet/_version.py +2 -2
  4. {pywavelet-0.2.3 → pywavelet-0.2.4}/src/pywavelet/types/wavelet.py +40 -6
  5. {pywavelet-0.2.3 → pywavelet-0.2.4}/src/pywavelet.egg-info/PKG-INFO +1 -1
  6. {pywavelet-0.2.3 → pywavelet-0.2.4}/tests/test_mask.py +12 -11
  7. {pywavelet-0.2.3 → pywavelet-0.2.4}/.github/workflows/ci.yml +0 -0
  8. {pywavelet-0.2.3 → pywavelet-0.2.4}/.github/workflows/docs.yml +0 -0
  9. {pywavelet-0.2.3 → pywavelet-0.2.4}/.github/workflows/pypi.yml +0 -0
  10. {pywavelet-0.2.3 → pywavelet-0.2.4}/.gitignore +0 -0
  11. {pywavelet-0.2.3 → pywavelet-0.2.4}/.pre-commit-config.yaml +0 -0
  12. {pywavelet-0.2.3 → pywavelet-0.2.4}/CITATION.cff +0 -0
  13. {pywavelet-0.2.3 → pywavelet-0.2.4}/README.rst +0 -0
  14. {pywavelet-0.2.3 → pywavelet-0.2.4}/docs/_config.yml +0 -0
  15. {pywavelet-0.2.3 → pywavelet-0.2.4}/docs/_static/demo.gif +0 -0
  16. {pywavelet-0.2.3 → pywavelet-0.2.4}/docs/_toc.yml +0 -0
  17. {pywavelet-0.2.3 → pywavelet-0.2.4}/docs/api.rst +0 -0
  18. {pywavelet-0.2.3 → pywavelet-0.2.4}/docs/example.ipynb +0 -0
  19. {pywavelet-0.2.3 → pywavelet-0.2.4}/docs/index.rst +0 -0
  20. {pywavelet-0.2.3 → pywavelet-0.2.4}/docs/logo.png +0 -0
  21. {pywavelet-0.2.3 → pywavelet-0.2.4}/docs/roundtrip_freq.png +0 -0
  22. {pywavelet-0.2.3 → pywavelet-0.2.4}/docs/roundtrip_time.png +0 -0
  23. {pywavelet-0.2.3 → pywavelet-0.2.4}/pyproject.toml +0 -0
  24. {pywavelet-0.2.3 → pywavelet-0.2.4}/setup.cfg +0 -0
  25. {pywavelet-0.2.3 → pywavelet-0.2.4}/src/pywavelet/__init__.py +0 -0
  26. {pywavelet-0.2.3 → pywavelet-0.2.4}/src/pywavelet/backend.py +0 -0
  27. {pywavelet-0.2.3 → pywavelet-0.2.4}/src/pywavelet/logger.py +0 -0
  28. {pywavelet-0.2.3 → pywavelet-0.2.4}/src/pywavelet/transforms/__init__.py +0 -0
  29. {pywavelet-0.2.3 → pywavelet-0.2.4}/src/pywavelet/transforms/jax/__init__.py +0 -0
  30. {pywavelet-0.2.3 → pywavelet-0.2.4}/src/pywavelet/transforms/jax/forward/__init__.py +0 -0
  31. {pywavelet-0.2.3 → pywavelet-0.2.4}/src/pywavelet/transforms/jax/forward/from_freq.py +0 -0
  32. {pywavelet-0.2.3 → pywavelet-0.2.4}/src/pywavelet/transforms/jax/forward/from_time.py +0 -0
  33. {pywavelet-0.2.3 → pywavelet-0.2.4}/src/pywavelet/transforms/jax/forward/main.py +0 -0
  34. {pywavelet-0.2.3 → pywavelet-0.2.4}/src/pywavelet/transforms/jax/inverse/__init__.py +0 -0
  35. {pywavelet-0.2.3 → pywavelet-0.2.4}/src/pywavelet/transforms/jax/inverse/main.py +0 -0
  36. {pywavelet-0.2.3 → pywavelet-0.2.4}/src/pywavelet/transforms/jax/inverse/to_freq.py +0 -0
  37. {pywavelet-0.2.3 → pywavelet-0.2.4}/src/pywavelet/transforms/numpy/__init__.py +0 -0
  38. {pywavelet-0.2.3 → pywavelet-0.2.4}/src/pywavelet/transforms/numpy/forward/__init__.py +0 -0
  39. {pywavelet-0.2.3 → pywavelet-0.2.4}/src/pywavelet/transforms/numpy/forward/from_freq.py +0 -0
  40. {pywavelet-0.2.3 → pywavelet-0.2.4}/src/pywavelet/transforms/numpy/forward/from_time.py +0 -0
  41. {pywavelet-0.2.3 → pywavelet-0.2.4}/src/pywavelet/transforms/numpy/forward/main.py +0 -0
  42. {pywavelet-0.2.3 → pywavelet-0.2.4}/src/pywavelet/transforms/numpy/inverse/__init__.py +0 -0
  43. {pywavelet-0.2.3 → pywavelet-0.2.4}/src/pywavelet/transforms/numpy/inverse/main.py +0 -0
  44. {pywavelet-0.2.3 → pywavelet-0.2.4}/src/pywavelet/transforms/numpy/inverse/to_freq.py +0 -0
  45. {pywavelet-0.2.3 → pywavelet-0.2.4}/src/pywavelet/transforms/numpy/inverse/to_time.py +0 -0
  46. {pywavelet-0.2.3 → pywavelet-0.2.4}/src/pywavelet/transforms/phi_computer.py +0 -0
  47. {pywavelet-0.2.3 → pywavelet-0.2.4}/src/pywavelet/types/__init__.py +0 -0
  48. {pywavelet-0.2.3 → pywavelet-0.2.4}/src/pywavelet/types/common.py +0 -0
  49. {pywavelet-0.2.3 → pywavelet-0.2.4}/src/pywavelet/types/frequencyseries.py +0 -0
  50. {pywavelet-0.2.3 → pywavelet-0.2.4}/src/pywavelet/types/plotting.py +0 -0
  51. {pywavelet-0.2.3 → pywavelet-0.2.4}/src/pywavelet/types/timeseries.py +0 -0
  52. {pywavelet-0.2.3 → pywavelet-0.2.4}/src/pywavelet/types/wavelet_bins.py +0 -0
  53. {pywavelet-0.2.3 → pywavelet-0.2.4}/src/pywavelet/utils.py +0 -0
  54. {pywavelet-0.2.3 → pywavelet-0.2.4}/src/pywavelet.egg-info/SOURCES.txt +0 -0
  55. {pywavelet-0.2.3 → pywavelet-0.2.4}/src/pywavelet.egg-info/dependency_links.txt +0 -0
  56. {pywavelet-0.2.3 → pywavelet-0.2.4}/src/pywavelet.egg-info/requires.txt +0 -0
  57. {pywavelet-0.2.3 → pywavelet-0.2.4}/src/pywavelet.egg-info/top_level.txt +0 -0
  58. {pywavelet-0.2.3 → pywavelet-0.2.4}/tests/conftest.py +0 -0
  59. {pywavelet-0.2.3 → pywavelet-0.2.4}/tests/test_data/roundtrip_chirp_freq.npz +0 -0
  60. {pywavelet-0.2.3 → pywavelet-0.2.4}/tests/test_data/roundtrip_chirp_time.npz +0 -0
  61. {pywavelet-0.2.3 → pywavelet-0.2.4}/tests/test_data/roundtrip_pure_f0_freq.npz +0 -0
  62. {pywavelet-0.2.3 → pywavelet-0.2.4}/tests/test_data/roundtrip_sine_freq.npz +0 -0
  63. {pywavelet-0.2.3 → pywavelet-0.2.4}/tests/test_data/roundtrip_sine_time.npz +0 -0
  64. {pywavelet-0.2.3 → pywavelet-0.2.4}/tests/test_jax.py +0 -0
  65. {pywavelet-0.2.3 → pywavelet-0.2.4}/tests/test_lnl.py +0 -0
  66. {pywavelet-0.2.3 → pywavelet-0.2.4}/tests/test_phi.py +0 -0
  67. {pywavelet-0.2.3 → pywavelet-0.2.4}/tests/test_psd.py +0 -0
  68. {pywavelet-0.2.3 → pywavelet-0.2.4}/tests/test_roundtrip_conversion.py +0 -0
  69. {pywavelet-0.2.3 → pywavelet-0.2.4}/tests/test_snr.py +0 -0
  70. {pywavelet-0.2.3 → pywavelet-0.2.4}/tests/test_timefreq_type.py +0 -0
  71. {pywavelet-0.2.3 → pywavelet-0.2.4}/tests/test_version.py +0 -0
  72. {pywavelet-0.2.3 → pywavelet-0.2.4}/tests/test_wavelet_plot.py +0 -0
  73. {pywavelet-0.2.3 → pywavelet-0.2.4}/tests/utils/__init__.py +0 -0
  74. {pywavelet-0.2.3 → pywavelet-0.2.4}/tests/utils/generate_data.py +0 -0
  75. {pywavelet-0.2.3 → pywavelet-0.2.4}/tests/utils/plotting.py +0 -0
@@ -5,6 +5,19 @@ CHANGELOG
5
5
  =========
6
6
 
7
7
 
8
+ .. _changelog-v0.2.4:
9
+
10
+ v0.2.4 (2025-01-24)
11
+ ===================
12
+
13
+ Unknown
14
+ -------
15
+
16
+ * Merge branch 'main' of github.com:avivajpeyi/pywavelet into main (`d2c84d9`_)
17
+
18
+ .. _d2c84d9: https://github.com/pywavelet/pywavelet/commit/d2c84d980b1701baf99e40ba6191cbd9336cfa59
19
+
20
+
8
21
  .. _changelog-v0.2.3:
9
22
 
10
23
  v0.2.3 (2025-01-24)
@@ -13,12 +26,21 @@ v0.2.3 (2025-01-24)
13
26
  Bug Fixes
14
27
  ---------
15
28
 
29
+ * fix: add masks to filter out gaps (`26fe40a`_)
30
+
16
31
  * fix: add backend check for os.environ (`98c0818`_)
17
32
 
18
33
  * fix: add test for jax (`1940394`_)
19
34
 
35
+ Chores
36
+ ------
37
+
38
+ * chore(release): 0.2.3 (`d067461`_)
39
+
40
+ .. _26fe40a: https://github.com/pywavelet/pywavelet/commit/26fe40ace80d5f9d598e1efeba2f8ca4a6f1043b
20
41
  .. _98c0818: https://github.com/pywavelet/pywavelet/commit/98c0818078190d829a23734f932f1f93c9932167
21
42
  .. _1940394: https://github.com/pywavelet/pywavelet/commit/194039437a3a9b3ada303d101b4e2573ab7d0afd
43
+ .. _d067461: https://github.com/pywavelet/pywavelet/commit/d0674615df328774a0d80eb224b5c503fbd8f332
22
44
 
23
45
 
24
46
  .. _changelog-v0.2.2:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pywavelet
3
- Version: 0.2.3
3
+ Version: 0.2.4
4
4
  Summary: WDM wavelet transform your time/freq series!
5
5
  Author-email: Pywavelet Team <avi.vajpeyi@gmail.com>
6
6
  Project-URL: Homepage, https://pywavelet.github.io/pywavelet/
@@ -12,5 +12,5 @@ __version__: str
12
12
  __version_tuple__: VERSION_TUPLE
13
13
  version_tuple: VERSION_TUPLE
14
14
 
15
- __version__ = version = '0.2.3'
16
- __version_tuple__ = version_tuple = (0, 2, 3)
15
+ __version__ = version = '0.2.4'
16
+ __version_tuple__ = version_tuple = (0, 2, 4)
@@ -1,6 +1,7 @@
1
1
  from typing import List, Tuple
2
2
 
3
3
  import matplotlib.pyplot as plt
4
+ import numpy as np
4
5
 
5
6
  from .common import fmt_timerange, is_documented_by, xp
6
7
  from .plotting import plot_wavelet_grid, plot_wavelet_trend
@@ -343,14 +344,18 @@ class Wavelet:
343
344
 
344
345
  def __mul__(self, other):
345
346
  """Element-wise multiplication of two Wavelet objects."""
346
- if isinstance(other, Wavelet):
347
- return Wavelet(
348
- data=self.data * other.data, time=self.time, freq=self.freq
349
- )
347
+ if isinstance(other, WaveletMask):
348
+ data = self.data.copy()
349
+ data[~other.mask] = np.nan
350
+ return Wavelet(data=data, time=self.time, freq=self.freq)
350
351
  elif isinstance(other, float):
351
352
  return Wavelet(
352
353
  data=self.data * other, time=self.time, freq=self.freq
353
354
  )
355
+ elif isinstance(other, WaveletMask):
356
+ return Wavelet(
357
+ data=self.data * other.data, time=self.time, freq=self.freq
358
+ )
354
359
 
355
360
  def __truediv__(self, other):
356
361
  """Element-wise division of two Wavelet objects."""
@@ -445,11 +450,40 @@ class WaveletMask(Wavelet):
445
450
  return rpr
446
451
 
447
452
  @classmethod
448
- def from_frange(
449
- cls, time_grid: xp.ndarray, freq_grid: xp.ndarray, frange: List[float]
453
+ def from_restrictions(
454
+ cls,
455
+ time_grid: xp.ndarray,
456
+ freq_grid: xp.ndarray,
457
+ frange: List[float],
458
+ tgaps: List[Tuple[float, float]] = [],
450
459
  ):
460
+ """
461
+ Create a WaveletMask object from restrictions on time and frequency.
462
+
463
+ Parameters
464
+ ----------
465
+ time_grid : xp.ndarray
466
+ Array of time points.
467
+ freq_grid : xp.ndarray
468
+ Array of corresponding frequency points.
469
+ frange : List[float]
470
+ Frequency range to include.
471
+ tgaps : List[Tuple[float, float]]
472
+ List of time gaps to exclude.
473
+
474
+ Returns
475
+ -------
476
+ WaveletMask
477
+ A WaveletMask object with the specified restrictions.
478
+ """
451
479
  self = cls.zeros_from_grid(time_grid, freq_grid)
452
480
  self.data[
453
481
  (freq_grid >= frange[0]) & (freq_grid <= frange[1]), :
454
482
  ] = True
483
+
484
+ for tgap in tgaps:
485
+ self.data[
486
+ :, (time_grid >= tgap[0]) & (time_grid <= tgap[1])
487
+ ] = False
488
+ self.data = self.data.astype(bool)
455
489
  return self
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pywavelet
3
- Version: 0.2.3
3
+ Version: 0.2.4
4
4
  Summary: WDM wavelet transform your time/freq series!
5
5
  Author-email: Pywavelet Team <avi.vajpeyi@gmail.com>
6
6
  Project-URL: Homepage, https://pywavelet.github.io/pywavelet/
@@ -13,25 +13,26 @@ def test_mask(plot_dir):
13
13
  psd = Wavelet(np.ones((h.Nf, h.Nt)), h.time, h.freq)
14
14
  assert compute_likelihood(d, h, psd) == 0
15
15
 
16
- mask = WaveletMask.from_frange(h.time, h.freq, [f0 - 0.5, f0 + 0.5])
16
+ mask = WaveletMask.from_restrictions(h.time, h.freq, [f0 - 0.5, f0 + 0.5])
17
+ dmasked = d * mask
17
18
  assert np.isclose(compute_likelihood(d, h, psd, mask), 0)
19
+ assert np.isclose(compute_likelihood(dmasked, h, psd), 0)
20
+ # number of nans in dmasked.data
21
+ assert np.isnan(dmasked.data).sum() != 0
18
22
 
19
- mask1 = WaveletMask.from_frange(h.time, h.freq, [f0 + 0.5, f0 + 1.5])
23
+ mask1 = WaveletMask.from_restrictions(
24
+ h.time, h.freq, [f0 + 0.5, f0 + 1.5], tgaps=[[1.7 * 60, 3.4 * 60]]
25
+ )
26
+ dmasked1 = d * mask1
20
27
  # assert np.isclose(compute_likelihood(d, h, psd_analysis, mask1), 0) == False
21
28
 
22
29
  # plt the 3 differnet datasets
23
30
  fig, axes = plt.subplots(1, 3, figsize=(12, 4), sharex=True, sharey=True)
24
- kwgs = dict(
25
- cmap="viridis",
26
- aspect="auto",
27
- origin="lower",
28
- extent=[d.time[0], d.time[-1], d.freq[0], d.freq[-1]],
29
- )
30
- axes[0].imshow(d.data, **kwgs)
31
+ d.plot(ax=axes[0])
31
32
  axes[0].set_title("data")
32
- axes[1].imshow(d.data * mask.mask, **kwgs)
33
+ (d * mask).plot(ax=axes[1])
33
34
  axes[1].set_title("data*mask[f0-0.5, f0+0.5]")
34
- axes[2].imshow(d.data * mask1.mask, **kwgs)
35
+ (d * mask1).plot(ax=axes[2])
35
36
  axes[2].set_title("data*mask[f0+0.5, f0+1.5]")
36
37
  plt.tight_layout()
37
38
  fig.savefig(f"{plot_dir}/test_mask.png")
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes