首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >一种将大型光栅数据输入PyTables的有效方法

一种将大型光栅数据输入PyTables的有效方法
EN

Stack Overflow用户
提问于 2014-03-07 12:31:58
回答 1查看 2.2K关注 0票数 11

我正在寻找一种高效的方法,将20 up大小的光栅数据文件(GeoTiff)填充到PyTables中,以便进行进一步的核心计算。

目前,我正在使用Gdal将其读取为numpy数组,并使用以下代码将numpy数组写入pytable:

代码语言:javascript
运行
复制
import gdal, numpy as np, tables as tb

inraster = gdal.Open('infile.tif').ReadAsArray().astype(np.float32)
f = tb.openFile('myhdf.h5','w')
dataset = f.createCArray(f.root, 'mydata', atom=tb.Float32Atom(),shape=np.shape(inraster)
dataset[:] = inraster
dataset.flush()
dataset.close()
f.close()
inraster = None

不幸的是,由于我的输入文件非常大,当将它作为numpy错误读取时,我的PC会显示内存错误。是否有其他方法将数据输入PyTables,或者有任何改进代码的建议?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-12 23:04:17

我没有geotiff文件,所以我摆弄了一个普通的tif文件。如果数据到pytable文件中,则可能必须省略形状中的3和写入过程中的片段。本质上,我在数组上循环,而没有一次将所有内容读取到内存中。您必须调整n_chunks,以便一次读取的大块不超过您的系统内存。

代码语言:javascript
运行
复制
ds=gdal.Open('infile.tif')

x_total,y_total=ds.RasterXSize,ds.RasterYSize

n_chunks=100

f = tb.openFile('myhdf.h5','w')
dataset = f.createCArray(f.root, 'mydata', atom=tb.Float32Atom(),shape=(3,y_total,x_total)


#prepare the chunk indices
x_offsets=linspace(0,x_total,n_chunks).astype(int)
x_offsets=zip(x_offsets[:-1],x_offsets[1:])
y_offsets=linspace(0,y_total,n_chunks).astype(int)
y_offsets=zip(y_offsets[:-1],y_offsets[1:])

for x1,x2 in x_offsets:
    for y1,y2 in y_offsets:
        dataset[:,y1:y2,x1:x2]=ds.ReadAsArray(xoff=x1,yoff=y1,xsize=x2-x1, ysize=y2-y1)
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22250197

复制
相关文章

相似问题

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