[Numpy-discussion] On responding to dubious ideas (was: Re: Advanced indexing: "fancy" vs. orthogonal)

Eric Firing efiring at hawaii.edu
Fri Apr 10 13:19:07 EDT 2015


On 2015/04/10 6:58 AM, Derek Homeier wrote:
> On 10 Apr 2015, at 06:22 pm, Alan G Isaac <alan.isaac at gmail.com> wrote:
>
>>>
>>> On Thu, Apr 9, 2015 at 8:41 PM, Derek Homeier <derek at astro.physik.uni-goettingen.de <mailto:derek at astro.physik.uni-goettingen.de>> wrote:
>>>     a[1:3,1:3]?
>>>     Can’t be generalised to arbitrary selections of rows,columns, though (e.g. a[1::2,::2] still works…)
>>
>>
>>
>> On 4/9/2015 11:26 PM, Alexander Belopolsky wrote:
>>> I am interested in the arbitrary selection of rows and columns given by indices or by boolean selectors.
>>
>>
>>
>> You mean like this?
>> import numpy as np
>> a = np.arange(20).reshape((4,5))
>> rows = [0,3]
>> cols = [1,2,4]
>> print a[rows][:,cols]

I think this will actually make a copy, and then another copy; it is 
doing fancy indexing twice, sequentially.

There is now way to get around making at least one copy, though, because 
an ndarray has strided memory access.

>
> This creates a copy, same apparently with np.ix_ - an objection I had cut from the original post…
> Compare to
> b = a[::2,1::2]

Slicing doesn't require a copy because it remains compatible with 
strided access.

Eric

> b *= 2
> print(a)
>
> On 10 Apr 2015, at 02:23 am, Alexander Belopolsky <ndarray at mac.com> wrote:
>
>> I could do
>>
>>>>> a[[1,2]][:,[1,2]]
>> array([[22, 23],
>>         [32, 33]])
>>
>> but this creates an extra copy.
>>
>> The best solution I can think of involves something like
>>
>>>>> i = np.array([[1,2]])
>>>>> a.flat[i + len(a)*i.T]
>> array([[22, 23],
>>         [32, 33]])
>>
>> which is hardly elegant or obvious.
>>
>
> _______________________________________________
> NumPy-Discussion mailing list
> NumPy-Discussion at scipy.org
> http://mail.scipy.org/mailman/listinfo/numpy-discussion
>




More information about the NumPy-Discussion mailing list