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