Python 使用numpy创建大型阵列的最佳数据类型

Python 使用numpy创建大型阵列的最佳数据类型,python,arrays,image-processing,numpy,gdal,Python,Arrays,Image Processing,Numpy,Gdal,我希望将卫星图像中的像素值存储到阵列中。我一直在用 np.empty((image_width, image_length) 它适用于图像的较小子集,但当在整个图像(3858 x 3743)上使用它时,代码很快终止,我得到的只是一个零数组 我使用循环将图像值加载到数组中,并使用gdal打开图像 img = gdal.Open(os.path.join(fn + "\{0}".format(fname))).ReadAsArray() 但是当我包括print img_array时,我得到的结果

我希望将卫星图像中的像素值存储到阵列中。我一直在用

np.empty((image_width, image_length)
它适用于图像的较小子集,但当在整个图像(3858 x 3743)上使用它时,代码很快终止,我得到的只是一个零数组

我使用循环将图像值加载到数组中,并使用gdal打开图像

img = gdal.Open(os.path.join(fn + "\{0}".format(fname))).ReadAsArray()
但是当我包括
print img_array
时,我得到的结果只有零

我尝试了numpy文档中的几乎每一种数据类型,但始终得到相同的结果

numpy是否无法加载这么多值,或者是否有方法优化数组

我正在处理包含NDVI(十进制)值的8位tiff图像


谢谢

不确定您试图读取的图像类型,但对于radarsat-2图像,您可以执行以下操作:

dataset = gdal.Open("RADARSAT_2_CALIB:SIGMA0:" + inpath + "product.xml")
S_HH = dataset.GetRasterBand(1).ReadAsArray()
S_VV = dataset.GetRasterBand(2).ReadAsArray()
# gets the intensity  (Intensity = re**2+imag**2), and amplitude = sqrt(Intensity)
self.image_HH_I = numpy.real(S_HH)**2+numpy.imag(S_HH)**2
self.image_VV_I = numpy.real(S_VV)**2+numpy.imag(S_VV)**2
但这是专门针对该类型的图像的(在本例中,每个图像包含多个波段,因此我需要使用
GetRasterBand(i)
分别读取每个波段,而不是
ReadAsArray()
如果有一个特定的GDAL驱动程序用于您想要读取的图像类型,生活会变得非常简单

如果你能提供更多关于你想阅读的图片类型的信息,我可能会提供更具体的帮助

编辑:您是否尝试过类似的操作?(不确定这是否适用于tiff,或者标题的位数,因此出现了
something:


编辑:当使用64位python而不是32位python时,由于在使用32位python版本时2Gb内存错误,该问题得到解决。

最佳数据类型如果你有一堆8位像素,
uint8
可能是最好的数据类型,但是如果你有一堆32位浮点音频样本,那就不是很好了…@abarnert我使用的图像是8位TIFF。当我使用uint8时仍然返回零。@Dzinic你的图像的来源是什么?(编辑了我的答案,以显示我以前使用过的另一种东西,即在图像中阅读,但不确定for.tiff是否有效)我猜你使用的是陆地卫星图像?在这种情况下,我猜gdal应该有一个itI驱动程序。我不确定图像来自何处,但我知道它们的分辨率为5米。我可以使用gdal正确加载它们,但似乎当脚本占用的内存超过2GB时,我会收到一个
MemoryError
。而不是sure如果这是我的代码或我正在使用的32位python。@Dzinic一定要尝试使用64位python,使用32位python,在2Gb内存使用率下总是会出现内存错误(您使用的是linux吗?您有多少ram?)事实上,我昨天试过64位,它运行起来没有问题。32位带来的不同…谢谢你的建议。@Dzinic这能回答你的问题吗?或者你在使用64位时仍然有问题吗?
A=open(filename,"r")
B=numpy.fromfile(A,dtype='uint8')[something:].reshape(3858,3743)
C=B*1.0
A.close()