@@ -3972,6 +3972,10 @@ async def from_array(
39723972 >>> await arr5.getitem(...)
39733973 array([[0, 0],[0, 0]])
39743974 """
3975+ mode : Literal ["a" ] = "a"
3976+ config_parsed = parse_array_config (config )
3977+ store_path = await make_store_path (store , path = name , mode = mode , storage_options = storage_options )
3978+
39753979 if isinstance (data , Array ):
39763980 if chunks == "keep" :
39773981 chunks = data .chunks
@@ -4016,51 +4020,51 @@ async def from_array(
40164020 serializer = "auto"
40174021 if not hasattr (data , "dtype" ) or not hasattr (data , "shape" ):
40184022 data = np .array (data )
4019- new_array = await create_array (
4020- store ,
4021- name = name ,
4023+
4024+ meta = await init_array (
4025+ store_path = store_path ,
40224026 shape = data .shape ,
40234027 dtype = data .dtype ,
40244028 chunks = chunks ,
40254029 shards = shards ,
40264030 filters = filters ,
40274031 compressors = compressors ,
4028- serializer = ( serializer or "auto" ) ,
4032+ serializer = serializer ,
40294033 fill_value = fill_value ,
40304034 order = order ,
40314035 zarr_format = zarr_format ,
40324036 attributes = attributes ,
40334037 chunk_key_encoding = chunk_key_encoding ,
40344038 dimension_names = dimension_names ,
4035- storage_options = storage_options ,
40364039 overwrite = overwrite ,
4037- config = config ,
40384040 )
4041+ result = AsyncArray (metadata = meta , store_path = store_path , config = config_parsed )
4042+
40394043 if write_data :
40404044 if isinstance (data , Array ):
40414045
40424046 async def _copy_array_region (chunk_coords : ChunkCoords | slice , _data : Array ) -> None :
40434047 arr = await _data ._async_array .getitem (chunk_coords )
4044- await new_array .setitem (chunk_coords , arr )
4048+ await result .setitem (chunk_coords , arr )
40454049
40464050 # Stream data from the source array to the new array
40474051 await concurrent_map (
4048- [(region , data ) for region in new_array ._iter_chunk_regions ()],
4052+ [(region , data ) for region in result ._iter_chunk_regions ()],
40494053 _copy_array_region ,
40504054 zarr .core .config .config .get ("async.concurrency" ),
40514055 )
40524056 else :
40534057
40544058 async def _copy_arraylike_region (chunk_coords : slice , _data : NDArrayLike ) -> None :
4055- await new_array .setitem (chunk_coords , _data [chunk_coords ])
4059+ await result .setitem (chunk_coords , _data [chunk_coords ])
40564060
40574061 # Stream data from the source array to the new array
40584062 await concurrent_map (
4059- [(region , data ) for region in new_array ._iter_chunk_regions ()],
4063+ [(region , data ) for region in result ._iter_chunk_regions ()],
40604064 _copy_arraylike_region ,
40614065 zarr .core .config .config .get ("async.concurrency" ),
40624066 )
4063- return new_array
4067+ return result
40644068
40654069
40664070async def init_array (
@@ -4408,39 +4412,54 @@ async def create_array(
44084412 >>> fill_value=0)
44094413 <AsyncArray memory://140349042942400 shape=(100, 100) dtype=int32>
44104414 """
4411- mode : Literal ["a" ] = "a"
4412- config_parsed = parse_array_config (config )
4413- store_path = await make_store_path (store , path = name , mode = mode , storage_options = storage_options )
4414-
44154415 data_parsed , shape_parsed , dtype_parsed = _parse_data_params (
44164416 data = data , shape = shape , dtype = dtype
44174417 )
4418- meta = await init_array (
4419- store_path = store_path ,
4420- shape = shape_parsed ,
4421- dtype = dtype_parsed ,
4422- chunks = chunks ,
4423- shards = shards ,
4424- filters = filters ,
4425- compressors = compressors ,
4426- serializer = serializer ,
4427- fill_value = fill_value ,
4428- order = order ,
4429- zarr_format = zarr_format ,
4430- attributes = attributes ,
4431- chunk_key_encoding = chunk_key_encoding ,
4432- dimension_names = dimension_names ,
4433- overwrite = overwrite ,
4434- )
4435-
4436- result = AsyncArray (metadata = meta , store_path = store_path , config = config_parsed )
4437- if write_data is True and data_parsed is not None :
4438- await result ._set_selection (
4439- BasicIndexer (..., shape = result .shape , chunk_grid = result .metadata .chunk_grid ),
4440- data_parsed ,
4441- prototype = default_buffer_prototype (),
4418+ if data_parsed is not None :
4419+ return await from_array (
4420+ data = data_parsed ,
4421+ store = store ,
4422+ write_data = write_data ,
4423+ name = name ,
4424+ chunks = chunks ,
4425+ shards = shards ,
4426+ filters = filters ,
4427+ compressors = compressors ,
4428+ serializer = serializer ,
4429+ fill_value = fill_value ,
4430+ order = order ,
4431+ zarr_format = zarr_format ,
4432+ attributes = attributes ,
4433+ chunk_key_encoding = chunk_key_encoding ,
4434+ dimension_names = dimension_names ,
4435+ storage_options = storage_options ,
4436+ overwrite = overwrite ,
4437+ config = config ,
44424438 )
4443- return result
4439+ else :
4440+ mode : Literal ["a" ] = "a"
4441+ config_parsed = parse_array_config (config )
4442+ store_path = await make_store_path (
4443+ store , path = name , mode = mode , storage_options = storage_options
4444+ )
4445+ meta = await init_array (
4446+ store_path = store_path ,
4447+ shape = shape_parsed ,
4448+ dtype = dtype_parsed ,
4449+ chunks = chunks ,
4450+ shards = shards ,
4451+ filters = filters ,
4452+ compressors = compressors ,
4453+ serializer = serializer ,
4454+ fill_value = fill_value ,
4455+ order = order ,
4456+ zarr_format = zarr_format ,
4457+ attributes = attributes ,
4458+ chunk_key_encoding = chunk_key_encoding ,
4459+ dimension_names = dimension_names ,
4460+ overwrite = overwrite ,
4461+ )
4462+ return AsyncArray (metadata = meta , store_path = store_path , config = config_parsed )
44444463
44454464
44464465def _parse_chunk_key_encoding (
0 commit comments