# Dynamically growing numarray array.

Robert Kern robert.kern at gmail.com
Wed Mar 22 21:51:45 CET 2006

```Ivan Vinogradov wrote:
> Hello All,
>
> this seems like a trivial problem, but I just can't find an elegant
> solution neither by myself, nor with google's help.
>
> I'd like to be able to keep an array representing coordinates for a
> system of points.
> Since I'd like to operate on each point's coordinates individually,
> for speed and ufuncs
> numarray fits the bill perfectly, especially since system.coordinates
> [4] would return proper vector for a 5th point.

BTW, numpy is replacing numarray, so if you're just getting started, you will
probably want to be using numpy.

http://numeric.scipy.org

> To start, read the coordinates from a text file and add them to our
> array one by one.
> Here it gets un-elegant and probably wasteful for a large number of
> points, by converting the whole array to a list only to use append
> method and then convert it back to array(sample code below). Also,
> there is potential need to add more points later on.

Well, you can accumulate points in a list, and them concatenate them wholesale
when you are done. Something like the following (untested):

import numpy
a1 = ... # some pre-existing array of points
f = open('mypoints.txt')
newpoints = []
for point in points_from_file(f):
newpoints.append(point)
f.close()
a1 = numpy.vstack((a1, newpoints))

Doing the "a1 = numpy.vstack(...)" for each point is rather slow.

numpy arrays do have a .resize() method, but it's not very safe and probably
just as slow as doing numpy.vstack() for each new point. Now, you could do a
preallocation strategy like lists do internally, but it's probably not worth it.

--
Robert Kern
robert.kern at gmail.com

"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

```