是否可以使用gdal的write array逐行编写数据,而不是创建和提供整个数组?
创建大小为(5053998357)的numpy数组时遇到了MemoryError
。我想我可以绕过这件事,但我不想把事情复杂化
>>> import numpy
>>> cols = 50539
>>> rows = 98357
>>> a1 = np.zeros((cols,rows))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'np' is not defined
>>> import numpy as np
>>> a1 = np.zeros((cols,rows))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
MemoryError
更新: 最后,我使用Abudis的解决方案和一个稀疏矩阵相结合,在这个矩阵中我保存了点,将每一行作为一个“密集”或标准矩阵取出。欢迎评论。
dataset = driver.Create(filename, cols, rows, number_of_bands, band_type)
band = dataset.GetRasterBand(1)
offset = 1 # i.e. the number of rows to write with each iteration
# values, pixel_x, and pixel_y defined earlier in my script
data = scipy.sparse.csr_matrix((values,(pixel_y,pixel_x)),dtype=float)
# iterate data writing for each row in data sparse array
for i in range(data.shape[0]):
data_row = data[i,:].todense() # output row of sparse array as standard array
band.WriteArray(data_row,0,offset*i)
band.SetNoDataValue(NULL_VALUE)
band.FlushCache()
这里并不是真正的专家,但看起来这很管用。所以,诀窍是使用WriteArray方法的
yoff
参数。这样就可以将数据分块写入文件。我们基本上只是在写入下一块数据时设置偏移量。这将生成50539x1000像素的tiff文件。如果您真的需要98357行,我想您可以将
offset
值设置为1,将rows
设置为98357。理论上它应该可以工作,因为它工作在更小的阵列上(10×20像素)。编辑:不要忘记将
range(10)
更改为range(98357)
或xrange(98357)
相关问题 更多 >
编程相关推荐