@@ -106,12 +106,14 @@ def fix_next_previous_obs(next_obs, previous_obs, flag_virtual):
106
106
107
107
class NetworkObservations (GroupEddiesObservations ):
108
108
109
- __slots__ = ("_index_network" ,)
110
-
109
+ __slots__ = ("_index_network" , "_index_segment_track" , "_segment_track_array" )
111
110
NOGROUP = 0
112
111
113
112
def __init__ (self , * args , ** kwargs ):
114
113
super ().__init__ (* args , ** kwargs )
114
+ self .reset_index ()
115
+
116
+ def reset_index (self ):
115
117
self ._index_network = None
116
118
self ._index_segment_track = None
117
119
self ._segment_track_array = None
@@ -251,9 +253,8 @@ def elements(self):
251
253
252
254
def astype (self , cls ):
253
255
new = cls .new_like (self , self .shape )
254
- print ()
255
- for k in new .obs .dtype .names :
256
- if k in self .obs .dtype .names :
256
+ for k in new .fields :
257
+ if k in self .fields :
257
258
new [k ][:] = self [k ][:]
258
259
new .sign_type = self .sign_type
259
260
return new
@@ -371,23 +372,27 @@ def correct_close_events(self, nb_days_max=20):
371
372
372
373
self .segment [:] = segment_copy
373
374
self .previous_obs [:] = previous_obs
374
-
375
- self .sort ()
375
+ return self .sort ()
376
376
377
377
def sort (self , order = ("track" , "segment" , "time" )):
378
378
"""
379
379
Sort observations
380
380
381
381
:param tuple order: order or sorting. Given to :func:`numpy.argsort`
382
382
"""
383
- index_order = self .obs .argsort (order = order )
384
- for field in self .elements :
383
+ index_order = self .obs .argsort (order = order , kind = "mergesort" )
384
+ self .reset_index ()
385
+ for field in self .fields :
385
386
self [field ][:] = self [field ][index_order ]
386
387
387
- translate = - ones (index_order .max () + 2 , dtype = "i4" )
388
- translate [index_order ] = arange (index_order .shape [0 ])
388
+ nb_obs = len (self )
389
+ # we add 1 for -1 index return index -1
390
+ translate = - ones (nb_obs + 1 , dtype = "i4" )
391
+ translate [index_order ] = arange (nb_obs )
392
+ # next & previous must be re-indexed
389
393
self .next_obs [:] = translate [self .next_obs ]
390
394
self .previous_obs [:] = translate [self .previous_obs ]
395
+ return index_order , translate
391
396
392
397
def obs_relative_order (self , i_obs ):
393
398
self .only_one_network ()
@@ -654,16 +659,16 @@ def normalize_longitude(self):
654
659
lon0 = (self .lon [i_start ] - 180 ).repeat (i_stop - i_start )
655
660
logger .debug ("Normalize longitude" )
656
661
self .lon [:] = (self .lon - lon0 ) % 360 + lon0
657
- if "lon_max" in self .obs . dtype . names :
662
+ if "lon_max" in self .fields :
658
663
logger .debug ("Normalize longitude_max" )
659
664
self .lon_max [:] = (self .lon_max - self .lon + 180 ) % 360 + self .lon - 180
660
665
if not self .raw_data :
661
- if "contour_lon_e" in self .obs . dtype . names :
666
+ if "contour_lon_e" in self .fields :
662
667
logger .debug ("Normalize effective contour longitude" )
663
668
self .contour_lon_e [:] = (
664
669
(self .contour_lon_e .T - self .lon + 180 ) % 360 + self .lon - 180
665
670
).T
666
- if "contour_lon_s" in self .obs . dtype . names :
671
+ if "contour_lon_s" in self .fields :
667
672
logger .debug ("Normalize speed contour longitude" )
668
673
self .contour_lon_s [:] = (
669
674
(self .contour_lon_s .T - self .lon + 180 ) % 360 + self .lon - 180
@@ -1071,7 +1076,7 @@ def extract_event(self, indices):
1071
1076
raw_data = self .raw_data ,
1072
1077
)
1073
1078
1074
- for k in new .obs . dtype . names :
1079
+ for k in new .fields :
1075
1080
new [k ][:] = self [k ][indices ]
1076
1081
new .sign_type = self .sign_type
1077
1082
return new
@@ -1194,27 +1199,11 @@ def dissociate_network(self):
1194
1199
"""
1195
1200
Dissociate networks with no known interaction (splitting/merging)
1196
1201
"""
1197
-
1198
1202
tags = self .tag_segment (multi_network = True )
1199
1203
if self .track [0 ] == 0 :
1200
1204
tags -= 1
1201
-
1202
1205
self .track [:] = tags [self .segment_track_array ]
1203
-
1204
- i_sort = self .obs .argsort (order = ("track" , "segment" , "time" ), kind = "mergesort" )
1205
- # Sort directly obs, with hope to save memory
1206
- self .obs .sort (order = ("track" , "segment" , "time" ), kind = "mergesort" )
1207
- self ._index_network = None
1208
-
1209
- # n & p must be re-indexed
1210
- n , p = self .next_obs , self .previous_obs
1211
- # we add 2 for -1 index return index -1
1212
- nb_obs = len (self )
1213
- translate = - ones (nb_obs + 1 , dtype = "i4" )
1214
- translate [:- 1 ][i_sort ] = arange (nb_obs )
1215
- self .next_obs [:] = translate [n ]
1216
- self .previous_obs [:] = translate [p ]
1217
- return translate
1206
+ return self .sort ()
1218
1207
1219
1208
def network_segment (self , id_network , id_segment ):
1220
1209
return self .extract_with_mask (self .segment_slice (id_network , id_segment ))
0 commit comments