[v3] zarr.array from from an existing zarr.Array #2410

Description

@jhamman

Zarr version

3.0.0.beta

Numcodecs version

0.13

Python Version

3.11

Operating System

Mac

Installation

pip

Description

It used to be possible to create a one zarr array from another. This is currently broken but would be interested to bring back in a more optimized form using the underlying async array for streaming.

Steps to reproduce

In [24]: a=zarr.zeros((10000, 10000), chunks=(100,100), dtype='uint16',
...: store='a.zarr')
In [25]: b=zarr.array(a, chunks=(100, 200), store='b.zarr')
--------------------------------------------------------------------------SyncErrorTraceback (mostrecentcalllast)
CellIn[25], line1---->1b=zarr.array(a, chunks=(100, 200), store='b.zarr')
File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/api/synchronous.py:164, inarray(data, **kwargs)
163defarray(data: NDArrayLike, **kwargs: Any) ->Array:
-->164returnArray(sync(async_api.array(data=data, **kwargs)))
File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/sync.py:141, insync(coro, loop, timeout)
138return_result=next(iter(finished)).result()
140ifisinstance(return_result, BaseException):
-->141raisereturn_result142else:
143returnreturn_resultFile~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/sync.py:100, in_runner(coro)
95""" 96 Await a coroutine and return the result of running it. If awaiting the coroutine raises an 97 exception, the exception will be returned. 98 """99try:
-->100returnawaitcoro101exceptExceptionasex:
102returnexFile~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/api/asynchronous.py:529, inarray(data, **kwargs)
526z=awaitcreate(**kwargs)
528# fill with data-->529awaitz.setitem(slice(None), data)
531returnzFile~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/array.py:880, inAsyncArray.setitem(self, selection, value, prototype)
874prototype=default_buffer_prototype()
875indexer=BasicIndexer(
876selection,
877shape=self.metadata.shape,
878chunk_grid=self.metadata.chunk_grid,
879 )
-->880returnawaitself._set_selection(indexer, value, prototype=prototype)
File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/array.py:853, inAsyncArray._set_selection(self, indexer, value, prototype, fields)
850value_buffer=prototype.nd_buffer.from_ndarray_like(value)
852# merging with existing data and encoding chunks-->853awaitself.codec_pipeline.write(
854 [
855 (
856self.store_path/self.metadata.encode_chunk_key(chunk_coords),
857self.metadata.get_chunk_spec(chunk_coords, self.order, prototype),
858chunk_selection,
859out_selection,
860 )
861forchunk_coords, chunk_selection, out_selectioninindexer862 ],
863value_buffer,
864drop_axes=indexer.drop_axes,
865 )
File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/codecs/pipeline.py:456, inBatchedCodecPipeline.write(self, batch_info, value, drop_axes)
450asyncdefwrite(
451self,
452batch_info: Iterable[tuple[ByteSetter, ArraySpec, SelectorTuple, SelectorTuple]],
453value: NDBuffer,
454drop_axes: tuple[int, ...] = (),
455 ) ->None:
-->456awaitconcurrent_map(
457 [
458 (single_batch_info, value, drop_axes)
459forsingle_batch_infoinbatched(batch_info, self.batch_size)
460 ],
461self.write_batch,
462config.get("async.concurrency"),
463 )
File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/common.py:64, inconcurrent_map(items, func, limit)
61asyncwithsem:
62returnawaitfunc(*item)
--->64returnawaitasyncio.gather(*[asyncio.ensure_future(run(item)) foriteminitems])
File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/common.py:62, inconcurrent_map.<locals>.run(item)
60asyncdefrun(item: tuple[Any]) ->V:
61asyncwithsem:
--->62returnawaitfunc(*item)
File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/codecs/pipeline.py:374, inBatchedCodecPipeline.write_batch(self, batch_info, value, drop_axes)
353chunk_bytes_batch=awaitconcurrent_map(
354 [
355 (
(...)
362config.get("async.concurrency"),
363 )
364chunk_array_batch=awaitself.decode_batch(
365 [
366 (chunk_bytes, chunk_spec)
(...)
370 ],
371 )
373chunk_array_batch= [
-->374self._merge_chunk_array(
375chunk_array, value, out_selection, chunk_spec, chunk_selection, drop_axes376 )
377forchunk_array, (_, chunk_spec, chunk_selection, out_selection) inzip(
378chunk_array_batch, batch_info, strict=False379 )
380 ]
382chunk_array_batch= [
383None384ifchunk_arrayisNoneorchunk_array.all_equal(chunk_spec.fill_value)
(...)
388 )
389 ]
391chunk_bytes_batch=awaitself.encode_batch(
392 [
393 (chunk_array, chunk_spec)
(...)
397 ],
398 )
File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/codecs/pipeline.py:316, inBatchedCodecPipeline._merge_chunk_array(self, existing_chunk_array, value, out_selection, chunk_spec, chunk_selection, drop_axes)
314chunk_value=value315else:
-->316chunk_value=value[out_selection]
317# handle missing singleton dimensions318ifdrop_axes!= ():
File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/buffer/cpu.py:180, inNDBuffer.__getitem__(self, key)
179def__getitem__(self, key: Any) ->Self:
-->180returnself.__class__(np.asanyarray(self._data.__getitem__(key)))
File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/array.py:1327, inArray.__getitem__(self, selection)
1325returnself.vindex[cast(CoordinateSelection|MaskSelection, selection)]
1326elifis_pure_orthogonal_indexing(pure_selection, self.ndim):
->1327returnself.get_orthogonal_selection(pure_selection, fields=fields)
1328else:
1329returnself.get_basic_selection(cast(BasicSelection, pure_selection), fields=fields)
File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/_compat.py:43, in_deprecate_positional_args.<locals>._inner_deprecate_positional_args.<locals>.inner_f(*args, **kwargs)
41extra_args=len(args) -len(all_args)
42ifextra_args<=0:
--->43returnf(*args, **kwargs)
45# extra_args > 046args_msg= [
47f"{name}={arg}"48forname, arginzip(kwonly_args[:extra_args], args[-extra_args:], strict=False)
49 ]
File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/array.py:1769, inArray.get_orthogonal_selection(self, selection, out, fields, prototype)
1767prototype=default_buffer_prototype()
1768indexer=OrthogonalIndexer(selection, self.shape, self.metadata.chunk_grid)
->1769returnsync(
1770self._async_array._get_selection(
1771indexer=indexer, out=out, fields=fields, prototype=prototype1772 )
1773 )
File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/sync.py:128, insync(coro, loop, timeout)
126loop0=asyncio.events.get_running_loop()
127ifloop0isloop:
-->128raiseSyncError("Calling sync() from within a running loop")
129exceptRuntimeError:
130passSyncError: Callingsync() fromwithinarunningloop

