簡體   English   中英

饋入多維數據集時的python h5py錯誤

[英]python h5py bug when feeding multidimensional dataset

這是我的問題,它在情況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.__getitem__(x) ,請記住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提供了修改其內部數據的機會。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM