1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
import numpy as np
from copy import copy
from public import public
from typing import Union, Tuple, Any
from .trace import Trace
@public
def trim(trace: Trace, start: int = None, end: int = None) -> Trace:
"""
Trim the `trace` samples, output contains samples between the `start` and `end` indices.
:param trace:
:param start:
:param end:
:return:
"""
if start is None:
start = 0
if end is None:
end = len(trace.samples)
if start > end:
raise ValueError("Invalid trim arguments.")
return Trace(copy(trace.title), copy(trace.data), trace.samples[start:end].copy())
@public
def reverse(trace: Trace) -> Trace:
"""
Reverse the samples of the `trace`.
:param trace:
:return:
"""
return Trace(copy(trace.title), copy(trace.data), np.flipud(trace.samples))
@public
def pad(trace: Trace, lengths: Union[Tuple[int, int], int],
values: Union[Tuple[Any, Any], Any] = (0, 0)) -> Trace:
"""
Pad the samples of the `trace` by `values` at the beginning and end.
:param trace:
:param lengths: How much to pad at the beginning and end, either symmetric (if integer) or asymmetric (if tuple).
:param values: What value to pad with, either symmetric or asymmetric (if tuple).
:return:
"""
if not isinstance(lengths, tuple):
lengths = (lengths, lengths)
if not isinstance(values, tuple):
values = (values, values)
return Trace(copy(trace.title), copy(trace.data),
np.pad(trace.samples, lengths, "constant", constant_values=values))
|