A matrix problem. Please help!

Peter Otten __peter__ at web.de
Wed Feb 4 14:19:42 EST 2004


Carl wrote:

> I have the following matrix that I want to transform:
>     
> import random
> import Numeric as N
> ru = []
> for i in range(25):
>     ru.append(int(random.uniform(0, 2)))
> ru = N.reshape(ru, (5, 5))
> 
>>>> ru
> array([[1, 0, 1, 1, 1],
>        [0, 1, 1, 1, 0],
>        [1, 1, 0, 0, 1],
>        [0, 1, 0, 0, 1],
>        [1, 1, 0, 1, 1]])
> 
> Trailing numbers (ie, from left to right) after the first encounter of a
> "1" for all rows should equal "0".
> 
> Thus, I want this:
> 
>>>> ru
> array([[1, 0, 0, 0, 0],
>        [0, 1, 0, 0, 0],
>        [1, 0, 0, 0, 0],
>        [0, 1, 0, 0, 0],
>        [1, 0, 0, 0, 0]])
> 
> Does anyone have a suggestion of a fast and easy way to accomplish the
> above?
> 
> Carl

(Disclaimer: Numeric newbie code)

>>> import random
>>> import Numeric
>>> import itertools
>>> def oneone():
...     while 1:
...             r = int(random.uniform(0, 2))
...             yield r
...             if r: break
...     for r in itertools.repeat(0):
...             yield r
...
>>> ru = Numeric.array([[x for x,y in itertools.izip(oneone(), range(5))]
for z in range(5)])
>>> ru
array([[0, 0, 1, 0, 0],
       [0, 0, 0, 1, 0],
       [1, 0, 0, 0, 0],
       [0, 0, 0, 1, 0],
       [0, 0, 1, 0, 0]])
>>>

Or, more seriously, i. e. assuming that you have no influence on the initial
matrix:

>>> r
array([[1, 1, 1],
       [0, 1, 1],
       [0, 0, 1]])
>>> for i in r:
...     for k in Numeric.nonzero(i)[1:]:
...             i[k] = 0
...
>>> r
array([[1, 0, 0],
       [0, 1, 0],
       [0, 0, 1]])

Peter




More information about the Python-list mailing list