@@ -539,6 +539,16 @@ def distance(self, other):
539
539
other eddies."""
540
540
return distance_grid (self .lon , self .lat , other .lon , other .lat )
541
541
542
+ def __copy__ (self ):
543
+ eddies = self .new_like (self , len (self ))
544
+ for k in self .obs .dtype .names :
545
+ eddies [k ][:] = self [k ][:]
546
+ eddies .sign_type = self .sign_type
547
+ return eddies
548
+
549
+ def copy (self ):
550
+ return self .__copy__ ()
551
+
542
552
@staticmethod
543
553
def new_like (eddies , new_size : int ):
544
554
return eddies .__class__ (
@@ -599,6 +609,8 @@ def load_file(cls, filename, **kwargs):
599
609
filename_ = (
600
610
filename .filename if isinstance (filename , ExFileObject ) else filename
601
611
)
612
+ if isinstance (filename , zarr .storage .MutableMapping ):
613
+ return cls .load_from_zarr (filename , ** kwargs )
602
614
end = b".zarr" if isinstance (filename_ , bytes ) else ".zarr"
603
615
if filename_ .endswith (end ):
604
616
return cls .load_from_zarr (filename , ** kwargs )
@@ -614,6 +626,7 @@ def load_from_zarr(
614
626
include_vars = None ,
615
627
indexs = None ,
616
628
buffer_size = 5000000 ,
629
+ ** class_kwargs ,
617
630
):
618
631
"""Load data from zarr.
619
632
@@ -623,6 +636,7 @@ def load_from_zarr(
623
636
:param None,list(str) include_vars: If defined only this variable will be loaded
624
637
:param None,dict indexs: Indexs to laad only a slice of data
625
638
:param int buffer_size: Size of buffer used to load zarr data
639
+ :param class_kwargs: argument to set up observations class
626
640
:return: Obsevations selected
627
641
:return type: class
628
642
"""
@@ -667,6 +681,7 @@ def load_from_zarr(
667
681
kwargs ["only_variables" ] = (
668
682
None if include_vars is None else [VAR_DESCR_inv [i ] for i in include_vars ]
669
683
)
684
+ kwargs .update (class_kwargs )
670
685
eddies = cls (size = nb_obs , ** kwargs )
671
686
for variable in var_list :
672
687
var_inv = VAR_DESCR_inv [variable ]
@@ -727,7 +742,7 @@ def copy_data_to_zarr(
727
742
if i_stop is None :
728
743
i_stop = handler_zarr .shape [0 ]
729
744
for i in range (i_start , i_stop , buffer_size ):
730
- sl_in = slice (i , i + buffer_size )
745
+ sl_in = slice (i , min ( i + buffer_size , i_stop ) )
731
746
data = handler_zarr [sl_in ]
732
747
if factor != 1 :
733
748
data *= factor
@@ -741,7 +756,13 @@ def copy_data_to_zarr(
741
756
742
757
@classmethod
743
758
def load_from_netcdf (
744
- cls , filename , raw_data = False , remove_vars = None , include_vars = None , indexs = None
759
+ cls ,
760
+ filename ,
761
+ raw_data = False ,
762
+ remove_vars = None ,
763
+ include_vars = None ,
764
+ indexs = None ,
765
+ ** class_kwargs ,
745
766
):
746
767
"""Load data from netcdf.
747
768
@@ -750,6 +771,7 @@ def load_from_netcdf(
750
771
:param None,list(str) remove_vars: List of variable name which will be not loaded
751
772
:param None,list(str) include_vars: If defined only this variable will be loaded
752
773
:param None,dict indexs: Indexs to laad only a slice of data
774
+ :param class_kwargs: argument to set up observations class
753
775
:return: Obsevations selected
754
776
:return type: class
755
777
"""
@@ -799,6 +821,7 @@ def load_from_netcdf(
799
821
if include_vars is None
800
822
else [VAR_DESCR_inv [i ] for i in include_vars ]
801
823
)
824
+ kwargs .update (class_kwargs )
802
825
eddies = cls (size = nb_obs , ** kwargs )
803
826
for variable in var_list :
804
827
var_inv = VAR_DESCR_inv [variable ]
@@ -1439,7 +1462,7 @@ def create_variable_zarr(
1439
1462
add_offset = None ,
1440
1463
filters = None ,
1441
1464
compressor = None ,
1442
- chunck_size = 2500000
1465
+ chunck_size = 2500000 ,
1443
1466
):
1444
1467
kwargs_variable ["shape" ] = data .shape
1445
1468
kwargs_variable ["compressor" ] = (
0 commit comments