← Về thư mục
📄 / / profiles / r-and-d / raw_evidence / scientific-agent-skills / skills / zarr-python / references / v3_migration.md

Zarr-Python 3 Migration Quick Reference

Targets zarr 3.2.x (current stable: 3.2.1, released 2026-05-05). Official guide: 3.0 Migration Guide.

Version and format defaults

Topic Zarr-Python 2 Zarr-Python 3
Pin while migrating downstream zarr>=2,<3 zarr>=3,<4
Default on-disk format Zarr v2 Zarr v3 (zarr_format=3)
Write v2-compatible data default zarr_format=2 on create/open
Python requirement 3.9–3.11 (late 2.x) 3.12+ (3.2.1 on PyPI)
# Keep writing Zarr format 2 arrays (interop with older tools)
z = zarr.create_array(store="data.zarr", shape=(1000, 1000), chunks=(100, 100),
                      dtype="f4", zarr_format=2)

Store imports and backends

# v3 — stores live under zarr.storage
from zarr.storage import LocalStore, MemoryStore, ZipStore, FsspecStore
v2 v3
DirectoryStore LocalStore
FSStore FsspecStore
TempStore tempfile.TemporaryDirectory + LocalStore
S3Map / GCSMap (s3fs/gcsfs) Prefer FsspecStore or URI strings (see below)
DBMStore, LMDBStore, SQLiteStore, RedisStore, MongoDBStore Removed — use FsspecStore or custom store
import zarr

# URI + storage_options (requires s3fs for S3)
root = zarr.open_group(
    store="s3://my-bucket/path/data.zarr",
    mode="r",
    storage_options={"anon": False},  # provider credentials are handled by fsspec
)

# Explicit FsspecStore
from zarr.storage import FsspecStore
store = FsspecStore.from_url("s3://my-bucket/path/data.zarr", storage_options={"anon": False})
root = zarr.open_group(store=store, mode="r")

Install remote I/O extras with pinned versions in production projects, for example: uv pip install "zarr[remote]==3.2.1" "s3fs==2026.4.0" "gcsfs==2026.5.0". Zarr's remote extra pulls fsspec; add the protocol backend needed by the target store.

Codecs and compression

from zarr.codecs import BloscCodec, BloscShuffle

z = zarr.create_array(
    store="data.zarr", shape=(1000, 1000), chunks=(100, 100), dtype="f4",
    compressors=BloscCodec(cname="zstd", clevel=5, shuffle=BloscShuffle.bitshuffle),
)

Groups and h5py-style API

v2 (removed in v3) v3 replacement
group.create_dataset(...) group.create_array(...)
group.require_dataset(...) group.require_array(...)
group.foo attribute access group["foo"] only
zarr.storage.init_group(...) zarr.open_group(...) or zarr.create_group(...)

Array operations

# resize — pass a shape tuple, not separate dimension args
z.resize((15000, 15000))  # not z.resize(15000, 15000)

Advanced indexing: vindex, oindex, and blocks remain as convenience properties; equivalent methods are get_coordinate_selection, get_orthogonal_selection, etc.

Rectilinear chunks (3.2+)

Zarr 3.2 adds support for rectilinear chunk grids. Existing regular chunk tuples still work, but you can now pass nested chunk lengths when chunk boundaries vary by dimension:

z = zarr.create_array(
    store="rectilinear.zarr",
    shape=(60, 100),
    chunks=([10, 20, 30], [50, 50]),
    dtype="f4",
)

Metadata migration CLI (3.1.3+)

For v2 stores that need v3 metadata, use the Zarr CLI non-destructively first:

zarr migrate v3 path/to/input.zarr path/to/output.zarr
zarr migrate v3 path/to/input.zarr --dry-run

Only remove v2 metadata after downstream readers have been tested:

zarr remove-metadata v2 path/to/input.zarr

Not yet ported to v3 (avoid or expect errors)

From the migration guide WIP list:

Zarr-Python 2 support

For legacy workflows, choose an exact zarr==2.x.y release from the support-v2 release notes and commit a lockfile. Maintenance lives on the support/v2 branch (security fixes for ~6 months after 3.0).