On Thursday, July 12, 2012, Chao YUE wrote: > 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
I won't comment on the wisdom of your approach, but for you very last part, don't try unpacking the slice list. Also, I think it has to be a tuple, but I could be wrong on that. Ben Root >
_______________________________________________ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion