[Numpy-discussion] slicing / indexing question

Anne Archibald aarchiba at physics.mcgill.ca
Wed Sep 22 14:22:50 EDT 2010


On 21 September 2010 19:20, Timothy W. Hilton <hilton at meteo.psu.edu> wrote:

> I have an 80x1200x1200 nd.array of floats this_par.  I have a
> 1200x1200 boolean array idx, and an 80-element float array pars.  For
> each element of idx that is True, I wish to replace the corresponding
> 80x1x1 slice of this_par with the elements of pars.
>
> I've tried lots of variations on the theme of
>>>>this_par[idx[np.newaxis, ...]] = pars[:, np.newaxis, np.newaxis]
> but so far, no dice.

How about this?


In [1]: A = np.zeros((2,3,5))

In [2]: B = np.array([1,2])

In [3]: C = np.zeros((3,5), dtype=np.bool)

In [4]: C[1,1] = True

In [5]: C[2,3] = True

In [6]: C
Out[6]:
array([[False, False, False, False, False],
       [False,  True, False, False, False],
       [False, False, False,  True, False]], dtype=bool)

In [7]: A[:,C] = B[:,np.newaxis]

In [8]: A
Out[8]:
array([[[ 0.,  0.,  0.,  0.,  0.],
        [ 0.,  1.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  1.,  0.]],

       [[ 0.,  0.,  0.,  0.,  0.],
        [ 0.,  2.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  2.,  0.]]])

The key is that indexing with C replaces the two axes C is indexing
with only one; boolean indexing necessarily flattens the relevant
axes. You can check this with (e.g.) A[:,C].shape.

Be careful with these "mixed" indexing modes (partly fancy indexing,
partly slicing) as they can sometimes seem to reorder your axes for
you:

In [16]: np.zeros((2,3,7))[:,np.ones(5,dtype=int),np.ones(5,dtype=int)].shape
Out[16]: (2, 5)

In [17]: np.zeros((2,3,7))[np.ones(5,dtype=int),:,np.ones(5,dtype=int)].shape
Out[17]: (5, 3)

In [18]: np.zeros((2,3,7))[np.ones(5,dtype=int),np.ones(5,dtype=int),:].shape
Out[18]: (5, 7)

Anne



More information about the NumPy-Discussion mailing list