[SciPy-User] Indexing question
josef.pktd at gmail.com
josef.pktd at gmail.com
Mon Aug 10 19:05:17 EDT 2009
On Mon, Aug 10, 2009 at 6:50 PM, Dav Clark<dav at alum.mit.edu> wrote:
> 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
and an example as illustration
Josef
>>> a = np.zeros([3,3,3])
>>> b = np.array([[0,0,0],[1,0,0]])
>>> a[b[:,0],b[:,1],b[:,2]] += 1
>>> a
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.]]])
>>> bz = zip([0,0,0],[1,0,0])
>>> a[bz] += 1
>>> a
array([[[ 2., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.]],
[[ 2., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.]],
[[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.]]])
>>
>> --
>> 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
>
> _______________________________________________
> 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