这是我的问题,它适用于案例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形状,因为我的工作方式更多尺寸/尺寸!)
答案 0 :(得分:2)
在进行作业时不要使用链式索引。而不是
f['2'][0][0] = data
使用
f['2'][0,0] = data
f['2'][0]
返回一个新数组,其数据已从f['2']
复制。 f['2'][0][0] = data
将data
分配给此新数组。该作业对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
的{{1}}方法,这自然会为数据集提供修改其内部数据的机会。