[Numpy-discussion] use slicing as argument values?

Chao YUE chaoyuejoy@gmail....
Thu Jul 12 16:32:12 CDT 2012


Thanks all for the discussion. Actually I am trying to use something like
numpy ndarray indexing in the function. Like when I call:

func(a,'1:3,:,2:4'), it knows I want to retrieve a[1:3,:,2:4], and
func(a,'1:3,:,4') for a[1:3,:,4] ect.
I am very close now.

#so this function changes the string to list of slice objects.
def convert_string_to_slice(slice_string):
    """
    provide slice_string as '2:3,:', it will return [slice(2, 3, None),
slice(None, None, None)]
    """
    slice_list=[]
    split_slice_string_list=slice_string.split(',')
    for sub_slice_string in split_slice_string_list:
        split_sub=sub_slice_string.split(':')
        if len(split_sub)==1:
            sub_slice=slice(int(split_sub[0]))
        else:
            if split_sub[0]=='':
                sub1=None
            else:
                sub1=int(split_sub[0])
            if split_sub[1]=='':
                sub2=None
            else:
                sub2=int(split_sub[1])
            sub_slice=slice(sub1,sub2)
        slice_list.append(sub_slice)
    return slice_list

In [119]: a=np.arange(3*4*5).reshape(3,4,5)

for this it works fine.
In [120]: convert_string_to_slice('1:3,:,2:4')
Out[120]: [slice(1, 3, None), slice(None, None, None), slice(2, 4, None)]

In [121]: a[slice(1, 3, None), slice(None, None, None), slice(2, 4,
None)]==a[1:3,:,2:4]
Out[121]:
array([[[ True,  True],
        [ True,  True],
        [ True,  True],
        [ True,  True]],

       [[ True,  True],
        [ True,  True],
        [ True,  True],
        [ True,  True]]], dtype=bool)

And problems happens when I want to retrieve a single number along a given
dimension:
because it treats 1:3,:,4 as 1:3,:,:4, as shown below:

In [122]: convert_string_to_slice('1:3,:,4')
Out[122]: [slice(1, 3, None), slice(None, None, None), slice(None, 4, None)]

In [123]: a[1:3,:,4]
Out[123]:
array([[24, 29, 34, 39],
       [44, 49, 54, 59]])

In [124]: a[slice(1, 3, None), slice(None, None, None), slice(None, 4,
None)]
Out[124]:
array([[[20, 21, 22, 23],
        [25, 26, 27, 28],
        [30, 31, 32, 33],
        [35, 36, 37, 38]],

       [[40, 41, 42, 43],
        [45, 46, 47, 48],
        [50, 51, 52, 53],
        [55, 56, 57, 58]]])


Then I have a function:

#this function retrieves data from ndarray a by specifying slice_string:
def retrieve_data(a,slice_string):
    slice_list=convert_string_to_slice(slice_string)
    return a[*slice_list]

In the list line of the fuction "retrieve_data" I have problem, I get an
invalid syntax error.

    return a[*slice_list]
             ^
SyntaxError: invalid syntax

I hope it's not too long, please comment as you like. Thanks a lot!!!!

Chao

2012/7/12 Benjamin Root <ben.root@ou.edu>

