Hi, That is a little more complicated than I want, but it shows me the solution: Construct the array of the desired shape first, then fill it.
data = [1.0, 3,0] keys = [('a',1),('b',2)] # Convert to arrays for indexing data_array = array(data1) key_array = empty(len(keys),dtype=tuple) key_array[:] = keys[:] inds = argsort(data) data_array[:] = data[inds] key_array[:] = keys[inds] Thanks! Michael. On 20 Jun 2007, at 4:57 AM, Francesc Altet wrote: > El dc 20 de 06 del 2007 a les 01:38 -0700, en/na Michael McNeil Forbes > va escriure: >> Hi, >> >> I have a list of tuples that I am using as keys and I would like to >> sort this along with some other arrays using argsort. How can I do >> this? I would like to do something like: >> >> # These are constructed using lists because they accumulate using >> append() >> data = [1.0, 3,0] >> keys = [('a',1),('b',2)] >> >> # Convert to arrays for indexing >> data = array(data1) >> keys = array(keys) # <--Converts to a 2d array rather than 1d array >> of tuples . >> >> inds = argsort(data) >> data[:] = data[inds] >> keys[:] = keys[inds] >> >> It seems there should be some way of specifying to the array >> constructor not to 'descend' (perhaps by specifying the desired >> dimensions of the final array or something) but I cannot find a nice >> way around this. > > Here is a possible approach using recarrays: > > In [54]:data = [3.0, 1.0] > In [55]:keys = [('a',1),('b',2)] > In [56]:tmp=numpy.array(keys, dtype="S1,i4") > In [57]:dest=numpy.empty(shape=len(keys), dtype="S1,i4,f8") > In [58]:dest['f0'] = tmp['f0'] > In [59]:dest['f1'] = tmp['f1'] > In [60]:dest['f2'] = data > In [61]:dest > Out[61]: > array([('a', 1, 3.0), ('b', 2, 1.0)], > dtype=[('f0', '|S1'), ('f1', '<i4'), ('f2', '<f8')]) > In [62]:dest.sort(order='f2') > In [63]:dest > Out[63]: > array([('b', 2, 1.0), ('a', 1, 3.0)], > dtype=[('f0', '|S1'), ('f1', '<i4'), ('f2', '<f8')]) > > If you want to retrieve the keys and data from the dest recarray > afterwards, that's easy: > > In [111]:data2=dest['f2'].tolist() > In [112]:keys2=dest.getfield('S1,i4').tolist() > In [113]:data2 > Out[113]:[1.0, 3.0] > In [114]:keys2 > Out[114]:[('b', 2), ('a', 1)] > > Cheers, > > -- > Francesc Altet | Be careful about using the following code -- > Carabos Coop. V. | I've only proven that it works, > www.carabos.com | I haven't tested it. -- Donald Knuth _______________________________________________ Numpy-discussion mailing list Numpy-discussion@scipy.org http://projects.scipy.org/mailman/listinfo/numpy-discussion