[Numpy-discussion] Slicing/selection in multiple dimensions simultaneously
Jonathan Taylor
jonathan.taylor at utoronto.ca
Thu Feb 26 22:00:24 EST 2009
Am I right to assume that there is no way elegant way to interact with
slices. i.e. Is there anyway to get
a[ix_([2,3,6],:,[3,2])]
to work? So that the dimension is completely specified? Or perhaps
the only way to do this is via
a[ix_([2,3,6],range(a.shape[1]),[3,2])]
If anyone knows a better way?
Thanks,
Jonathan.
On Tue, Sep 11, 2007 at 6:13 PM, Travis E. Oliphant
<oliphant at enthought.com> wrote:
> Timothy Hochberg wrote:
>>
>>
>> On 9/11/07, *Robert Kern* <robert.kern at gmail.com
>> <mailto:robert.kern at gmail.com>> wrote:
>>
>> Mike Ressler wrote:
>> > The following seems to be a wart: is it expected?
>> >
>> > Set up a 10x10 array and some indexing arrays:
>> >
>> > a=arange(100)
>> > a.shape=(10,10)
>> > q=array([0,2,4,6,8])
>> > r=array([0,5])
>> >
>> > Suppose I want to extract only the "even" numbered rows from a -
>> then
>> >
>> > print a[q,:]
>> >
>> > <works - output deleted>
>> >
>> > Every fifth column:
>> >
>> > print a[:,r]
>> >
>> > <works - output deleted>
>> >
>> > Only the even rows of every fifth column:
>> >
>> > print a[q,r]
>> >
>> >
>> ---------------------------------------------------------------------------
>>
>> > <type 'exceptions.ValueError'> Traceback (most recent
>> call last)
>> >
>> > /.../.../.../<ipython console> in <module>()
>> >
>> > <type 'exceptions.ValueError '>: shape mismatch: objects cannot be
>> > broadcast to a single shape
>> >
>> > But, this works:
>> >
>> > print a[q,:][:,r]
>> >
>> > [[ 0 5]
>> > [20 25]
>> > [40 45]
>> > [60 65]
>> > [80 85]]
>> >
>> > So why does the a[q,r] form have problems? Thanks for your insights.
>>
>> It is intended that the form a[q,r] be the general case: q and r
>> are broadcasted
>> against each other to a single shape. The result of the indexing
>> is an array of
>> that broadcasted shape with elements found by using each pair of
>> elements in the
>> broadcasted q and r arrays as indices.
>>
>> There are operations you can express with this form that you
>> couldn't if the
>> behavior that you expected were the case whereas you can get the
>> result you want
>> relatively straightforwardly.
>>
>> In [6]: a[q[:,newaxis], r]
>> Out[6]:
>> array([[ 0, 5],
>> [20, 25],
>> [40, 45],
>> [60, 65],
>> [80, 85]])
>>
>>
>>
>> At the risk of making Robert grumpy: while it is true the form we
>> ended up with is more general I've come to the conclusion that it was
>> a bit of a mistake. In the spirit of making simple things simple and
>> complex things possible, I suspect that having fancy-indexing do the
>> obvious thing here[1] and delegating the more powerful but also more
>> difficult to understand case to a function or method would have been
>> overall more useful. Cases where the multidimensional features of
>> fancy-indexing get used are messy enough that they don't benefit much
>> from the conciseness of the indexing notation, at least in my experience.
> This is a reasonable argument. It is reasonable enough that I
> intentionally made an ix_ function to do what you want.
>
> a[ix_(q,r)]
>
> does as originally expected if a bit more line-noise.
>
> -Travis
>
>
> _______________________________________________
> Numpy-discussion mailing list
> Numpy-discussion at scipy.org
> http://projects.scipy.org/mailman/listinfo/numpy-discussion
>
More information about the NumPy-Discussion
mailing list