[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