[Numpy-discussion] Suppressing "nesting" (recursion, descent) in array construction.

Michael McNeil Forbes mforbes at physics.ubc.ca
Wed Jun 20 15:43:27 EDT 2007


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




More information about the NumPy-Discussion mailing list