[Numpy-discussion] Matlab -> NumPy translation and indexing
Timothy Hochberg
tim.hochberg at ieee.org
Wed Mar 14 13:09:12 EDT 2007
On 3/14/07, Sturla Molden <sturla at molden.no> wrote:
>
> On 3/14/2007 2:46 PM, Robert Cimrman wrote:
>
> > a = []
> > while ...
> > a.append( scalar )
> > a = array( a )
>
>
> While it may help, growing Python lists is also an O(N) process.
This may just be a terminology problem, but just to be clear, appending to a
Python list is amortized (on average) constant time (O(1)), not O(N).
One can reduce the amount of allocations by preallocating an ndarray of
> a certain size (e.g. 1024 scalars), filling it up, and storing it in a
> linked list. Finally, the stored arrays are retrieved as a single
> contiguous array. Example code below (cf. class scalar_list).
>
>
> Sturla Molden
>
>
>
>
> import numpy
>
> class ndarray_list:
>
> """ a single linked list of numpy ndarrays."""
>
> class node:
> def __init__(self, data):
> self.next = None
> self.data = data
>
> def __init__(self):
> self.head = None
> self.tail = None
> self.len = 0
>
> def append(self, data):
> tmp = self.node(data)
> if self.tail == None:
> self.tail = tmp
> self.head = tmp
> self.len = len(data)
> else:
> self.tail.next = tmp
> self.tail = tmp
> self.len += len(data)
>
> def length(self): return self.len
>
> def flatten(self, dtype=float):
> tmp = numpy.empty(self.len, dtype=dtype)
> cur = self.head
> idx0 = 0
> while cur:
> tmp[idx0:idx0+len(cur.data)] = cur.data
> idx0 += len(cur.data)
> cur = cur.next
> return tmp
>
>
> class scalar_list:
>
> """ a single linked list of numpy scalars."""
>
> def __init__(self, size=1024, dtype=float):
> self.cur = 0
> self.size = size
> self.dtype = dtype
> self.arr = numpy.empty(size,dtype)
> self.arrlist = ndarray_list()
>
> def append(self, scalar):
> cur = self.cur
> self.arr[cur] = scalar
> self.cur += 1
> if self.cur == self.size:
> self.arrlist.append(self.arr)
> self.arr = numpy.empty(self.size,self.dtype)
> self.cur = 0
>
> def array(self):
> if self.cur: self.arrlist.append(self.arr[:self.cur])
> retval = self.arrlist.flatten(self.dtype)
> self.cur = 0
> self.arr = numpy.empty(self.size,self.dtype)
> self.arrlist = ndarray_list()
> self.arrlist.append(retval.copy())
> return retval
>
>
> _______________________________________________
> Numpy-discussion mailing list
> Numpy-discussion at scipy.org
> http://projects.scipy.org/mailman/listinfo/numpy-discussion
>
--
//=][=\\
tim.hochberg at ieee.org
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/numpy-discussion/attachments/20070314/d6ecbf88/attachment.html>
More information about the NumPy-Discussion
mailing list