[Numpy-discussion] Matlab -> NumPy translation and indexing

Sturla Molden sturla at molden.no
Wed Mar 14 11:11:43 EDT 2007


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.

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





More information about the NumPy-Discussion mailing list