[Numpy-tickets] [NumPy] #636: Faster array version of ndindex
NumPy
numpy-tickets@scipy....
Tue Dec 18 12:53:43 CST 2007
#636: Faster array version of ndindex
----------------------------+-----------------------------------------------
Reporter: jarrod.millman | Owner: jarrod.millman
Type: enhancement | Status: new
Priority: normal | Milestone: 1.0.5
Component: Other | Version: none
Severity: normal | Keywords:
----------------------------+-----------------------------------------------
The following is from an email from Jonathan Taylor:
I was needing an array representation of ndindex since ndindex only
gives an iterator but array(list(ndindex)) takes too long. There is
prob some obvious way to do this I am missing but if not feel free to
include this code which is much faster.
{{{
In [252]: time a=np.array(list(np.ndindex(10,10,10,10,10,10)))
CPU times: user 11.61 s, sys: 0.09 s, total: 11.70 s
Wall time: 11.82
In [253]: time a=ndtuples(10,10,10,10,10,10)
CPU times: user 0.32 s, sys: 0.21 s, total: 0.53 s
Wall time: 0.60
}}}
{{{
def ndtuples(*dims):
"""Fast implementation of array(list(ndindex(*dims)))."""
# Need a list because we will go through it in reverse popping
# off the size of the last dimension.
dims = list(dims)
# N will keep track of the current length of the indices.
N = dims.pop()
# At the beginning the current list of indices just ranges over the
# last dimension.
cur = np.arange(N)
cur = cur[:,np.newaxis]
while dims != []:
d = dims.pop()
# This repeats the current set of indices d times.
# e.g. [0,1,2] -> [0,1,2,0,1,2,...,0,1,2]
cur = np.kron(np.ones((d,1)),cur)
# This ranges over the new dimension and 'stretches' it by N.
# e.g. [0,1,2] -> [0,0,...,0,1,1,...,1,2,2,...,2]
front = np.arange(d).repeat(N)[:,np.newaxis]
# This puts these two together.
cur = np.column_stack((front,cur))
N *= d
return cur
}}}
--
Ticket URL: <http://scipy.org/scipy/numpy/ticket/636>
NumPy <http://projects.scipy.org/scipy/numpy>
The fundamental package needed for scientific computing with Python.
More information about the Numpy-tickets
mailing list