[Numpy-discussion] record arrays and vectorizing

Aronne Merrelli aronne.merrelli at gmail.com
Wed May 2 17:54:10 EDT 2012


On Wed, May 2, 2012 at 1:06 PM, Moroney, Catherine M (388D)
<Catherine.M.Moroney at jpl.nasa.gov> wrote:
> Hello,
>
> Can somebody give me some hints as to how to code up this function
> in pure python, rather than dropping down to Fortran?
>
> I will want to compare a 7-element vector (called "element") to a large list of similarly-dimensioned
> vectors (called "target", and pick out the vector in "target" that is the closest to "element"
> (determined by minimizing the Euclidean distance).
>
> For instance, in (slow) brute force form it would look like:
>
> element = numpy.array([1, 2, 3, 4, 5, 6, 7])
> target  = numpy.array(range(0, 49)).reshape(7,7)*0.1
>
> min_length = 9999.0
> min_index  =
> for i in xrange(0, 7):
>   distance = (element-target)**2
>   distance = numpy.sqrt(distance.sum())
>   if (distance < min_length):
>      min_length = distance
>      min_index  = i
>

If you are just trying to find the index to the vector in "target"
that is closest to element, then I think the default broadcasting
would work fine. Here is an example that should work (the broadcasting
is done for the subtraction element-targets):

In [39]: element = np.arange(1,8)
In [40]: targets = np.random.uniform(0,8,(1000,7))
In [41]: distance_squared = ((element-targets)**2).sum(1)
In [42]: min_index = distance_squared.argmin()
In [43]: element
Out[43]: array([1, 2, 3, 4, 5, 6, 7])
In [44]: targets[min_index,:]
Out[44]:
array([ 1.93625981,  2.56137284,  2.23395169,  4.15215253,  3.96478248,
        5.21829915,  5.13049489])

Note - depending on the number of vectors in targets, it might be
better to have everything transposed if you are really worried about
the timing; you'd need to try that for your particular case.

Hope that helps,
Aronne



More information about the NumPy-Discussion mailing list