Python 使用numpy中的矢量化操作从大型二维阵列恢复图像有没有更快的方法
我有一个尺寸为n x 1008的大型二维阵列(通常为0.5到2GB)。此数组包含多个图像,数组中的值实际上是像素值。基本上,恢复这些图像的方法如下Python 使用numpy中的矢量化操作从大型二维阵列恢复图像有没有更快的方法,python,arrays,numpy,Python,Arrays,Numpy,我有一个尺寸为n x 1008的大型二维阵列(通常为0.5到2GB)。此数组包含多个图像,数组中的值实际上是像素值。基本上,恢复这些图像的方法如下 开始迭代数组 取前260行,即有260*1008=262080个值 对于第261行,仅取前64个值(该行中的其余值为垃圾值)。因此,现在我们有262144个像素值 将所有这些值转储到一个一维数组中,说Dump,然后做np。重塑(Dump,(512512)),以获得图像。请注意,512x512=262144 再次从第262行开始重复相同的操作 这是我的
counter=0
dump=np.array([], dtype=np.uint16)
#pixelDat is the array shaped n x 1008 containing the pixel values
for j in xrange(len(pixelDat)):
#Check if it is the last row for a particular image
if(j == (260*(counter+1)+ counter)):
counter += 1
dump=np.append(dump, pixelDat[j][:64])
#Reshape dump to form the image and write it to a fits file
hdu = fits.PrimaryHDU(np.reshape(dump, (512,512)))
hdu.writeto('img'+str("{0:0>4}".format(counter))+'.fits', clobber=True)
#Clear dump to enable formation of next image
dump=np.array([], dtype=np.uint16)
else:
dump=np.append(dump, pixelDat[j])
我一直在想是否有办法加快整个过程。我想到的第一件事是使用矢量化numpy操作。然而,我不太确定如何在这种情况下应用它
注:不要担心配合和hdu部件。它只是为我的图像创建一个.fits文件。这里尝试使用展平和
np.split
。它避免了复制数据
def chop_up(pixelDat):
sh = pixelDat.shape
try:
# since the array is large we do not want a copy
# the next line will succeed only if we can reshape in-place
pixelDat.shape = -1
except:
return False # user must resort to other method
N = len(pixelDat)
split = (np.arange(0, N, 261*1008)[:, None] + (0, 512*512)).ravel()[1:]
if split[-1] > N:
split = split[:-2]
result = [x.reshape(512,512) for x in np.split(pixelDat, split) if len(x) == 512*512]
pixelDat.shape = sh
return result
是
pixelDat
anumpy
array吗?@PaulPanzer pixelDat是一个numpy array我已经尝试过了,只是切块,不适合。让我知道它是否适合你。重复的np.append
很慢。最好是alist.append(…)
,然后构建dump=np.array(alist,…)
一次。@hpaulj好的,我会尝试一下。你认为用Cython写同样的东西会有帮助吗?我不理解你代码的某些地方。split=(np.arange(0,N,261*1008)[:,None]+(0,512*512)).ravel()[1:]总是给出相同的值,不知道N的值是什么。那为什么不硬编码呢?pixelDat.shape=sh(你需要这条线做什么?似乎没有用,因为我们只返回结果)@AnirbanDutta没有,我只是检查了一下。您是否尝试了足够大的N值?比如100万对200万?这样指定形状会将其更改到位,这意味着引用对象的任何变量都会看到更改。TryA=np.arange(4);B=A;B.形状=2,2;A
哦,我的糟糕..我忘了我的数组很大。。其余的似乎没问题。现在应该工作得更快了。np.split
在split
列表上迭代,执行类似于[pixelDat[i:j,;]的操作,用于zip中的i,j(开始,停止)]
。即连续地获取阵列的切片。通过在一次迭代中进行拆分和重塑,您可能会节省一些时间。另一方面,这可能会使代码更加混乱。@hpaulj谢谢,很高兴知道这一点。我养成了向后弯腰的习惯,以便能够在列表理解上使用“快速”split
在这种特殊情况下,它可能不值得玩弄。可以有多少块250K元素?