[SciPy-user] filling array without loop...

fred fredmfp@gmail....
Sun Apr 22 13:47:33 CDT 2007

Anne Archibald a écrit :
> ca1 = array([VTK_HEXAHEDRON_NB_POINTS*ones((nz-1,ny-1,nx-1),dtype=int),
>                       k[:-1,:,:]*(nx*ny)+j[:,:-1,:]*nx+i[:,:,:-1],
>                       k[:-1,:,:]*(nx*ny)+j[:,:-1,:]*nx+i[:,:,1:],
>                       k[:-1,:,:]*(nx*ny)+j[:,1:,:]*nx+i[:,:,1:],
>                       k[:-1,:,:]*(nx*ny)+j[:,1:,:]*nx+i[:,:,:-1],
>                       k[1:,:,:]*(nx*ny)+j[:,:-1,:]*nx+i[:,:,:-1],
>                       k[1:,:,:]*(nx*ny)+j[:,:-1,:]*nx+i[:,:,1:],
>                       k[1:,:,:]*(nx*ny)+j[:,1:,:]*nx+i[:,:,1:],
>                       k[1:,:,:]*(nx*ny)+j[:,1:,:]*nx+i[:,:,:-1]], dtype=int)
Whaouh !

Many thanks, Anne !

I absolutely understand nothing, but I'll work hard on it ;-)

I think you are ready to answer to a more complex (at least, for me, of 
course) issue, Anne :-))))

Each array cell is a convolution that I wrote as a scalar product 
between KW, a weights filter vector, and input_data,
the "raw" data (3D); output_data is the filtered response given by the 

    def calc_output(self):
        from scipy import copy, inner, zeros
        nx, ny, nz = self.nx, self.ny, self.nz
        nvx, nvy, nvz = self.nvx, self.nvy, self.nvz
        nx_nvx, ny_nvy, nz_nvz = nx-nvx, ny-nvy, nz-nvz
        nvx1, nvy1, nvz1 = nvx+1, nvy+1, nvz+1
        KWsize = self.KW.size
        KW = self.KW
        data_input = self.input
        data_output = self.output = copy(data_input)
         for k1 in range(nvz, nz_nvz):
             for j1 in range(nvy, ny_nvy):
                 for i1 in range(nvx, nx_nvx):
                     data_output[i1,j1,k1] = inner(KW, \

These triple loops are _very_ CPU time consuming.

Is it possible to write this function without loop ?

If yes, you are my God, Anne ! :-))))




More information about the SciPy-user mailing list