>
> On Thu, Jul 12, 2012 at 4:46 PM, Chao YUE <chaoyuejoy@gmail.com> wrote:
>
>> Hi Ben,
>>
>> it helps a lot. I am nearly finishing a function in a way I think
>> pythonic.
>> Just one more question, I have:
>>
>> In [24]: b=np.arange(1,11)
>>
>> In [25]: b
>> Out[25]: array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10])
>>
>> In [26]: b[slice(1)]
>> Out[26]: array([1])
>>
>> In [27]: b[slice(4)]
>> Out[27]: array([1, 2, 3, 4])
>>
>> In [28]: b[slice(None,4)]
>> Out[28]: array([1, 2, 3, 4])
>>
>> so slice(4) is actually slice(None,4), how can I exactly want retrieve
>> a[4] using slice object?
>>
>> thanks again!
>>
>> Chao
>>
>>
> Tricky question.  Note the difference between
>
> a[4]
>
> and
>
> a[4:5]
>
> The first returns a scalar, while the second returns an array.  The first,
> though, is not a slice, just an integer.
>
> Also, note that the arguments for slice() behaves very similar to the
> arguments for range() (with some exceptions/differences).
>
> Cheers!
> Ben Root
>
>
>
>> 2012/7/12 Benjamin Root <ben.root@ou.edu>
>>
>>>
>>>
>>> On Thu, Jul 12, 2012 at 3:38 PM, Chao YUE <chaoyuejoy@gmail.com> wrote:
>>>
>>>> Dear all,
>>>>
>>>> I want to create a function and I would like one of the arguments of
>>>> the function to determine what slicing of numpy array I want to use.
>>>> a simple example:
>>>>
>>>> a=np.arange(100).reshape(10,10)
>>>>
>>>> suppose I want to have a imaging function to show image of part of this
>>>> data:
>>>>
>>>> def show_part_of_data(m,n):
>>>>     plt.imshow(a[m,n])
>>>>
>>>> like I can give m=3:5, n=2:7, when I call function
>>>> show_part_of_data(3:5,2:7), this means I try to do plt.imshow(a[3:5,2:7]).
>>>> the above example doesn't work in reality. but it illustrates something
>>>> similar that I desire, that is, I can specify what slicing of
>>>> number array I want by giving values to function arguments.
>>>>
>>>> thanks a lot,
>>>>
>>>> Chao
>>>>
>>>>
>>>
>>> What you want to do is create slice objects.
>>>
>>> a[3:5]
>>>
>>> is equivalent to
>>>
>>> sl = slice(3, 5)
>>> a[sl]
>>>
>>>
>>> and
>>>
>>> a[3:5, 5:14]
>>>
>>> is equivalent to
>>>
>>> sl = (slice(3, 5), slice(5, 14))
>>> a[sl]
>>>
>>> Furthermore, notation such as "::-1" is equivalent to slice(None, None,
>>> -1)
>>>
>>> I hope this helps!
>>> Ben Root
>>>
>>>
>>> _______________________________________________
>>> NumPy-Discussion mailing list
>>> NumPy-Discussion@scipy.org
>>> http://mail.scipy.org/mailman/listinfo/numpy-discussion
>>>
>>>
>>
>>
>> --
>>
>> ***********************************************************************************
>> Chao YUE
>> Laboratoire des Sciences du Climat et de l'Environnement (LSCE-IPSL)
>> UMR 1572 CEA-CNRS-UVSQ
>> Batiment 712 - Pe 119
>> 91191 GIF Sur YVETTE Cedex
>> Tel: (33) 01 69 08 29 02; Fax:01.69.08.77.16
>>
>> ************************************************************************************
>>
>>
>> _______________________________________________
>> NumPy-Discussion mailing list
>> NumPy-Discussion@scipy.org
>> http://mail.scipy.org/mailman/listinfo/numpy-discussion
>>
>>
>
> _______________________________________________
> NumPy-Discussion mailing list
> NumPy-Discussion@scipy.org
> http://mail.scipy.org/mailman/listinfo/numpy-discussion
>
>


-- 
***********************************************************************************
Chao YUE
Laboratoire des Sciences du Climat et de l'Environnement (LSCE-IPSL)
UMR 1572 CEA-CNRS-UVSQ
Batiment 712 - Pe 119
91191 GIF Sur YVETTE Cedex
Tel: (33) 01 69 08 29 02; Fax:01.69.08.77.16
************************************************************************************
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.scipy.org/pipermail/numpy-discussion/attachments/20120712/179d2894/attachment.html 


More information about the NumPy-Discussion mailing list