Re: replacement rule and sparsearray question
- To: mathgroup at smc.vnet.net
- Subject: [mg71352] Re: replacement rule and sparsearray question
- From: Bill Rowe <readnewsciv at sbcglobal.net>
- Date: Wed, 15 Nov 2006 06:45:03 -0500 (EST)
On 11/14/06 at 5:06 AM, Arkadiusz.Majka at gmail.com wrote:
>How can I apply a replacement rule to sparse array, e.g
>SparseArray[{1,2,3}]/.{2->222}
>and obtain the same result as for {1,2,3}/.{2->222} (what is
>{1,222,3}.
>I DON'T want to call Normal before.
In this particular example where you know the position of the
element to be replaced, use ReplacePart, i.e.,
In[45]:=
s=SparseArray[Range@5];
d=ReplacePart[s,222,2];
Normal@d
Out[47]=
{1,222,3,4,5}
if you don't know the position of the element to be replaced, it
can be obtained as follows:
In[48]:=
pos = DeleteCases[ArrayRules[s] /.
HoldPattern[{a_} -> 2] :> a, _Rule]
Out[48]=
{2}
Now ReplacePart can be used as above, i.e.
In[49]:=
d=ReplacePart[s,222,pos];
Normal@d
Out[50]=
{1,222,3,4,5}
but if the element to be replaced occurs multiple times, this
last would need to be done as
In[51]:=
d=ReplacePart[s,222,Partition[pos,1]];
Normal@d
Out[52]=
{1,222,3,4,5}
It is also possible to construct a pattern that operates
directly on the SparseArray object. But I think that approach is
a bit more complex than what I've outlined here.
--
To reply via email subtract one hundred and four