为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

尚方宝剑之说 2021-11-16 10:37:51
我的数据集由矩阵的多维数组组成。我正在尝试更改其中一个矩阵的值,但即使在我重新分配了新值后,我编写的代码仍然显示旧值:import h5pyimport numpy as npf1 = h5py.File('myfile.h5', 'r+')print("Keys: %s" % f1.keys())print("old value is :", f1["myArray"][0][0][0])f1["myArray"][0][0][0] = 100f1.close()f2 = h5py.File('myfile.h5', 'r')print("Keys: %s" % f2.keys())print("new value is :", f2["myArray"][0][0][0])f2.close()
查看完整描述

1 回答

?
Helenr

TA贡献1780条经验 获得超4个赞

问题在于你如何索引。要执行您想要的操作,您需要写入该项目[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 关于索引的文档以获取更多信息。


阅读文档后,您应该感到惊讶,您所做的并没有奏效。因为


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


查看完整回答
反对 回复 2021-11-16
  • 1 回答
  • 0 关注
  • 158 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信