[SciPy-user] indices, lists and arrays

Francesc Altet faltet@carabos....
Wed Jun 6 10:56:26 CDT 2007


El dc 06 de 06 del 2007 a les 17:46 +0200, en/na Emanuele Zattin va
escriure:
> 
> 
> On 6/6/07, Francesc Altet <faltet@carabos.com> wrote:
>         El dc 06 de 06 del 2007 a les 16:13 +0200, en/na Emanuele
>         Zattin va
>         escriure:
>         > i have something like this:
>         >
>         > sizes = ndimage.sum(bl_img, labels=bl_l, index=range(1,bl_n
>         +1))
>         > sizes = array(sizes) 
>         > bl_obj_indices = where(sizes<21)
>         > bl_l[bl_objects[bl_obj_indices]] = 0
>         >
>         > sizes was a list, but i converted it to an array in order to
>         use the
>         > function where on it
>         > where returns an array of arrays, something like (array([14,
>         17]),) 
>         > bl_objects is the output of ndimage.find_objects and is a
>         list. this
>         > means that the assignment on the last row of the proposed
>         code does
>         > not work.
>         > is there an elegant solution to solve the problem? 
>         
>         In order to use fancy indexing, you always need an array as
>         the base,
>         so, the next should do the trick:
>         
>         bl_l[array(bl_objects)[bl_obj_indices]] = 0
>         
>         or, for short:
>         
>         bl_l[array(bl_objects)[sizes<21]] = 0
> 
> Stupid me, i forgot to mention that i actually converted bl_objects to
> array before that... but still that does not work. it compains that
> arrays used as indices should be integers... but i can see that where
> returns a tuple... mmm 

That's strange.  Fancy indexing seems to happily accept tuples as well:

In [1]:import numpy
In [2]:a=numpy.arange(10)
In [3]:a[a>3]
Out[3]:array([4, 5, 6, 7, 8, 9])
In [4]:a[numpy.where(a>3)]
Out[4]:array([4, 5, 6, 7, 8, 9])
In [5]:numpy.where(a>3)
Out[5]:(array([4, 5, 6, 7, 8, 9]),)

Perhaps your bl_objects is multidimensional?  But even in this case,
this should work fine:

In [19]:a=numpy.arange(10).reshape(2,5)
In [20]:a
Out[20]:
array([[0, 1, 2, 3, 4],
       [5, 6, 7, 8, 9]])
In [21]:a[a>3]
Out[21]:array([4, 5, 6, 7, 8, 9])
In [22]:a[numpy.where(a>3)]
Out[22]:array([4, 5, 6, 7, 8, 9])

Which version of NumPy are you using?


-- 
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 SciPy-user mailing list