【问题标题】:Getting a view of a zarr array slice获取 zarr 数组切片的视图
【发布时间】:2020-11-20 05:23:09
【问题描述】:

我想生成一个指向磁盘上 zarr 数组的 part 的 zarr 数组,类似于 sliced = np_arr[5] 如何让我看到 np_arr,这样可以修改 @ 中的数据987654323@修改np_arr中的数据。示例代码:

import matplotlib.pyplot as plt
import numpy as np
import zarr


arr = zarr.open(
    'temp.zarr',
    mode='a',
    shape=(4, 32, 32),
    chunks=(1, 16, 16),
    dtype=np.float32,
)
arr[:] = np.random.random((4, 32, 32))

fig, ax = plt.subplots(1, 2)
arr[2, ...] = 0  # works fine, "wipes" slice 2
ax[0].imshow(arr[2])  # all 0s

arr_slice = arr[1]  # returns a NumPy array — loses ties to zarr on disk
arr_slice[:] = 0
ax[1].imshow(arr[1])  # no surprises — shows original random data

plt.show()

我可以写什么来代替arr_slice = arr[1] 使arr_slice 成为磁盘上arr 数组的(可写)视图?

【问题讨论】:

    标签: python numpy zarr


    【解决方案1】:

    TensorStore 库是专门为此设计的 --- 所有索引操作都会产生惰性视图:

    import tensorstore as ts
    import numpy as np
    arr = ts.open({
      'driver': 'zarr',
      'kvstore': {
        'driver': 'file',
        'path': '.',
      },
      'path': 'temp.zarr',
      'metadata': {
        'dtype': '<f4',
        'shape': [4, 32, 32],
        'chunks': [1, 16, 16],
        'order': 'C',
        'compressor': None,
        'filters': None,
        'fill_value': None,
      },
    }, create=True).result()
    arr[1] = 42  # Overwrites, just like numpy/zarr library
    view = arr[1] # Returns a lazy view, no I/O performed
    np.array(view) # Reads from the view
    # Returns JSON spec that can be passed to `ts.open` to reopen the view.
    view.spec().to_json()
    

    您可以在此处阅读有关这些惰性视图基础的“索引转换”机制的更多信息: https://google.github.io/tensorstore/index_space.html#index-transform https://google.github.io/tensorstore/python/indexing.html

    免责声明:我是 TensorStore 的作者。

    【讨论】:

    • 谢谢杰里米! ?
    【解决方案2】:

    一种方法是使用自定义商店对象。您可以继承 DirectoryStore 或您的数据所在的任何其他基本存储并覆盖 getitem / setitem 方法。这可能比您希望的要难。

    更好的选择是复制 Xarray 的 LazilyIndexedArray 类型,这是由 Stephan Hoyer 编写的魔法:https://github.com/pydata/xarray/blob/master/xarray/core/indexing.py#L516。 我认为这些正是你想要的。它们不是 Xarray 的公共 API 的一部分,但 IMO 它们非常有用,实际上应该放在一个独立的包中。

    这里也有很好的相关博客文章: https://medium.com/informatics-lab/creating-a-data-format-for-high-momentum-datasets-a394fa48b671

    【讨论】:

    • 谢谢!这确实比我希望的要难。 ? Jeremy 的库可能是我现在要使用的。你认为有机会重新审视 zarr-python 急切的 getitem 设计吗?如果是这样,我会提出一个问题,但我意识到这是一个巨大的设计变更。但它可能是在创建时设置的属性,lazy=False(默认)......但无论如何,博客文章和链接非常有用。 ?
    • 对于未来的代码考古学家,更多讨论在 Twitter:twitter.com/shoyer/status/1331020787155828738
    猜你喜欢
    • 2016-08-26
    • 1970-01-01
    • 1970-01-01
    • 2018-06-02
    • 2012-11-10
    • 2017-04-29
    • 2016-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多