@@ -3984,52 +3984,30 @@ async def from_array(
39843984 config_parsed = parse_array_config (config )
39853985 store_path = await make_store_path (store , path = name , mode = mode , storage_options = storage_options )
39863986
3987- if isinstance (data , Array ):
3988- if chunks == "keep" :
3989- chunks = data .chunks
3990- if shards == "keep" :
3991- shards = data .shards
3992- if zarr_format is None :
3993- zarr_format = data .metadata .zarr_format
3994- if filters == "keep" :
3995- if zarr_format == data .metadata .zarr_format :
3996- filters = data .filters or None
3997- else :
3998- filters = "auto"
3999- if compressors == "keep" :
4000- if zarr_format == data .metadata .zarr_format :
4001- compressors = data .compressors or None
4002- else :
4003- compressors = "auto"
4004- if serializer == "keep" :
4005- if zarr_format == 3 and data .metadata .zarr_format == 3 :
4006- serializer = cast (SerializerLike , data .serializer )
4007- else :
4008- serializer = "auto"
4009- if fill_value is None :
4010- fill_value = data .fill_value
4011- if order is None :
4012- order = data .order
4013- if chunk_key_encoding is None and zarr_format == data .metadata .zarr_format :
4014- if isinstance (data .metadata , ArrayV2Metadata ):
4015- chunk_key_encoding = {"name" : "v2" , "separator" : data .metadata .dimension_separator }
4016- elif isinstance (data .metadata , ArrayV3Metadata ):
4017- chunk_key_encoding = data .metadata .chunk_key_encoding
4018- if dimension_names is None and data .metadata .zarr_format == 3 :
4019- dimension_names = data .metadata .dimension_names
4020- else :
4021- if chunks == "keep" :
4022- chunks = "auto"
4023- if shards == "keep" :
4024- shards = None
4025- if zarr_format is None :
4026- zarr_format = 3
4027- if filters == "keep" :
4028- filters = "auto"
4029- if compressors == "keep" :
4030- compressors = "auto"
4031- if serializer == "keep" :
4032- serializer = "auto"
3987+ (
3988+ chunks ,
3989+ shards ,
3990+ filters ,
3991+ compressors ,
3992+ serializer ,
3993+ fill_value ,
3994+ order ,
3995+ zarr_format ,
3996+ chunk_key_encoding ,
3997+ dimension_names ,
3998+ ) = _parse_keep_array_attr (
3999+ data = data ,
4000+ chunks = chunks ,
4001+ shards = shards ,
4002+ filters = filters ,
4003+ compressors = compressors ,
4004+ serializer = serializer ,
4005+ fill_value = fill_value ,
4006+ order = order ,
4007+ zarr_format = zarr_format ,
4008+ chunk_key_encoding = chunk_key_encoding ,
4009+ dimension_names = dimension_names ,
4010+ )
40334011 if not hasattr (data , "dtype" ) or not hasattr (data , "shape" ):
40344012 data = np .array (data )
40354013
@@ -4474,6 +4452,90 @@ async def create_array(
44744452 return AsyncArray (metadata = meta , store_path = store_path , config = config_parsed )
44754453
44764454
4455+ def _parse_keep_array_attr (
4456+ data : Array | npt .ArrayLike ,
4457+ chunks : Literal ["auto" , "keep" ] | ChunkCoords ,
4458+ shards : ShardsLike | None | Literal ["keep" ],
4459+ filters : FiltersLike | Literal ["keep" ],
4460+ compressors : CompressorsLike | Literal ["keep" ],
4461+ serializer : SerializerLike | Literal ["keep" ],
4462+ fill_value : Any | None ,
4463+ order : MemoryOrder | None ,
4464+ zarr_format : ZarrFormat | None ,
4465+ chunk_key_encoding : ChunkKeyEncodingLike | None ,
4466+ dimension_names : Iterable [str ] | None ,
4467+ ) -> tuple [
4468+ ChunkCoords | Literal ["auto" ],
4469+ ShardsLike | None ,
4470+ FiltersLike ,
4471+ CompressorsLike ,
4472+ SerializerLike ,
4473+ Any | None ,
4474+ MemoryOrder | None ,
4475+ ZarrFormat ,
4476+ ChunkKeyEncodingLike | None ,
4477+ Iterable [str ] | None ,
4478+ ]:
4479+ if isinstance (data , Array ):
4480+ if chunks == "keep" :
4481+ chunks = data .chunks
4482+ if shards == "keep" :
4483+ shards = data .shards
4484+ if zarr_format is None :
4485+ zarr_format = data .metadata .zarr_format
4486+ if filters == "keep" :
4487+ if zarr_format == data .metadata .zarr_format :
4488+ filters = data .filters or None
4489+ else :
4490+ filters = "auto"
4491+ if compressors == "keep" :
4492+ if zarr_format == data .metadata .zarr_format :
4493+ compressors = data .compressors or None
4494+ else :
4495+ compressors = "auto"
4496+ if serializer == "keep" :
4497+ if zarr_format == 3 and data .metadata .zarr_format == 3 :
4498+ serializer = cast (SerializerLike , data .serializer )
4499+ else :
4500+ serializer = "auto"
4501+ if fill_value is None :
4502+ fill_value = data .fill_value
4503+ if order is None :
4504+ order = data .order
4505+ if chunk_key_encoding is None and zarr_format == data .metadata .zarr_format :
4506+ if isinstance (data .metadata , ArrayV2Metadata ):
4507+ chunk_key_encoding = {"name" : "v2" , "separator" : data .metadata .dimension_separator }
4508+ elif isinstance (data .metadata , ArrayV3Metadata ):
4509+ chunk_key_encoding = data .metadata .chunk_key_encoding
4510+ if dimension_names is None and data .metadata .zarr_format == 3 :
4511+ dimension_names = data .metadata .dimension_names
4512+ else :
4513+ if chunks == "keep" :
4514+ chunks = "auto"
4515+ if shards == "keep" :
4516+ shards = None
4517+ if zarr_format is None :
4518+ zarr_format = 3
4519+ if filters == "keep" :
4520+ filters = "auto"
4521+ if compressors == "keep" :
4522+ compressors = "auto"
4523+ if serializer == "keep" :
4524+ serializer = "auto"
4525+ return (
4526+ chunks ,
4527+ shards ,
4528+ filters ,
4529+ compressors ,
4530+ serializer ,
4531+ fill_value ,
4532+ order ,
4533+ zarr_format ,
4534+ chunk_key_encoding ,
4535+ dimension_names ,
4536+ )
4537+
4538+
44774539def _parse_chunk_key_encoding (
44784540 data : ChunkKeyEncodingLike | None , zarr_format : ZarrFormat
44794541) -> ChunkKeyEncoding :
0 commit comments