Python H5py 在馈送多维数据集时出现错误



这是我的问题,它适用于情况 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形状,因为我使用更多的尺寸/大小!!

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

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__方法,这自然给了数据集修改其内部数据的机会。

最新更新