[SciPy-User] Indexing question
Dav Clark
dav at alum.mit.edu
Mon Aug 10 18:50:24 EDT 2009
You should give help(nipy.docs.indexing) a read... there you will find
that this is the way to do what you're trying to do:
a = zeros([3,3,3])
a[[0, 1], 0, 0] += 1
# Or, if you want to do more typing
b = [array([0, 1]), array([0, 0]), array([0, 0])]
a[b] += 1
Basically, the nth dimension of a should be indexed by the nth entry/
entries in a python sequence b. In your code, you are passing in a
single array, which gets interpreted as a (very fancy) index into the
first dimension of a, so you get the 0th and 1st slab of your data
(the former repeated many times). Your b is equivalent to
array([0,1]) for assignment (though not for reference - it gives a
different shape). This actually points out an obscure feature, which
is that even if you have entries that are doubly (or n-ably)
referenced in your indexing, each element in the lvalue will only get
operated on once. Thus, while I might have expected the following to
yield a = [2, 0], it actually yields a = [1, 0]:
a = array([0, 0])
a[a] += 1 # a[0] incremented twice? No!
In other words, we don't need to worry about double-counting in our
lvalues, which I guess is OK. It'd be a bit more intuitive for _me_
the other way 'round. Any logic behind that, or perhaps just
implementational ease?
As an additional idea... you could get numpy to tell you how it would
like to refer to a set of indices by using the where function, as in:
where(desireda)
Final tip - if you already have code constructing your 'b', you could
coerce it to a list with a[list(b)]
Cheers,
Dav
On Aug 10, 2009, at 1:38 PM, Michael Lerner wrote:
> Hi,
>
> If I have a 1-dimensional array and I want to increment some values,
> I can do this:
>
> In [1]: a = array([0,0,0,0,0,0,0,0])
>
> In [2]: b = array([1,2,4])
>
> In [3]: a[b] += 1
>
> In [4]: a
> Out[4]: array([0, 1, 1, 0, 1, 0, 0, 0])
>
> I actually have a 3-dimensional array and a list of cells within it
> that I'd like to increment. I can't quite seem to get the syntax
> right, e.g.
>
> In [5]: a = zeros([3,3,3])
>
> In [6]: b = array([[0,0,0],[1,0,0]])
>
> In [7]: a[b] += 1
>
> In [8]: a
> Out[8]:
> array([[[ 1., 1., 1.],
> [ 1., 1., 1.],
> [ 1., 1., 1.]],
>
> [[ 1., 1., 1.],
> [ 1., 1., 1.],
> [ 1., 1., 1.]],
>
> [[ 0., 0., 0.],
> [ 0., 0., 0.],
> [ 0., 0., 0.]]])
>
> whereas I'd like to end up with
>
> In [10]: desireda
> Out[10]:
> array([[[ 1., 0., 0.],
> [ 0., 0., 0.],
> [ 0., 0., 0.]],
>
> [[ 1., 0., 0.],
> [ 0., 0., 0.],
> [ 0., 0., 0.]],
>
> [[ 0., 0., 0.],
> [ 0., 0., 0.],
> [ 0., 0., 0.]]])
>
> I think speed matters too. In the worst case, I'll have an array
> with dimensions (400,400,30) and a list of around a million indices
> that I'd like to increment.
>
> Thanks,
>
> -Michael
>
> --
> Michael Lerner, Ph.D.
> IRTA Postdoctoral Fellow
> Laboratory of Computational Biology NIH/NHLBI
> 5635 Fishers Lane, Room T909, MSC 9314
> Rockville, MD 20852 (UPS/FedEx/Reality)
> Bethesda MD 20892-9314 (USPS)
> _______________________________________________
> SciPy-User mailing list
> SciPy-User at scipy.org
> http://mail.scipy.org/mailman/listinfo/scipy-user
More information about the SciPy-User
mailing list