Skip to content

Commit f15f5ac

Browse files
committed
create_array calls from_array calls init_array
1 parent 39e05e9 commit f15f5ac

File tree

2 files changed

+60
-41
lines changed

2 files changed

+60
-41
lines changed

src/zarr/core/array.py

Lines changed: 59 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -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

40664070
async 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

44464465
def _parse_chunk_key_encoding(

tests/test_array.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1396,7 +1396,7 @@ async def test_from_array(
13961396
new_fill_value = 3
13971397
new_attributes = {"foo": "bar"}
13981398

1399-
result = zarr.array(
1399+
result = zarr.from_array(
14001400
src,
14011401
store=store2,
14021402
chunks=new_chunks,

0 commit comments

Comments
 (0)