无法修改较大数据集中的项目

时间:2019-02-21 23:49:42

标签: python numpy dataset hdf5 h5py

我的数据集由矩阵的多维数组组成。我正在尝试更改其中一个矩阵的值,但是即使重新分配了新值,我编写的代码仍会显示旧值:

import h5py
import numpy as np

f1 = h5py.File('myfile.h5', 'r+')
print("Keys: %s" % f1.keys())
print("old value is :", f1["myArray"][0][0][0])
f1["myArray"][0][0][0] = 100
f1.close()

f2 = h5py.File('myfile.h5', 'r')
print("Keys: %s" % f2.keys())
print("new value is :", f2["myArray"][0][0][0])
f2.close()

1 个答案:

答案 0 :(得分:0)

问题在于您如何编制索引。要执行所需的操作,您将需要写入项目[0,0,0](而不是[0][0][0])。以下代码可以实现您的预​​期目的:

import h5py
import numpy as np

file = h5py.File('myfile.h5', 'w')

file["myArray"] = np.arange(5*5*5).reshape(5,5,5)
print("old value is :", file["myArray"][0,0,0])

file["myArray"][0,0,0] = 100
print("new value is :", file["myArray"][0,0,0])

file.close()

(关闭/重新打开文件时也可以使用,为清楚起见,我省略了它)。这段代码输出:

old value is : 0
new value is : 100

请考虑使用Numpy's documentation on indexing以获得更多信息。


在阅读了文档之后,应该感到吃惊的是,您所做的没有用。因为

A = np.arange(5*5*5).reshape(5,5,5)
A[0][0][0] = 100
print(A[0,0,0])

输出100。之所以有效,是因为每次执行[0]时,您都会得到一个指向子数组(而不是副本)的指针。因此,修改此子数组的条目将修改基础数据(原始数组)。

我的猜测是,因为h5py写入光盘,所以第一次使用[0]会返回副本(此后将返回指针)。在此示例中证实了这种怀疑:

import h5py
import numpy as np

file = h5py.File('myfile.h5', 'w')
file["myArray"] = np.arange(5*5*5).reshape(5,5,5)

data = file["myArray"][0]
data[0,0] = 100
print(data[0,0])
print(file["myArray"][0,0,0])

file.close()

输出

100
0