首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何更新pytables中的Earray?

如何更新pytables中的Earray?
EN

Stack Overflow用户
提问于 2018-09-06 14:53:00
回答 1查看 701关注 0票数 0

我有一个太大而无法存储在内存中的np.array (34000,34000),因此我需要PyTables将其存储为一个Earray。由于内存的限制,我将矩阵乘法分解成分段乘法,然后附加到Earray中。

这里我有一个简单的例子,其中Earray由(300,30000)组成,其中每个元素都是9。我试图通过插入一个完整的数组来更新它。

代码语言:javascript
复制
 [[9. 9. 9. ... 9. 9. 9.]
 [9. 9. 9. ... 9. 9. 9.]
 [9. 9. 9. ... 9. 9. 9.]
 ...
 [9. 9. 9. ... 9. 9. 9.]
 [9. 9. 9. ... 9. 9. 9.]
 [9. 9. 9. ... 9. 9. 9.]]

但是,我需要不断更新数组元素。我意识到Earray应该重新分配工作,因为它具有从.setitems继承的tables.array方法。下面是一个简单的代码来说明我是如何更新行的。

我遇到了这样的问题,即调任在结束时不持续。

代码语言:javascript
复制
hdf5_epath = 'extendable.hdf5'
hdf5_update = tables.open_file(hdf5_epath, mode='r+')
extended_data = hdf5_update.root.data[:]

sess = tf.Session()
for each in range(len(extended_data)):
    print(extended_data[each])
    abc = tf.ones(34716, tf.float32)
    ones = sess.run(abc)
    extended_data[each] = ones

hdf5_update.close()

我是做错了什么,还是PyTables不适合这样的用例?

EN

回答 1

Stack Overflow用户

发布于 2018-12-04 21:27:59

我不熟悉TensorFlow,所以只能帮助处理代码中的Pytable调用。是的,您可以在EArray中添加或更新数据。我没有使用EArray.setitems()方法来修改数据。有一种更简单的方法;只需像使用Numpy索引那样索引EArray值。如果要向EArray添加数据(行),请使用EArray.append()方法。在Pytables站点上有这两种方法的例子。查看这些参考资料以获得一个简短的教程:

pytables.org:修改表中的数据

pytables.org:将数据附加到现有表

在您的代码中,extended_data是一个Numpy数组,hdf5_update.root.data[:]指向ondisk HDF5 EArray数据。这是一个副本,而不是一个视图。修改extended_data 并不会修改 hdf5_update.root.data[:]。这就是为什么数据不是持久的。

我创建了一个简单的示例来说明这是如何工作的。下面的代码将修改ondisk数据。以上输出将显示extended_datahdf5_update.root.data[:]在修改EArray后的值不同。修改了Ondisk数据。在内存中,数据不是。向下滚动代码以创建示例HDF5文件。

修改HDF5 EARRAY的HDF5代码:

代码语言:javascript
复制
import tables as tb, numpy as np
hdf5_epath = 'extendable.hdf5'
h5f = tb.open_file(hdf5_epath, mode='r+')

extended_data = h5f.root.MyData.X[:]

print (extended_data.dtype, extended_data.shape)

myarray = 9.*np.ones(3*300).reshape((3,300))

h5f.root.MyData.X[0:3, : ] = myarray 
print (extended_data[0,0], extended_data[2,299])
print (h5f.root.MyData.X[0,0], h5f.root.MyData.X[2,299])

h5f.root.MyData.X[-3:, : ] = myarray 
print (extended_data[-1,0], extended_data[-1,299])
print (h5f.root.MyData.X[-1,0], h5f.root.MyData.X[-1,299])

h5f.close()

用于创建上面使用的的HDF5的代码

运行此命令以创建上面使用的extendable.hdf5。我建议您在运行每个代码段之前和之后使用HDFView检查数据。

代码语言:javascript
复制
import tables as tb, numpy as np
hdf5_epath = 'extendable.hdf5'
h5f = tb.open_file(hdf5_epath, mode='a')
dataGroup = h5f.create_group(h5f.root, 'MyData')

myarray = np.arange(30.*300.).reshape((30,300))

X = h5f.create_earray(dataGroup,"X", obj=myarray)                  
print ('flavor =', X.flavor )
print ('dim=', X.ndim, ', rows = ', X.nrows)

myarray = np.arange(30*300+30*300,30*300,-1).reshape((30,300))

X.append( myarray )
print ('dim=', X.ndim, ', rows = ', X.nrows)

Y_1 = X.read( 0 )
print (Y_1.dtype, Y_1.shape)

print (Y_1[0,0])
print (Y_1[-1,-1])

Y_2 = X.read( 1 )
print (Y_2[0,0])
print (Y_2[-1,-1])

h5f.close()
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52206879

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档