> If I have a large matrix, say
>> a = zeros( (20,20) )
>> and a small matrix
>> b = ones( 3,4 )
>> and a list of row indices and a list of col indices
>> rind = [2,4,9,15]
> cind = [1,4,12]
>> what is the best way to assign the submatrix to a[rind,cind]. I
> understand this is possible in numarray, but is there a good way to do
> it in Numeric?
>> In matlab, you could do a(rind, cind)=b; Is there some reshape, put
> magic I can do to make this efficient in Numeric?
>> Thanks,
> John Hunter
Note that numarray doesn't do the same thing as matlab in this
regard. In particular, the expression
a[rind, cind] = b
would fail since it is expecting an array on the right hand side
that is the same shape as the index arrays. The assignment here
is taken to mean:
a[rind[0], cind[0]] = b[0]
a[rind[1], cind[1]] = b[1]
etc.
not:
a[rind[0], cind[0]] = b[0,0]
etc.
To do what you want doesn't currently have any atomic operation
in numarray. Is this widely used?
At the moment I think you would be forced to iterate over
one dimension. E.g.,
for i in range(len(rind)):
a[cind, rind[i]] = b[:, i]
[Note that I reordered the index arrays to match b; I wasn't sure
what was intended]
There may be some clever way to avoid the explicit looping. Nothing
prevents the addition of such a feature to numarray (other than
work!), but it would likely have to use a function. I think
the current defintion of how multiple index puts and takes work with
brackets is more useful than the interpretation you are using and isn't
likely to change.
Perry