2017-08-17 71 views
1

在这里蟒蛇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形状,因为我的工作方式更多维数/大小!!)

+1

'不起作用'是报告问题的不好方法。为了帮助我必须重复您的计算,并亲自查看它产生的错误或错误结果。我不应该那样做。 – hpaulj

回答

2

在进行分配时不要使用链接索引。取而代之的

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