/
array.py
99 lines (87 loc) · 3.15 KB
/
array.py
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
"""Tools for creating Raw objects from numpy arrays."""
# Authors: Eric Larson <larson.eric.d@gmail.com>
#
# License: BSD-3-Clause
# Copyright the MNE-Python contributors.
import numpy as np
from ...utils import _check_option, _validate_type, fill_doc, logger, verbose
from ..base import BaseRaw
@fill_doc
class RawArray(BaseRaw):
"""Raw object from numpy array.
Parameters
----------
data : array, shape (n_channels, n_times)
The channels' time series. See notes for proper units of measure.
%(info_not_none)s Consider using :func:`mne.create_info` to populate
this structure. This may be modified in place by the class.
first_samp : int
First sample offset used during recording (default 0).
.. versionadded:: 0.12
copy : {'data', 'info', 'both', 'auto', None}
Determines what gets copied on instantiation. "auto" (default)
will copy info, and copy "data" only if necessary to get to
double floating point precision.
.. versionadded:: 0.18
%(verbose)s
See Also
--------
mne.EpochsArray
mne.EvokedArray
mne.create_info
Notes
-----
Proper units of measure:
* V: eeg, eog, seeg, dbs, emg, ecg, bio, ecog
* T: mag
* T/m: grad
* M: hbo, hbr
* Am: dipole
* AU: misc
"""
@verbose
def __init__(self, data, info, first_samp=0, copy="auto", verbose=None):
_validate_type(info, "info", "info")
_check_option("copy", copy, ("data", "info", "both", "auto", None))
dtype = np.complex128 if np.any(np.iscomplex(data)) else np.float64
orig_data = data
data = np.asanyarray(orig_data, dtype=dtype)
if data.ndim != 2:
raise ValueError(
"Data must be a 2D array of shape (n_channels, n_samples), got shape "
f"{data.shape}"
)
if len(data) != len(info["ch_names"]):
raise ValueError(
'len(data) ({}) does not match len(info["ch_names"]) ({})'.format(
len(data), len(info["ch_names"])
)
)
assert len(info["ch_names"]) == info["nchan"]
if copy in ("auto", "info", "both"):
info = info.copy()
if copy in ("data", "both"):
if data is orig_data:
data = data.copy()
elif copy != "auto" and data is not orig_data:
raise ValueError(
f"data copying was not requested by copy={copy!r} but it was required "
"to get to double floating point precision"
)
logger.info(
f"Creating RawArray with {dtype.__name__} data, "
f"n_channels={data.shape[0]}, n_times={data.shape[1]}"
)
super().__init__(
info, data, first_samps=(int(first_samp),), dtype=dtype, verbose=verbose
)
logger.info(
" Range : %d ... %d = %9.3f ... %9.3f secs"
% (
self.first_samp,
self.last_samp,
float(self.first_samp) / info["sfreq"],
float(self.last_samp) / info["sfreq"],
)
)
logger.info("Ready.")