[Numpy-discussion] Selected and altering a submatrix

Steve Lianoglou lists.steve at arachnedesign.net
Tue Jan 30 08:44:14 CST 2007


Hi all,

Thank you for your replies ... my question was initially unclear in  
that I knew that using normal slicing would do the trick, but it was  
rather a list of indices that couldn't be represented as a slice that  
was bugging me. Luckily, Robert's solution solves this problem for  
the general case.

Thanks for the help,
-steve



On Jan 30, 2007, at 12:09 AM, Robert Kern wrote:

> Steve Lianoglou wrote:
>> ===
>> import numpy as N
>> mat = N.zeros((10,10))
>> rows = [0,1,2]
>> cols = [4,5,6]
>>
>> for row in rows:
>>     mat[row,cols] += 1
>>
>> ====
>>
>> I found something on the lists from a few years back that was in
>> reference to numeric or numarray that suggested doing some gymnastics
>> with take/put, but it still seemed as if there was no way to slice
>> out this view of a matrix w/o making a copy.
>
> Actually, it's pretty easy these days to handle the general case  
> (the other
> posts have sufficiently covered the case where your rows and  
> columns are
> representable by slices). Just make sure that the index arrays row  
> and cols are
> the right shape. Since you want mat[rows, cols] to be an array of  
> shape
> (len(rows), len(cols)), each index should be of that shape *or*  
> they need to
> broadcast to that shape. Thus, you could either have this:
>
>   rows = [[0, 0, 0],
>           [1, 1, 1],
>           [2, 2, 2]]
>   cols = [[4, 5, 6],
>           [4, 5, 6],
>           [4, 5, 6]]
>
> or you could have this:
>
>   rows = [[0], [1], [2]]
>   cols = [4, 5, 6]
>
> Here is a slightly more complicated example:
>
>
> In [25]: from numpy import *
>
> In [26]: A = arange(6*6).reshape((6,6))
>
> In [27]: rows = array([0, 2, 3])[:,newaxis]
>
> In [28]: cols = array([5, 4, 1])
>
> In [29]: A[rows, cols]
> Out[29]:
> array([[ 5,  4,  1],
>        [17, 16, 13],
>        [23, 22, 19]])
>
> In [30]: A
> Out[30]:
> array([[ 0,  1,  2,  3,  4,  5],
>        [ 6,  7,  8,  9, 10, 11],
>        [12, 13, 14, 15, 16, 17],
>        [18, 19, 20, 21, 22, 23],
>        [24, 25, 26, 27, 28, 29],
>        [30, 31, 32, 33, 34, 35]])
>
> -- 
> Robert Kern
>
> "I have come to believe that the whole world is an enigma, a  
> harmless enigma
>  that is made terrible by our own mad attempt to interpret it as  
> though it had
>  an underlying truth."
>   -- Umberto Eco
> _______________________________________________
> Numpy-discussion mailing list
> Numpy-discussion at scipy.org
> http://projects.scipy.org/mailman/listinfo/numpy-discussion



More information about the Numpy-discussion mailing list