2017-08-17 109 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__方法被調用,這自然給人的數據集的機會,修改其內部數據。