@@ -64,8 +64,8 @@ class Dataset:
64
64
By providing a mapping of data arrays, the remaining parameters are not needed
65
65
time:
66
66
a pandas.DatetimeIndex with the time instances of the data
67
- item :
68
- an ItemInfo with name, type and unit
67
+ items :
68
+ a list of ItemInfo with name, type and unit
69
69
geometry:
70
70
a geometry object e.g. Grid2D or GeometryFM2D
71
71
zn:
@@ -113,6 +113,10 @@ def __init__(
113
113
dt : float = 1.0 ,
114
114
):
115
115
if not self ._is_DataArrays (data ):
116
+ warnings .warn (
117
+ "Supplying data as a list of numpy arrays is deprecated. Use Dataset.from_numpy" ,
118
+ FutureWarning ,
119
+ )
116
120
data = self ._create_dataarrays (
117
121
data = data ,
118
122
time = time ,
@@ -122,12 +126,36 @@ def __init__(
122
126
dims = dims ,
123
127
dt = dt ,
124
128
)
125
- self ._data_vars : MutableMapping [ str , DataArray ] = self ._init_from_DataArrays (
129
+ self ._data_vars = self ._init_from_DataArrays (
126
130
data , # type: ignore
127
131
validate = validate ,
128
- ) # type: ignore
132
+ )
129
133
self .plot = _DatasetPlotter (self )
130
134
135
+ @staticmethod
136
+ def from_numpy (
137
+ data : Sequence [NDArray [np .floating ]],
138
+ time : pd .DatetimeIndex | None = None ,
139
+ items : Sequence [ItemInfo ] | None = None ,
140
+ * ,
141
+ geometry : Any | None = None ,
142
+ zn : NDArray [np .floating ] | None = None ,
143
+ dims : tuple [str , ...] | None = None ,
144
+ validate : bool = True ,
145
+ dt : float = 1.0 ,
146
+ ) -> Dataset :
147
+ das = Dataset ._create_dataarrays (
148
+ data = data ,
149
+ time = time ,
150
+ items = items ,
151
+ geometry = geometry ,
152
+ zn = zn ,
153
+ dims = dims ,
154
+ dt = dt ,
155
+ )
156
+
157
+ return Dataset (das )
158
+
131
159
@staticmethod
132
160
def _is_DataArrays (data : Any ) -> bool :
133
161
"""Check if input is Sequence/Mapping of DataArrays."""
@@ -179,8 +207,6 @@ def _init_from_DataArrays(
179
207
for da in data_vars .values ():
180
208
first ._is_compatible (da , raise_error = True )
181
209
182
- # TODO is it necessary to keep track of item names?
183
- self .__itemattr : set [str ] = set ()
184
210
for key , value in data_vars .items ():
185
211
self ._set_name_attr (key , value )
186
212
@@ -644,15 +670,11 @@ def rename(self, mapper: Mapping[str, str], inplace: bool = False) -> "Dataset":
644
670
645
671
def _set_name_attr (self , name : str , value : DataArray ) -> None :
646
672
name = _to_safe_name (name )
647
- if name not in self .__itemattr :
648
- self .__itemattr .add (name ) # keep track of what we insert
649
673
setattr (self , name , value )
650
674
651
675
def _del_name_attr (self , name : str ) -> None :
652
676
name = _to_safe_name (name )
653
- if name in self .__itemattr :
654
- self .__itemattr .remove (name )
655
- delattr (self , name )
677
+ delattr (self , name )
656
678
657
679
@overload
658
680
def __getitem__ (self , key : Hashable | int ) -> DataArray : ...
@@ -1359,7 +1381,7 @@ def _concat_time(
1359
1381
zn [idx2 , :] = other ._zn
1360
1382
zn [idx1 , :] = self ._zn
1361
1383
1362
- return Dataset (
1384
+ return Dataset . from_numpy (
1363
1385
newdata , time = newtime , items = ds .items , geometry = ds .geometry , zn = zn
1364
1386
)
1365
1387
0 commit comments