Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用numpy中的矢量化操作从大型二维阵列恢复图像有没有更快的方法_Python_Arrays_Numpy - Fatal编程技术网

Python 使用numpy中的矢量化操作从大型二维阵列恢复图像有没有更快的方法

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行开始重复相同的操作 这是我的

我有一个尺寸为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
    a
    numpy
    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万?这样指定形状会将其更改到位,这意味着引用对象的任何变量都会看到更改。Try
    A=np.arange(4);B=A;B.形状=2,2;A
    哦,我的糟糕..我忘了我的数组很大。。其余的似乎没问题。现在应该工作得更快了。
    np.split
    split
    列表上迭代,执行类似于
    [pixelDat[i:j,;]的操作,用于zip中的i,j(开始,停止)]
    。即连续地获取阵列的切片。通过在一次迭代中进行拆分和重塑,您可能会节省一些时间。另一方面,这可能会使代码更加混乱。@hpaulj谢谢,很高兴知道这一点。我养成了向后弯腰的习惯,以便能够在列表理解上使用“快速”
    split
    在这种特殊情况下,它可能不值得玩弄。可以有多少块250K元素?