[Numpy-discussion] trying to speed up the following....

Robert Kern robert.kern@gmail....
Tue Mar 24 18:39:49 CDT 2009


On Tue, Mar 24, 2009 at 18:29, Brennan Williams
<brennan.williams@visualreservoir.com> wrote:
> I have an array (porvatt.yarray) of ni*nj*nk values.
> I want to create two further arrays.
>
> activeatt.yarray is of size ni*nj*nk and is a pointer array to an active
> cell number. If a cell is inactive then its activeatt.yarray value will be 0
>
> ijkatt.yarray is of size nactive, the number of active cells (which I
> already know). ijkatt.yarray holds the ijk cell number for each active cell.
>
>
> My code looks something like...
>
>           activeatt.yarray=zeros(ncells,dtype=int)
>           ijkatt.yarray=zeros(nactivecells,dtype=int)
>
>            iactive=-1
>            ni=currentgrid.ni
>            nj=currentgrid.nj
>            nk=currentgrid.nk
>            for ijk in range(0,ni*nj*nk):
>              if porvatt.yarray[ijk]>0:
>                iactive+=1
>                activeatt.yarray[ijk]=iactive
>                ijkatt.yarray[iactive]=ijk
>
> I may often have a million+ cells.
> So the code above is slow.
> How can I speed it up?

mask = (porvatt.yarray.flat > 0)
ijkatt.yarray = np.nonzero(mask)

# This is not what your code does, but what I think you want.
# Where porvatt.yarray is inactive, activeatt.yarray is -1.
# 0 might be an active cell.
activeatt.yarray = np.empty(ncells, dtype=int)
activeatt.yarray.fill(-1)
activeatt.yarray[mask] = ijkatt.yarray


-- 
Robert Kern

"I have come to believe that the whole world is an enigma, a harmless
enigma that is made terrible by our own mad attempt to interpret it as
though it had an underlying truth."
  -- Umberto Eco


More information about the Numpy-discussion mailing list