本站消息

站长简介/公众号


站长简介:高级软件工程师,曾在阿里云,每日优鲜从事全栈开发工作,利用周末时间开发出本站,欢迎关注我的微信公众号:程序员总部,程序员的家,探索程序员的人生之路!分享IT最新技术,关注行业最新动向,让你永不落伍。了解同行们的工资,生活工作中的酸甜苦辣,谋求程序员的最终出路!

  价值13000svip视频教程,python大神匠心打造,零基础python开发工程师视频教程全套,基础+进阶+项目实战,包含课件和源码

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

一次调整两个轴的大小 h5py

发布于2021-10-15 00:22     阅读(616)     评论(0)     点赞(10)     收藏(5)



有没有办法resize通过附加新数据来连接两个轴?我能够使用resizemaxshape关注h5py Docs 中的 Docs将新数据附加到一个轴上但是我现在尝试的是使用与附加到一个轴相同的逻辑将数据一次附加到两个轴。但我得到的是一个TypeError: Can't broadcast (10000, 500, 2) -> (10000, 1000, 2). 这可能是由于块的大小,但无法弄清楚。任何建议这是我迄今为止尝试过的:

def create_hdf5_file(name, path, shape, chunks = None):
    """create a hdf5 file given a path, shape and chunks.
    If chunks is not given file will be created without
    any chunk. Default chunks  is equal to False. The file 
    will be compressed as gzip with a level of compression equals
    to 4. This function will append data to the hdf5 file"""

    with h5py.File(str(path+'/'+name+'.hdf5'), 'w') as f:
        dset = f.create_dataset(str(name), compression = 'gzip', shape= (shape), chunks= (chunks), \
            maxshape = (None, None, shape[2]))
        n = 10**5 # size for axis 0
        #m = 5*10**3 size for axis 1
        while dset.shape[0] < n: # and dset.shape[1] < m:
            dset.resize(dset.shape[0]+10**4, axis=0)
            #dset.resize(dset.shape[1]+5*10**2, axis = 1)
            dset[-10**4:] = np.random.randint(2, size=(10**4, shape[1], shape[2]))
            #dset[-5*10**2:] = np.random.randint(2, size =(shape[0], 5*10**2, shape[2]))
            print(dset.shape)
        print('Final dataset size: {}'.format(dset.shape))
        print('Chunks size: {}'.format(dset.chunks))
    print('HDF5 file created as: {}'.format(str(name)+'.hdf5'))

if __name__ == "__main__":
    create_hdf5_file(name='test',path='/home/neither/Desktop', \
    shape = (10000, 500,2), chunks= (1000,5000,2)) 

我评论了我在将数据附加到新轴时尝试的内容。但我得到了以前的错误。将数据附加到轴 0 可以按预期工作,但是当尝试对两个轴执行相同操作时失败。


解决方案


写入可调整大小dataset就像写入 numpy 数组 - 您必须指定切片的正确大小 - 在所有维度上。

在二维展开时,需要小心地正确填充所有块。您不仅要添加行,还要添加列:

dset = f.create_dataset(str(name),...
    maxshape = (None, None, shape[2]))
dset[...] = np.ones(shape)     # initial fill
print(dset.shape)
for i in range(2,4):
    dset.resize(dset.shape[0]+shape[0], axis=0)
    dset[-shape[0]:, :, :] = np.ones((shape[0], dset.shape[1], shape[2]))*i
    # add an axis 0 block and fill that
    print(dset.shape)
    for j in range(2):
        dset.resize(dset.shape[1]+shape[1], axis = 1)
        dset[-shape[0]:, -shape[1]:, : ] = np.ones(shape)*(i+j)
        # add an axis 1 block and fill that
        print(dset.shape)

结果打印:

(1000, 500, 2)
(2000, 500, 2)
(2000, 1000, 2)
(2000, 1500, 2)
(3000, 1500, 2)
(3000, 2000, 2)
(3000, 2500, 2)
Final dataset size: (3000, 2500, 2)

但我没有填满所有扩展的空间。

shape = (3,2,1)

(3, 2, 1)
(6, 2, 1)
(6, 4, 1)
(6, 6, 1)
(9, 6, 1)
(9, 8, 1)
(9, 10, 1)
Final dataset size: (9, 10, 1)
Chunks size: (3, 2, 1)

和实际数据 print(np.squeeze(dset[...]))

[[1 1 0 0 0 0 0 0 0 0]
 [1 1 0 0 0 0 0 0 0 0]
 [1 1 0 0 0 0 0 0 0 0]
 [2 2 2 2 3 3 0 0 0 0]
 [2 2 2 2 3 3 0 0 0 0]
 [2 2 2 2 3 3 0 0 0 0]
 [3 3 3 3 3 3 3 3 4 4]
 [3 3 3 3 3 3 3 3 4 4]
 [3 3 3 3 3 3 3 3 4 4]]

我调整了大小但没有明确填充的 0 填充块。







所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:https://www.pythonheidong.com/blog/article/1059597/9534daa3605c666fc874/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

10 0
收藏该文
已收藏

评论内容:(最多支持255个字符)