[Numpy-discussion] record arrays initialization
Moroney, Catherine M (388D)
Catherine.M.Moroney at jpl.nasa.gov
Wed May 2 17:45:44 EDT 2012
Thanks to Perry for some very useful off-list conversation. I realize that
I wasn't being clear at all in my earlier description of the problem so here it is
in a nutshell:
Find the best match in an array t(5000, 7) for a single vector e(7). Now scale
it up so e is (128, 512, 7) and I want to return a (128, 512) array of the t-identifiers
that are the best match for e. "Best match" is defined as the minimum Euclidean distance.
I'm going to try three ways: (a) brute force and lots of looping in python,
(b) constructing a function to find the match for a single instance of e and
vectorizing it, and (c) coding it in Fortran. I'll be curious to see the
Two smaller questions:
A) How do I most efficiently construct a record array from a single array?
I want to do the following, but it segfaults on me when i try to print b.
vtype = [("x", numpy.ndarray)]
a = numpy.arange(0, 16).reshape(4,4)
b = numpy.recarray((4), dtype=vtype, buf=a)
What is the most efficient way of constructing b from the values of a? In real-life,
a is (128*512*7) and I want b to be (128, 512) with the x component being a 7-value numpy array.
B) If I'm vectorizing a function ("single") to find the best match for
a single element of e within t, how do I pass the entire array t into
the function without having it parcelled down to its individual elements?
def single(elements, targets):
nlen = element.shape
nvec = targets.data.shape
x = element.reshape(1, nlen).repeat(nvec, axis=0)
diffs = ((x - targets.data)**2).sum(axis=1)
diffs = numpy.sqrt(diffs)
return numpy.argmin(diffs, axis=0)
multiple = numpy.vectorize(single)
x = multiple(all_elements, target)
where all_elements is similar to "b" in my first example, and target
is a 2-d array. The above code doesn't work because "target" gets reduced
to a single element when it gets down to "single" and I need to see the whole array
when I'm down in "single".
I found a work-around by encapsulating target into a single object and passing
in the object, but I'm curious if there's a better way of doing this.
I hope I've explained myself better this time around,
More information about the NumPy-Discussion