Additional output

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugPotential issues with the zarr-python library

    Type

    No type

    Projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

    , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
     blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
    }
    } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
    })();
    (function(){
    try {
    var __m = "github.com";
    var __re = new RegExp('^' + "github\\.com" + '
    
    Skip to content

    [v3] zarr.array from from an existing zarr.Array #2410

    Description

    @jhamman

    Zarr version

    3.0.0.beta

    Numcodecs version

    0.13

    Python Version

    3.11

    Operating System

    Mac

    Installation

    pip

    Description

    It used to be possible to create a one zarr array from another. This is currently broken but would be interested to bring back in a more optimized form using the underlying async array for streaming.

    Steps to reproduce

    In [24]: a=zarr.zeros((10000, 10000), chunks=(100,100), dtype='uint16',
    ...: store='a.zarr')
    In [25]: b=zarr.array(a, chunks=(100, 200), store='b.zarr')
    --------------------------------------------------------------------------SyncErrorTraceback (mostrecentcalllast)
    CellIn[25], line1---->1b=zarr.array(a, chunks=(100, 200), store='b.zarr')
    File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/api/synchronous.py:164, inarray(data, **kwargs)
    163defarray(data: NDArrayLike, **kwargs: Any) ->Array:
    -->164returnArray(sync(async_api.array(data=data, **kwargs)))
    File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/sync.py:141, insync(coro, loop, timeout)
    138return_result=next(iter(finished)).result()
    140ifisinstance(return_result, BaseException):
    -->141raisereturn_result142else:
    143returnreturn_resultFile~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/sync.py:100, in_runner(coro)
    95""" 96 Await a coroutine and return the result of running it. If awaiting the coroutine raises an 97 exception, the exception will be returned. 98 """99try:
    -->100returnawaitcoro101exceptExceptionasex:
    102returnexFile~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/api/asynchronous.py:529, inarray(data, **kwargs)
    526z=awaitcreate(**kwargs)
    528# fill with data-->529awaitz.setitem(slice(None), data)
    531returnzFile~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/array.py:880, inAsyncArray.setitem(self, selection, value, prototype)
    874prototype=default_buffer_prototype()
    875indexer=BasicIndexer(
    876selection,
    877shape=self.metadata.shape,
    878chunk_grid=self.metadata.chunk_grid,
    879 )
    -->880returnawaitself._set_selection(indexer, value, prototype=prototype)
    File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/array.py:853, inAsyncArray._set_selection(self, indexer, value, prototype, fields)
    850value_buffer=prototype.nd_buffer.from_ndarray_like(value)
    852# merging with existing data and encoding chunks-->853awaitself.codec_pipeline.write(
    854 [
    855 (
    856self.store_path/self.metadata.encode_chunk_key(chunk_coords),
    857self.metadata.get_chunk_spec(chunk_coords, self.order, prototype),
    858chunk_selection,
    859out_selection,
    860 )
    861forchunk_coords, chunk_selection, out_selectioninindexer862 ],
    863value_buffer,
    864drop_axes=indexer.drop_axes,
    865 )
    File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/codecs/pipeline.py:456, inBatchedCodecPipeline.write(self, batch_info, value, drop_axes)
    450asyncdefwrite(
    451self,
    452batch_info: Iterable[tuple[ByteSetter, ArraySpec, SelectorTuple, SelectorTuple]],
    453value: NDBuffer,
    454drop_axes: tuple[int, ...] = (),
    455 ) ->None:
    -->456awaitconcurrent_map(
    457 [
    458 (single_batch_info, value, drop_axes)
    459forsingle_batch_infoinbatched(batch_info, self.batch_size)
    460 ],
    461self.write_batch,
    462config.get("async.concurrency"),
    463 )
    File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/common.py:64, inconcurrent_map(items, func, limit)
    61asyncwithsem:
    62returnawaitfunc(*item)
    --->64returnawaitasyncio.gather(*[asyncio.ensure_future(run(item)) foriteminitems])
    File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/common.py:62, inconcurrent_map.<locals>.run(item)
    60asyncdefrun(item: tuple[Any]) ->V:
    61asyncwithsem:
    --->62returnawaitfunc(*item)
    File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/codecs/pipeline.py:374, inBatchedCodecPipeline.write_batch(self, batch_info, value, drop_axes)
    353chunk_bytes_batch=awaitconcurrent_map(
    354 [
    355 (
    (...)
    362config.get("async.concurrency"),
    363 )
    364chunk_array_batch=awaitself.decode_batch(
    365 [
    366 (chunk_bytes, chunk_spec)
    (...)
    370 ],
    371 )
    373chunk_array_batch= [
    -->374self._merge_chunk_array(
    375chunk_array, value, out_selection, chunk_spec, chunk_selection, drop_axes376 )
    377forchunk_array, (_, chunk_spec, chunk_selection, out_selection) inzip(
    378chunk_array_batch, batch_info, strict=False379 )
    380 ]
    382chunk_array_batch= [
    383None384ifchunk_arrayisNoneorchunk_array.all_equal(chunk_spec.fill_value)
    (...)
    388 )
    389 ]
    391chunk_bytes_batch=awaitself.encode_batch(
    392 [
    393 (chunk_array, chunk_spec)
    (...)
    397 ],
    398 )
    File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/codecs/pipeline.py:316, inBatchedCodecPipeline._merge_chunk_array(self, existing_chunk_array, value, out_selection, chunk_spec, chunk_selection, drop_axes)
    314chunk_value=value315else:
    -->316chunk_value=value[out_selection]
    317# handle missing singleton dimensions318ifdrop_axes!= ():
    File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/buffer/cpu.py:180, inNDBuffer.__getitem__(self, key)
    179def__getitem__(self, key: Any) ->Self:
    -->180returnself.__class__(np.asanyarray(self._data.__getitem__(key)))
    File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/array.py:1327, inArray.__getitem__(self, selection)
    1325returnself.vindex[cast(CoordinateSelection|MaskSelection, selection)]
    1326elifis_pure_orthogonal_indexing(pure_selection, self.ndim):
    ->1327returnself.get_orthogonal_selection(pure_selection, fields=fields)
    1328else:
    1329returnself.get_basic_selection(cast(BasicSelection, pure_selection), fields=fields)
    File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/_compat.py:43, in_deprecate_positional_args.<locals>._inner_deprecate_positional_args.<locals>.inner_f(*args, **kwargs)
    41extra_args=len(args) -len(all_args)
    42ifextra_args<=0:
    --->43returnf(*args, **kwargs)
    45# extra_args > 046args_msg= [
    47f"{name}={arg}"48forname, arginzip(kwonly_args[:extra_args], args[-extra_args:], strict=False)
    49 ]
    File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/array.py:1769, inArray.get_orthogonal_selection(self, selection, out, fields, prototype)
    1767prototype=default_buffer_prototype()
    1768indexer=OrthogonalIndexer(selection, self.shape, self.metadata.chunk_grid)
    ->1769returnsync(
    1770self._async_array._get_selection(
    1771indexer=indexer, out=out, fields=fields, prototype=prototype1772 )
    1773 )
    File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/sync.py:128, insync(coro, loop, timeout)
    126loop0=asyncio.events.get_running_loop()
    127ifloop0isloop:
    -->128raiseSyncError("Calling sync() from within a running loop")
    129exceptRuntimeError:
    130passSyncError: Callingsync() fromwithinarunningloop

    Additional output

    No response

    Metadata

    Metadata

    Assignees

    No one assigned

      Labels

      bugPotential issues with the zarr-python library

      Type

      No type

      Projects

      Milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions

      , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
      Skip to content

      [v3] zarr.array from from an existing zarr.Array #2410

      Description

      @jhamman

      Zarr version

      3.0.0.beta

      Numcodecs version

      0.13

      Python Version

      3.11

      Operating System

      Mac

      Installation

      pip

      Description

      It used to be possible to create a one zarr array from another. This is currently broken but would be interested to bring back in a more optimized form using the underlying async array for streaming.

      Steps to reproduce

      In [24]: a=zarr.zeros((10000, 10000), chunks=(100,100), dtype='uint16',
      ...: store='a.zarr')
      In [25]: b=zarr.array(a, chunks=(100, 200), store='b.zarr')
      --------------------------------------------------------------------------SyncErrorTraceback (mostrecentcalllast)
      CellIn[25], line1---->1b=zarr.array(a, chunks=(100, 200), store='b.zarr')
      File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/api/synchronous.py:164, inarray(data, **kwargs)
      163defarray(data: NDArrayLike, **kwargs: Any) ->Array:
      -->164returnArray(sync(async_api.array(data=data, **kwargs)))
      File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/sync.py:141, insync(coro, loop, timeout)
      138return_result=next(iter(finished)).result()
      140ifisinstance(return_result, BaseException):
      -->141raisereturn_result142else:
      143returnreturn_resultFile~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/sync.py:100, in_runner(coro)
      95""" 96 Await a coroutine and return the result of running it. If awaiting the coroutine raises an 97 exception, the exception will be returned. 98 """99try:
      -->100returnawaitcoro101exceptExceptionasex:
      102returnexFile~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/api/asynchronous.py:529, inarray(data, **kwargs)
      526z=awaitcreate(**kwargs)
      528# fill with data-->529awaitz.setitem(slice(None), data)
      531returnzFile~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/array.py:880, inAsyncArray.setitem(self, selection, value, prototype)
      874prototype=default_buffer_prototype()
      875indexer=BasicIndexer(
      876selection,
      877shape=self.metadata.shape,
      878chunk_grid=self.metadata.chunk_grid,
      879 )
      -->880returnawaitself._set_selection(indexer, value, prototype=prototype)
      File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/array.py:853, inAsyncArray._set_selection(self, indexer, value, prototype, fields)
      850value_buffer=prototype.nd_buffer.from_ndarray_like(value)
      852# merging with existing data and encoding chunks-->853awaitself.codec_pipeline.write(
      854 [
      855 (
      856self.store_path/self.metadata.encode_chunk_key(chunk_coords),
      857self.metadata.get_chunk_spec(chunk_coords, self.order, prototype),
      858chunk_selection,
      859out_selection,
      860 )
      861forchunk_coords, chunk_selection, out_selectioninindexer862 ],
      863value_buffer,
      864drop_axes=indexer.drop_axes,
      865 )
      File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/codecs/pipeline.py:456, inBatchedCodecPipeline.write(self, batch_info, value, drop_axes)
      450asyncdefwrite(
      451self,
      452batch_info: Iterable[tuple[ByteSetter, ArraySpec, SelectorTuple, SelectorTuple]],
      453value: NDBuffer,
      454drop_axes: tuple[int, ...] = (),
      455 ) ->None:
      -->456awaitconcurrent_map(
      457 [
      458 (single_batch_info, value, drop_axes)
      459forsingle_batch_infoinbatched(batch_info, self.batch_size)
      460 ],
      461self.write_batch,
      462config.get("async.concurrency"),
      463 )
      File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/common.py:64, inconcurrent_map(items, func, limit)
      61asyncwithsem:
      62returnawaitfunc(*item)
      --->64returnawaitasyncio.gather(*[asyncio.ensure_future(run(item)) foriteminitems])
      File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/common.py:62, inconcurrent_map.<locals>.run(item)
      60asyncdefrun(item: tuple[Any]) ->V:
      61asyncwithsem:
      --->62returnawaitfunc(*item)
      File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/codecs/pipeline.py:374, inBatchedCodecPipeline.write_batch(self, batch_info, value, drop_axes)
      353chunk_bytes_batch=awaitconcurrent_map(
      354 [
      355 (
      (...)
      362config.get("async.concurrency"),
      363 )
      364chunk_array_batch=awaitself.decode_batch(
      365 [
      366 (chunk_bytes, chunk_spec)
      (...)
      370 ],
      371 )
      373chunk_array_batch= [
      -->374self._merge_chunk_array(
      375chunk_array, value, out_selection, chunk_spec, chunk_selection, drop_axes376 )
      377forchunk_array, (_, chunk_spec, chunk_selection, out_selection) inzip(
      378chunk_array_batch, batch_info, strict=False379 )
      380 ]
      382chunk_array_batch= [
      383None384ifchunk_arrayisNoneorchunk_array.all_equal(chunk_spec.fill_value)
      (...)
      388 )
      389 ]
      391chunk_bytes_batch=awaitself.encode_batch(
      392 [
      393 (chunk_array, chunk_spec)
      (...)
      397 ],
      398 )
      File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/codecs/pipeline.py:316, inBatchedCodecPipeline._merge_chunk_array(self, existing_chunk_array, value, out_selection, chunk_spec, chunk_selection, drop_axes)
      314chunk_value=value315else:
      -->316chunk_value=value[out_selection]
      317# handle missing singleton dimensions318ifdrop_axes!= ():
      File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/buffer/cpu.py:180, inNDBuffer.__getitem__(self, key)
      179def__getitem__(self, key: Any) ->Self:
      -->180returnself.__class__(np.asanyarray(self._data.__getitem__(key)))
      File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/array.py:1327, inArray.__getitem__(self, selection)
      1325returnself.vindex[cast(CoordinateSelection|MaskSelection, selection)]
      1326elifis_pure_orthogonal_indexing(pure_selection, self.ndim):
      ->1327returnself.get_orthogonal_selection(pure_selection, fields=fields)
      1328else:
      1329returnself.get_basic_selection(cast(BasicSelection, pure_selection), fields=fields)
      File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/_compat.py:43, in_deprecate_positional_args.<locals>._inner_deprecate_positional_args.<locals>.inner_f(*args, **kwargs)
      41extra_args=len(args) -len(all_args)
      42ifextra_args<=0:
      --->43returnf(*args, **kwargs)
      45# extra_args > 046args_msg= [
      47f"{name}={arg}"48forname, arginzip(kwonly_args[:extra_args], args[-extra_args:], strict=False)
      49 ]
      File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/array.py:1769, inArray.get_orthogonal_selection(self, selection, out, fields, prototype)
      1767prototype=default_buffer_prototype()
      1768indexer=OrthogonalIndexer(selection, self.shape, self.metadata.chunk_grid)
      ->1769returnsync(
      1770self._async_array._get_selection(
      1771indexer=indexer, out=out, fields=fields, prototype=prototype1772 )
      1773 )
      File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/sync.py:128, insync(coro, loop, timeout)
      126loop0=asyncio.events.get_running_loop()
      127ifloop0isloop:
      -->128raiseSyncError("Calling sync() from within a running loop")
      129exceptRuntimeError:
      130passSyncError: Callingsync() fromwithinarunningloop

      Additional output

      No response

      Metadata

      Metadata

      Assignees

      No one assigned

        Labels

        bugPotential issues with the zarr-python library

        Type

        No type

        Projects

        Milestone

        Relationships

        None yet

        Development

        No branches or pull requests

        Issue actions

        , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
        Skip to content

        [v3] zarr.array from from an existing zarr.Array #2410

        Description

        @jhamman

        Zarr version

        3.0.0.beta

        Numcodecs version

        0.13

        Python Version

        3.11

        Operating System

        Mac

        Installation

        pip

        Description

        It used to be possible to create a one zarr array from another. This is currently broken but would be interested to bring back in a more optimized form using the underlying async array for streaming.

        Steps to reproduce

        In [24]: a=zarr.zeros((10000, 10000), chunks=(100,100), dtype='uint16',
        ...: store='a.zarr')
        In [25]: b=zarr.array(a, chunks=(100, 200), store='b.zarr')
        --------------------------------------------------------------------------SyncErrorTraceback (mostrecentcalllast)
        CellIn[25], line1---->1b=zarr.array(a, chunks=(100, 200), store='b.zarr')
        File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/api/synchronous.py:164, inarray(data, **kwargs)
        163defarray(data: NDArrayLike, **kwargs: Any) ->Array:
        -->164returnArray(sync(async_api.array(data=data, **kwargs)))
        File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/sync.py:141, insync(coro, loop, timeout)
        138return_result=next(iter(finished)).result()
        140ifisinstance(return_result, BaseException):
        -->141raisereturn_result142else:
        143returnreturn_resultFile~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/sync.py:100, in_runner(coro)
        95""" 96 Await a coroutine and return the result of running it. If awaiting the coroutine raises an 97 exception, the exception will be returned. 98 """99try:
        -->100returnawaitcoro101exceptExceptionasex:
        102returnexFile~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/api/asynchronous.py:529, inarray(data, **kwargs)
        526z=awaitcreate(**kwargs)
        528# fill with data-->529awaitz.setitem(slice(None), data)
        531returnzFile~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/array.py:880, inAsyncArray.setitem(self, selection, value, prototype)
        874prototype=default_buffer_prototype()
        875indexer=BasicIndexer(
        876selection,
        877shape=self.metadata.shape,
        878chunk_grid=self.metadata.chunk_grid,
        879 )
        -->880returnawaitself._set_selection(indexer, value, prototype=prototype)
        File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/array.py:853, inAsyncArray._set_selection(self, indexer, value, prototype, fields)
        850value_buffer=prototype.nd_buffer.from_ndarray_like(value)
        852# merging with existing data and encoding chunks-->853awaitself.codec_pipeline.write(
        854 [
        855 (
        856self.store_path/self.metadata.encode_chunk_key(chunk_coords),
        857self.metadata.get_chunk_spec(chunk_coords, self.order, prototype),
        858chunk_selection,
        859out_selection,
        860 )
        861forchunk_coords, chunk_selection, out_selectioninindexer862 ],
        863value_buffer,
        864drop_axes=indexer.drop_axes,
        865 )
        File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/codecs/pipeline.py:456, inBatchedCodecPipeline.write(self, batch_info, value, drop_axes)
        450asyncdefwrite(
        451self,
        452batch_info: Iterable[tuple[ByteSetter, ArraySpec, SelectorTuple, SelectorTuple]],
        453value: NDBuffer,
        454drop_axes: tuple[int, ...] = (),
        455 ) ->None:
        -->456awaitconcurrent_map(
        457 [
        458 (single_batch_info, value, drop_axes)
        459forsingle_batch_infoinbatched(batch_info, self.batch_size)
        460 ],
        461self.write_batch,
        462config.get("async.concurrency"),
        463 )
        File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/common.py:64, inconcurrent_map(items, func, limit)
        61asyncwithsem:
        62returnawaitfunc(*item)
        --->64returnawaitasyncio.gather(*[asyncio.ensure_future(run(item)) foriteminitems])
        File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/common.py:62, inconcurrent_map.<locals>.run(item)
        60asyncdefrun(item: tuple[Any]) ->V:
        61asyncwithsem:
        --->62returnawaitfunc(*item)
        File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/codecs/pipeline.py:374, inBatchedCodecPipeline.write_batch(self, batch_info, value, drop_axes)
        353chunk_bytes_batch=awaitconcurrent_map(
        354 [
        355 (
        (...)
        362config.get("async.concurrency"),
        363 )
        364chunk_array_batch=awaitself.decode_batch(
        365 [
        366 (chunk_bytes, chunk_spec)
        (...)
        370 ],
        371 )
        373chunk_array_batch= [
        -->374self._merge_chunk_array(
        375chunk_array, value, out_selection, chunk_spec, chunk_selection, drop_axes376 )
        377forchunk_array, (_, chunk_spec, chunk_selection, out_selection) inzip(
        378chunk_array_batch, batch_info, strict=False379 )
        380 ]
        382chunk_array_batch= [
        383None384ifchunk_arrayisNoneorchunk_array.all_equal(chunk_spec.fill_value)
        (...)
        388 )
        389 ]
        391chunk_bytes_batch=awaitself.encode_batch(
        392 [
        393 (chunk_array, chunk_spec)
        (...)
        397 ],
        398 )
        File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/codecs/pipeline.py:316, inBatchedCodecPipeline._merge_chunk_array(self, existing_chunk_array, value, out_selection, chunk_spec, chunk_selection, drop_axes)
        314chunk_value=value315else:
        -->316chunk_value=value[out_selection]
        317# handle missing singleton dimensions318ifdrop_axes!= ():
        File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/buffer/cpu.py:180, inNDBuffer.__getitem__(self, key)
        179def__getitem__(self, key: Any) ->Self:
        -->180returnself.__class__(np.asanyarray(self._data.__getitem__(key)))
        File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/array.py:1327, inArray.__getitem__(self, selection)
        1325returnself.vindex[cast(CoordinateSelection|MaskSelection, selection)]
        1326elifis_pure_orthogonal_indexing(pure_selection, self.ndim):
        ->1327returnself.get_orthogonal_selection(pure_selection, fields=fields)
        1328else:
        1329returnself.get_basic_selection(cast(BasicSelection, pure_selection), fields=fields)
        File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/_compat.py:43, in_deprecate_positional_args.<locals>._inner_deprecate_positional_args.<locals>.inner_f(*args, **kwargs)
        41extra_args=len(args) -len(all_args)
        42ifextra_args<=0:
        --->43returnf(*args, **kwargs)
        45# extra_args > 046args_msg= [
        47f"{name}={arg}"48forname, arginzip(kwonly_args[:extra_args], args[-extra_args:], strict=False)
        49 ]
        File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/array.py:1769, inArray.get_orthogonal_selection(self, selection, out, fields, prototype)
        1767prototype=default_buffer_prototype()
        1768indexer=OrthogonalIndexer(selection, self.shape, self.metadata.chunk_grid)
        ->1769returnsync(
        1770self._async_array._get_selection(
        1771indexer=indexer, out=out, fields=fields, prototype=prototype1772 )
        1773 )
        File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/sync.py:128, insync(coro, loop, timeout)
        126loop0=asyncio.events.get_running_loop()
        127ifloop0isloop:
        -->128raiseSyncError("Calling sync() from within a running loop")
        129exceptRuntimeError:
        130passSyncError: Callingsync() fromwithinarunningloop

        Additional output

        No response

        Metadata

        Metadata

        Assignees

        No one assigned

          Labels

          bugPotential issues with the zarr-python library

          Type

          No type

          Projects

          Milestone

          Relationships

          None yet

          Development

          No branches or pull requests

          Issue actions

          , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
          Skip to content

          [v3] zarr.array from from an existing zarr.Array #2410

          Description

          @jhamman

          Zarr version

          3.0.0.beta

          Numcodecs version

          0.13

          Python Version

          3.11

          Operating System

          Mac

          Installation

          pip

          Description

          It used to be possible to create a one zarr array from another. This is currently broken but would be interested to bring back in a more optimized form using the underlying async array for streaming.

          Steps to reproduce

          In [24]: a=zarr.zeros((10000, 10000), chunks=(100,100), dtype='uint16',
          ...: store='a.zarr')
          In [25]: b=zarr.array(a, chunks=(100, 200), store='b.zarr')
          --------------------------------------------------------------------------SyncErrorTraceback (mostrecentcalllast)
          CellIn[25], line1---->1b=zarr.array(a, chunks=(100, 200), store='b.zarr')
          File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/api/synchronous.py:164, inarray(data, **kwargs)
          163defarray(data: NDArrayLike, **kwargs: Any) ->Array:
          -->164returnArray(sync(async_api.array(data=data, **kwargs)))
          File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/sync.py:141, insync(coro, loop, timeout)
          138return_result=next(iter(finished)).result()
          140ifisinstance(return_result, BaseException):
          -->141raisereturn_result142else:
          143returnreturn_resultFile~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/sync.py:100, in_runner(coro)
          95""" 96 Await a coroutine and return the result of running it. If awaiting the coroutine raises an 97 exception, the exception will be returned. 98 """99try:
          -->100returnawaitcoro101exceptExceptionasex:
          102returnexFile~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/api/asynchronous.py:529, inarray(data, **kwargs)
          526z=awaitcreate(**kwargs)
          528# fill with data-->529awaitz.setitem(slice(None), data)
          531returnzFile~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/array.py:880, inAsyncArray.setitem(self, selection, value, prototype)
          874prototype=default_buffer_prototype()
          875indexer=BasicIndexer(
          876selection,
          877shape=self.metadata.shape,
          878chunk_grid=self.metadata.chunk_grid,
          879 )
          -->880returnawaitself._set_selection(indexer, value, prototype=prototype)
          File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/array.py:853, inAsyncArray._set_selection(self, indexer, value, prototype, fields)
          850value_buffer=prototype.nd_buffer.from_ndarray_like(value)
          852# merging with existing data and encoding chunks-->853awaitself.codec_pipeline.write(
          854 [
          855 (
          856self.store_path/self.metadata.encode_chunk_key(chunk_coords),
          857self.metadata.get_chunk_spec(chunk_coords, self.order, prototype),
          858chunk_selection,
          859out_selection,
          860 )
          861forchunk_coords, chunk_selection, out_selectioninindexer862 ],
          863value_buffer,
          864drop_axes=indexer.drop_axes,
          865 )
          File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/codecs/pipeline.py:456, inBatchedCodecPipeline.write(self, batch_info, value, drop_axes)
          450asyncdefwrite(
          451self,
          452batch_info: Iterable[tuple[ByteSetter, ArraySpec, SelectorTuple, SelectorTuple]],
          453value: NDBuffer,
          454drop_axes: tuple[int, ...] = (),
          455 ) ->None:
          -->456awaitconcurrent_map(
          457 [
          458 (single_batch_info, value, drop_axes)
          459forsingle_batch_infoinbatched(batch_info, self.batch_size)
          460 ],
          461self.write_batch,
          462config.get("async.concurrency"),
          463 )
          File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/common.py:64, inconcurrent_map(items, func, limit)
          61asyncwithsem:
          62returnawaitfunc(*item)
          --->64returnawaitasyncio.gather(*[asyncio.ensure_future(run(item)) foriteminitems])
          File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/common.py:62, inconcurrent_map.<locals>.run(item)
          60asyncdefrun(item: tuple[Any]) ->V:
          61asyncwithsem:
          --->62returnawaitfunc(*item)
          File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/codecs/pipeline.py:374, inBatchedCodecPipeline.write_batch(self, batch_info, value, drop_axes)
          353chunk_bytes_batch=awaitconcurrent_map(
          354 [
          355 (
          (...)
          362config.get("async.concurrency"),
          363 )
          364chunk_array_batch=awaitself.decode_batch(
          365 [
          366 (chunk_bytes, chunk_spec)
          (...)
          370 ],
          371 )
          373chunk_array_batch= [
          -->374self._merge_chunk_array(
          375chunk_array, value, out_selection, chunk_spec, chunk_selection, drop_axes376 )
          377forchunk_array, (_, chunk_spec, chunk_selection, out_selection) inzip(
          378chunk_array_batch, batch_info, strict=False379 )
          380 ]
          382chunk_array_batch= [
          383None384ifchunk_arrayisNoneorchunk_array.all_equal(chunk_spec.fill_value)
          (...)
          388 )
          389 ]
          391chunk_bytes_batch=awaitself.encode_batch(
          392 [
          393 (chunk_array, chunk_spec)
          (...)
          397 ],
          398 )
          File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/codecs/pipeline.py:316, inBatchedCodecPipeline._merge_chunk_array(self, existing_chunk_array, value, out_selection, chunk_spec, chunk_selection, drop_axes)
          314chunk_value=value315else:
          -->316chunk_value=value[out_selection]
          317# handle missing singleton dimensions318ifdrop_axes!= ():
          File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/buffer/cpu.py:180, inNDBuffer.__getitem__(self, key)
          179def__getitem__(self, key: Any) ->Self:
          -->180returnself.__class__(np.asanyarray(self._data.__getitem__(key)))
          File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/array.py:1327, inArray.__getitem__(self, selection)
          1325returnself.vindex[cast(CoordinateSelection|MaskSelection, selection)]
          1326elifis_pure_orthogonal_indexing(pure_selection, self.ndim):
          ->1327returnself.get_orthogonal_selection(pure_selection, fields=fields)
          1328else:
          1329returnself.get_basic_selection(cast(BasicSelection, pure_selection), fields=fields)
          File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/_compat.py:43, in_deprecate_positional_args.<locals>._inner_deprecate_positional_args.<locals>.inner_f(*args, **kwargs)
          41extra_args=len(args) -len(all_args)
          42ifextra_args<=0:
          --->43returnf(*args, **kwargs)
          45# extra_args > 046args_msg= [
          47f"{name}={arg}"48forname, arginzip(kwonly_args[:extra_args], args[-extra_args:], strict=False)
          49 ]
          File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/array.py:1769, inArray.get_orthogonal_selection(self, selection, out, fields, prototype)
          1767prototype=default_buffer_prototype()
          1768indexer=OrthogonalIndexer(selection, self.shape, self.metadata.chunk_grid)
          ->1769returnsync(
          1770self._async_array._get_selection(
          1771indexer=indexer, out=out, fields=fields, prototype=prototype1772 )
          1773 )
          File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/sync.py:128, insync(coro, loop, timeout)
          126loop0=asyncio.events.get_running_loop()
          127ifloop0isloop:
          -->128raiseSyncError("Calling sync() from within a running loop")
          129exceptRuntimeError:
          130passSyncError: Callingsync() fromwithinarunningloop

          Additional output

          No response

          Metadata

          Metadata

          Assignees

          No one assigned

            Labels

            bugPotential issues with the zarr-python library

            Type

            No type

            Projects

            Milestone

            Relationships

            None yet

            Development

            No branches or pull requests

            Issue actions

            , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
            Skip to content

            [v3] zarr.array from from an existing zarr.Array #2410

            Description

            @jhamman

            Zarr version

            3.0.0.beta

            Numcodecs version

            0.13

            Python Version

            3.11

            Operating System

            Mac

            Installation

            pip

            Description

            It used to be possible to create a one zarr array from another. This is currently broken but would be interested to bring back in a more optimized form using the underlying async array for streaming.

            Steps to reproduce

            In [24]: a=zarr.zeros((10000, 10000), chunks=(100,100), dtype='uint16',
            ...: store='a.zarr')
            In [25]: b=zarr.array(a, chunks=(100, 200), store='b.zarr')
            --------------------------------------------------------------------------SyncErrorTraceback (mostrecentcalllast)
            CellIn[25], line1---->1b=zarr.array(a, chunks=(100, 200), store='b.zarr')
            File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/api/synchronous.py:164, inarray(data, **kwargs)
            163defarray(data: NDArrayLike, **kwargs: Any) ->Array:
            -->164returnArray(sync(async_api.array(data=data, **kwargs)))
            File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/sync.py:141, insync(coro, loop, timeout)
            138return_result=next(iter(finished)).result()
            140ifisinstance(return_result, BaseException):
            -->141raisereturn_result142else:
            143returnreturn_resultFile~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/sync.py:100, in_runner(coro)
            95""" 96 Await a coroutine and return the result of running it. If awaiting the coroutine raises an 97 exception, the exception will be returned. 98 """99try:
            -->100returnawaitcoro101exceptExceptionasex:
            102returnexFile~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/api/asynchronous.py:529, inarray(data, **kwargs)
            526z=awaitcreate(**kwargs)
            528# fill with data-->529awaitz.setitem(slice(None), data)
            531returnzFile~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/array.py:880, inAsyncArray.setitem(self, selection, value, prototype)
            874prototype=default_buffer_prototype()
            875indexer=BasicIndexer(
            876selection,
            877shape=self.metadata.shape,
            878chunk_grid=self.metadata.chunk_grid,
            879 )
            -->880returnawaitself._set_selection(indexer, value, prototype=prototype)
            File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/array.py:853, inAsyncArray._set_selection(self, indexer, value, prototype, fields)
            850value_buffer=prototype.nd_buffer.from_ndarray_like(value)
            852# merging with existing data and encoding chunks-->853awaitself.codec_pipeline.write(
            854 [
            855 (
            856self.store_path/self.metadata.encode_chunk_key(chunk_coords),
            857self.metadata.get_chunk_spec(chunk_coords, self.order, prototype),
            858chunk_selection,
            859out_selection,
            860 )
            861forchunk_coords, chunk_selection, out_selectioninindexer862 ],
            863value_buffer,
            864drop_axes=indexer.drop_axes,
            865 )
            File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/codecs/pipeline.py:456, inBatchedCodecPipeline.write(self, batch_info, value, drop_axes)
            450asyncdefwrite(
            451self,
            452batch_info: Iterable[tuple[ByteSetter, ArraySpec, SelectorTuple, SelectorTuple]],
            453value: NDBuffer,
            454drop_axes: tuple[int, ...] = (),
            455 ) ->None:
            -->456awaitconcurrent_map(
            457 [
            458 (single_batch_info, value, drop_axes)
            459forsingle_batch_infoinbatched(batch_info, self.batch_size)
            460 ],
            461self.write_batch,
            462config.get("async.concurrency"),
            463 )
            File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/common.py:64, inconcurrent_map(items, func, limit)
            61asyncwithsem:
            62returnawaitfunc(*item)
            --->64returnawaitasyncio.gather(*[asyncio.ensure_future(run(item)) foriteminitems])
            File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/common.py:62, inconcurrent_map.<locals>.run(item)
            60asyncdefrun(item: tuple[Any]) ->V:
            61asyncwithsem:
            --->62returnawaitfunc(*item)
            File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/codecs/pipeline.py:374, inBatchedCodecPipeline.write_batch(self, batch_info, value, drop_axes)
            353chunk_bytes_batch=awaitconcurrent_map(
            354 [
            355 (
            (...)
            362config.get("async.concurrency"),
            363 )
            364chunk_array_batch=awaitself.decode_batch(
            365 [
            366 (chunk_bytes, chunk_spec)
            (...)
            370 ],
            371 )
            373chunk_array_batch= [
            -->374self._merge_chunk_array(
            375chunk_array, value, out_selection, chunk_spec, chunk_selection, drop_axes376 )
            377forchunk_array, (_, chunk_spec, chunk_selection, out_selection) inzip(
            378chunk_array_batch, batch_info, strict=False379 )
            380 ]
            382chunk_array_batch= [
            383None384ifchunk_arrayisNoneorchunk_array.all_equal(chunk_spec.fill_value)
            (...)
            388 )
            389 ]
            391chunk_bytes_batch=awaitself.encode_batch(
            392 [
            393 (chunk_array, chunk_spec)
            (...)
            397 ],
            398 )
            File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/codecs/pipeline.py:316, inBatchedCodecPipeline._merge_chunk_array(self, existing_chunk_array, value, out_selection, chunk_spec, chunk_selection, drop_axes)
            314chunk_value=value315else:
            -->316chunk_value=value[out_selection]
            317# handle missing singleton dimensions318ifdrop_axes!= ():
            File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/buffer/cpu.py:180, inNDBuffer.__getitem__(self, key)
            179def__getitem__(self, key: Any) ->Self:
            -->180returnself.__class__(np.asanyarray(self._data.__getitem__(key)))
            File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/array.py:1327, inArray.__getitem__(self, selection)
            1325returnself.vindex[cast(CoordinateSelection|MaskSelection, selection)]
            1326elifis_pure_orthogonal_indexing(pure_selection, self.ndim):
            ->1327returnself.get_orthogonal_selection(pure_selection, fields=fields)
            1328else:
            1329returnself.get_basic_selection(cast(BasicSelection, pure_selection), fields=fields)
            File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/_compat.py:43, in_deprecate_positional_args.<locals>._inner_deprecate_positional_args.<locals>.inner_f(*args, **kwargs)
            41extra_args=len(args) -len(all_args)
            42ifextra_args<=0:
            --->43returnf(*args, **kwargs)
            45# extra_args > 046args_msg= [
            47f"{name}={arg}"48forname, arginzip(kwonly_args[:extra_args], args[-extra_args:], strict=False)
            49 ]
            File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/array.py:1769, inArray.get_orthogonal_selection(self, selection, out, fields, prototype)
            1767prototype=default_buffer_prototype()
            1768indexer=OrthogonalIndexer(selection, self.shape, self.metadata.chunk_grid)
            ->1769returnsync(
            1770self._async_array._get_selection(
            1771indexer=indexer, out=out, fields=fields, prototype=prototype1772 )
            1773 )
            File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/sync.py:128, insync(coro, loop, timeout)
            126loop0=asyncio.events.get_running_loop()
            127ifloop0isloop:
            -->128raiseSyncError("Calling sync() from within a running loop")
            129exceptRuntimeError:
            130passSyncError: Callingsync() fromwithinarunningloop

            Additional output

            No response

            Metadata

            Metadata

            Assignees

            No one assigned

              Labels

              bugPotential issues with the zarr-python library

              Type

              No type

              Projects

              Milestone

              Relationships

              None yet

              Development

              No branches or pull requests

              Issue actions

              , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
              Skip to content

              [v3] zarr.array from from an existing zarr.Array #2410

              Description

              @jhamman

              Zarr version

              3.0.0.beta

              Numcodecs version

              0.13

              Python Version

              3.11

              Operating System

              Mac

              Installation

              pip

              Description

              It used to be possible to create a one zarr array from another. This is currently broken but would be interested to bring back in a more optimized form using the underlying async array for streaming.

              Steps to reproduce

              In [24]: a=zarr.zeros((10000, 10000), chunks=(100,100), dtype='uint16',
              ...: store='a.zarr')
              In [25]: b=zarr.array(a, chunks=(100, 200), store='b.zarr')
              --------------------------------------------------------------------------SyncErrorTraceback (mostrecentcalllast)
              CellIn[25], line1---->1b=zarr.array(a, chunks=(100, 200), store='b.zarr')
              File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/api/synchronous.py:164, inarray(data, **kwargs)
              163defarray(data: NDArrayLike, **kwargs: Any) ->Array:
              -->164returnArray(sync(async_api.array(data=data, **kwargs)))
              File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/sync.py:141, insync(coro, loop, timeout)
              138return_result=next(iter(finished)).result()
              140ifisinstance(return_result, BaseException):
              -->141raisereturn_result142else:
              143returnreturn_resultFile~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/sync.py:100, in_runner(coro)
              95""" 96 Await a coroutine and return the result of running it. If awaiting the coroutine raises an 97 exception, the exception will be returned. 98 """99try:
              -->100returnawaitcoro101exceptExceptionasex:
              102returnexFile~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/api/asynchronous.py:529, inarray(data, **kwargs)
              526z=awaitcreate(**kwargs)
              528# fill with data-->529awaitz.setitem(slice(None), data)
              531returnzFile~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/array.py:880, inAsyncArray.setitem(self, selection, value, prototype)
              874prototype=default_buffer_prototype()
              875indexer=BasicIndexer(
              876selection,
              877shape=self.metadata.shape,
              878chunk_grid=self.metadata.chunk_grid,
              879 )
              -->880returnawaitself._set_selection(indexer, value, prototype=prototype)
              File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/array.py:853, inAsyncArray._set_selection(self, indexer, value, prototype, fields)
              850value_buffer=prototype.nd_buffer.from_ndarray_like(value)
              852# merging with existing data and encoding chunks-->853awaitself.codec_pipeline.write(
              854 [
              855 (
              856self.store_path/self.metadata.encode_chunk_key(chunk_coords),
              857self.metadata.get_chunk_spec(chunk_coords, self.order, prototype),
              858chunk_selection,
              859out_selection,
              860 )
              861forchunk_coords, chunk_selection, out_selectioninindexer862 ],
              863value_buffer,
              864drop_axes=indexer.drop_axes,
              865 )
              File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/codecs/pipeline.py:456, inBatchedCodecPipeline.write(self, batch_info, value, drop_axes)
              450asyncdefwrite(
              451self,
              452batch_info: Iterable[tuple[ByteSetter, ArraySpec, SelectorTuple, SelectorTuple]],
              453value: NDBuffer,
              454drop_axes: tuple[int, ...] = (),
              455 ) ->None:
              -->456awaitconcurrent_map(
              457 [
              458 (single_batch_info, value, drop_axes)
              459forsingle_batch_infoinbatched(batch_info, self.batch_size)
              460 ],
              461self.write_batch,
              462config.get("async.concurrency"),
              463 )
              File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/common.py:64, inconcurrent_map(items, func, limit)
              61asyncwithsem:
              62returnawaitfunc(*item)
              --->64returnawaitasyncio.gather(*[asyncio.ensure_future(run(item)) foriteminitems])
              File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/common.py:62, inconcurrent_map.<locals>.run(item)
              60asyncdefrun(item: tuple[Any]) ->V:
              61asyncwithsem:
              --->62returnawaitfunc(*item)
              File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/codecs/pipeline.py:374, inBatchedCodecPipeline.write_batch(self, batch_info, value, drop_axes)
              353chunk_bytes_batch=awaitconcurrent_map(
              354 [
              355 (
              (...)
              362config.get("async.concurrency"),
              363 )
              364chunk_array_batch=awaitself.decode_batch(
              365 [
              366 (chunk_bytes, chunk_spec)
              (...)
              370 ],
              371 )
              373chunk_array_batch= [
              -->374self._merge_chunk_array(
              375chunk_array, value, out_selection, chunk_spec, chunk_selection, drop_axes376 )
              377forchunk_array, (_, chunk_spec, chunk_selection, out_selection) inzip(
              378chunk_array_batch, batch_info, strict=False379 )
              380 ]
              382chunk_array_batch= [
              383None384ifchunk_arrayisNoneorchunk_array.all_equal(chunk_spec.fill_value)
              (...)
              388 )
              389 ]
              391chunk_bytes_batch=awaitself.encode_batch(
              392 [
              393 (chunk_array, chunk_spec)
              (...)
              397 ],
              398 )
              File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/codecs/pipeline.py:316, inBatchedCodecPipeline._merge_chunk_array(self, existing_chunk_array, value, out_selection, chunk_spec, chunk_selection, drop_axes)
              314chunk_value=value315else:
              -->316chunk_value=value[out_selection]
              317# handle missing singleton dimensions318ifdrop_axes!= ():
              File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/buffer/cpu.py:180, inNDBuffer.__getitem__(self, key)
              179def__getitem__(self, key: Any) ->Self:
              -->180returnself.__class__(np.asanyarray(self._data.__getitem__(key)))
              File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/array.py:1327, inArray.__getitem__(self, selection)
              1325returnself.vindex[cast(CoordinateSelection|MaskSelection, selection)]
              1326elifis_pure_orthogonal_indexing(pure_selection, self.ndim):
              ->1327returnself.get_orthogonal_selection(pure_selection, fields=fields)
              1328else:
              1329returnself.get_basic_selection(cast(BasicSelection, pure_selection), fields=fields)
              File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/_compat.py:43, in_deprecate_positional_args.<locals>._inner_deprecate_positional_args.<locals>.inner_f(*args, **kwargs)
              41extra_args=len(args) -len(all_args)
              42ifextra_args<=0:
              --->43returnf(*args, **kwargs)
              45# extra_args > 046args_msg= [
              47f"{name}={arg}"48forname, arginzip(kwonly_args[:extra_args], args[-extra_args:], strict=False)
              49 ]
              File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/array.py:1769, inArray.get_orthogonal_selection(self, selection, out, fields, prototype)
              1767prototype=default_buffer_prototype()
              1768indexer=OrthogonalIndexer(selection, self.shape, self.metadata.chunk_grid)
              ->1769returnsync(
              1770self._async_array._get_selection(
              1771indexer=indexer, out=out, fields=fields, prototype=prototype1772 )
              1773 )
              File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/sync.py:128, insync(coro, loop, timeout)
              126loop0=asyncio.events.get_running_loop()
              127ifloop0isloop:
              -->128raiseSyncError("Calling sync() from within a running loop")
              129exceptRuntimeError:
              130passSyncError: Callingsync() fromwithinarunningloop

              Additional output

              No response

              Metadata

              Metadata

              Assignees

              No one assigned

                Labels

                bugPotential issues with the zarr-python library

                Type

                No type

                Projects

                Milestone

                Relationships

                None yet

                Development

                No branches or pull requests

                Issue actions

                , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
                Skip to content

                [v3] zarr.array from from an existing zarr.Array #2410

                Description

                @jhamman

                Zarr version

                3.0.0.beta

                Numcodecs version

                0.13

                Python Version

                3.11

                Operating System

                Mac

                Installation

                pip

                Description

                It used to be possible to create a one zarr array from another. This is currently broken but would be interested to bring back in a more optimized form using the underlying async array for streaming.

                Steps to reproduce

                In [24]: a=zarr.zeros((10000, 10000), chunks=(100,100), dtype='uint16',
                ...: store='a.zarr')
                In [25]: b=zarr.array(a, chunks=(100, 200), store='b.zarr')
                --------------------------------------------------------------------------SyncErrorTraceback (mostrecentcalllast)
                CellIn[25], line1---->1b=zarr.array(a, chunks=(100, 200), store='b.zarr')
                File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/api/synchronous.py:164, inarray(data, **kwargs)
                163defarray(data: NDArrayLike, **kwargs: Any) ->Array:
                -->164returnArray(sync(async_api.array(data=data, **kwargs)))
                File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/sync.py:141, insync(coro, loop, timeout)
                138return_result=next(iter(finished)).result()
                140ifisinstance(return_result, BaseException):
                -->141raisereturn_result142else:
                143returnreturn_resultFile~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/sync.py:100, in_runner(coro)
                95""" 96 Await a coroutine and return the result of running it. If awaiting the coroutine raises an 97 exception, the exception will be returned. 98 """99try:
                -->100returnawaitcoro101exceptExceptionasex:
                102returnexFile~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/api/asynchronous.py:529, inarray(data, **kwargs)
                526z=awaitcreate(**kwargs)
                528# fill with data-->529awaitz.setitem(slice(None), data)
                531returnzFile~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/array.py:880, inAsyncArray.setitem(self, selection, value, prototype)
                874prototype=default_buffer_prototype()
                875indexer=BasicIndexer(
                876selection,
                877shape=self.metadata.shape,
                878chunk_grid=self.metadata.chunk_grid,
                879 )
                -->880returnawaitself._set_selection(indexer, value, prototype=prototype)
                File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/array.py:853, inAsyncArray._set_selection(self, indexer, value, prototype, fields)
                850value_buffer=prototype.nd_buffer.from_ndarray_like(value)
                852# merging with existing data and encoding chunks-->853awaitself.codec_pipeline.write(
                854 [
                855 (
                856self.store_path/self.metadata.encode_chunk_key(chunk_coords),
                857self.metadata.get_chunk_spec(chunk_coords, self.order, prototype),
                858chunk_selection,
                859out_selection,
                860 )
                861forchunk_coords, chunk_selection, out_selectioninindexer862 ],
                863value_buffer,
                864drop_axes=indexer.drop_axes,
                865 )
                File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/codecs/pipeline.py:456, inBatchedCodecPipeline.write(self, batch_info, value, drop_axes)
                450asyncdefwrite(
                451self,
                452batch_info: Iterable[tuple[ByteSetter, ArraySpec, SelectorTuple, SelectorTuple]],
                453value: NDBuffer,
                454drop_axes: tuple[int, ...] = (),
                455 ) ->None:
                -->456awaitconcurrent_map(
                457 [
                458 (single_batch_info, value, drop_axes)
                459forsingle_batch_infoinbatched(batch_info, self.batch_size)
                460 ],
                461self.write_batch,
                462config.get("async.concurrency"),
                463 )
                File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/common.py:64, inconcurrent_map(items, func, limit)
                61asyncwithsem:
                62returnawaitfunc(*item)
                --->64returnawaitasyncio.gather(*[asyncio.ensure_future(run(item)) foriteminitems])
                File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/common.py:62, inconcurrent_map.<locals>.run(item)
                60asyncdefrun(item: tuple[Any]) ->V:
                61asyncwithsem:
                --->62returnawaitfunc(*item)
                File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/codecs/pipeline.py:374, inBatchedCodecPipeline.write_batch(self, batch_info, value, drop_axes)
                353chunk_bytes_batch=awaitconcurrent_map(
                354 [
                355 (
                (...)
                362config.get("async.concurrency"),
                363 )
                364chunk_array_batch=awaitself.decode_batch(
                365 [
                366 (chunk_bytes, chunk_spec)
                (...)
                370 ],
                371 )
                373chunk_array_batch= [
                -->374self._merge_chunk_array(
                375chunk_array, value, out_selection, chunk_spec, chunk_selection, drop_axes376 )
                377forchunk_array, (_, chunk_spec, chunk_selection, out_selection) inzip(
                378chunk_array_batch, batch_info, strict=False379 )
                380 ]
                382chunk_array_batch= [
                383None384ifchunk_arrayisNoneorchunk_array.all_equal(chunk_spec.fill_value)
                (...)
                388 )
                389 ]
                391chunk_bytes_batch=awaitself.encode_batch(
                392 [
                393 (chunk_array, chunk_spec)
                (...)
                397 ],
                398 )
                File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/codecs/pipeline.py:316, inBatchedCodecPipeline._merge_chunk_array(self, existing_chunk_array, value, out_selection, chunk_spec, chunk_selection, drop_axes)
                314chunk_value=value315else:
                -->316chunk_value=value[out_selection]
                317# handle missing singleton dimensions318ifdrop_axes!= ():
                File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/buffer/cpu.py:180, inNDBuffer.__getitem__(self, key)
                179def__getitem__(self, key: Any) ->Self:
                -->180returnself.__class__(np.asanyarray(self._data.__getitem__(key)))
                File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/array.py:1327, inArray.__getitem__(self, selection)
                1325returnself.vindex[cast(CoordinateSelection|MaskSelection, selection)]
                1326elifis_pure_orthogonal_indexing(pure_selection, self.ndim):
                ->1327returnself.get_orthogonal_selection(pure_selection, fields=fields)
                1328else:
                1329returnself.get_basic_selection(cast(BasicSelection, pure_selection), fields=fields)
                File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/_compat.py:43, in_deprecate_positional_args.<locals>._inner_deprecate_positional_args.<locals>.inner_f(*args, **kwargs)
                41extra_args=len(args) -len(all_args)
                42ifextra_args<=0:
                --->43returnf(*args, **kwargs)
                45# extra_args > 046args_msg= [
                47f"{name}={arg}"48forname, arginzip(kwonly_args[:extra_args], args[-extra_args:], strict=False)
                49 ]
                File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/array.py:1769, inArray.get_orthogonal_selection(self, selection, out, fields, prototype)
                1767prototype=default_buffer_prototype()
                1768indexer=OrthogonalIndexer(selection, self.shape, self.metadata.chunk_grid)
                ->1769returnsync(
                1770self._async_array._get_selection(
                1771indexer=indexer, out=out, fields=fields, prototype=prototype1772 )
                1773 )
                File~/miniforge3/envs/icechunk-demo/lib/python3.12/site-packages/zarr/core/sync.py:128, insync(coro, loop, timeout)
                126loop0=asyncio.events.get_running_loop()
                127ifloop0isloop:
                -->128raiseSyncError("Calling sync() from within a running loop")
                129exceptRuntimeError:
                130passSyncError: Callingsync() fromwithinarunningloop

                Additional output

                No response

                Metadata

                Metadata

                Assignees

                No one assigned

                  Labels

                  bugPotential issues with the zarr-python library

                  Type

                  No type

                  Projects

                  Milestone

                  Relationships

                  None yet

                  Development

                  No branches or pull requests

                  Issue actions