【问题标题】:python h5py bug when feeding multidimensional dataset馈送多维数据集时的python h5py错误
【发布时间】:2017-08-18 03:23:04
【问题描述】:

这是我的问题,它适用于案例 1,不适用于案例 2:

import h5py
import numpy as np

data = np.random.randint(0,256,(5,), np.uint8)

f = h5py.File('test.h5','w')
f.create_dataset('1',(3,5), np.uint8)
f.create_dataset('2',(1,3,5), np.uint8)

print("case 1 before:\n",f['1'].value)
# case 1 before:
#  [[0 0 0 0 0]
#  [0 0 0 0 0]
#  [0 0 0 0 0]]

f['1'][0] = data
print("case 1 after:\n",f['1'].value)
# case 1 after:
#  [[ 75 215 125 175 193]
#  [  0   0   0   0   0]
#  [  0   0   0   0   0]]

print()
print()

print("case 2 before:\n",f['2'].value)
# case 2 before:
#  [[[0 0 0 0 0]
#   [0 0 0 0 0]
#   [0 0 0 0 0]]]

f['2'][0][0] = data
print("case 2 after:\n",f['2'].value)
# case 2 after:
#  [[[0 0 0 0 0]
#   [0 0 0 0 0]
#   [0 0 0 0 0]]]

有人可以向我解释我做错了什么吗? (请不要建议创建一个形状等于我的数据集形状的 np.array,因为我使用的维度/大小更多!!)

【问题讨论】:

  • “它不起作用”是报告问题的不好方法。为了帮助我,我必须重复你的计算,并亲自看看它会产生什么错误或坏结果。我不应该那样做。

标签: python h5py


【解决方案1】:

在进行分配时不要使用链式索引。而不是

f['2'][0][0] = data

使用

f['2'][0,0] = data

f['2'][0] 返回一个新数组,其数据复制来自f['2']f['2'][0][0] = datadata 分配给这个新数组。分配对f['2'] 没有影响。

相比之下,f['2'][0,0] = data 修改了f['2']


在后台,请记住 foo[x] 调用 foo.__getitem__(x)。 和foo[x] = y 调用foo.__setitem__(x, y)

所以f['2'][0][0] = data 打电话

f.__getitem__('2').__getitem__(0).__setitem(0, data)
  • f.__getitem__('2') 返回一个Dataset
  • f.__getitem__('2').__getitem__(0) 返回一个 NumPy 数组
  • f.__getitem__('2').__getitem__(0).__setitem(0, data) 修改了 NumPy 数组

f['2'][0,0] = data 调用

f.__getitem__('2').__setitem__((0,0), data)

现在调用的是 Dataset__setitem__ 方法,这自然而然地为 Dataset 提供了修改其内部数据的机会。

【讨论】:

    猜你喜欢
    • 2021-01-02
    • 2020-11-09
    • 1970-01-01
    • 2015-06-25
    • 1970-01-01
    • 2017-03-29
    • 2014-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多