I want to pass an index slice as an argument to a function:
def myfunction(some_object_from_which_an_array_will_be_made, my_index=[1:5:2,::3]):
my_array = whatever(some_object_from_which_an_array_will_be_made)
return my_array[my_index]
Obviously this will not work, and obviously in this particular case there might be other ways to do this, but supposing I really want to do stuff this way, how can I use a variable to slice a numpy array?
Array indexing is the same as accessing an array element. You can access an array element by referring to its index number. The indexes in NumPy arrays start with 0, meaning that the first element has index 0, and the second has index 1 etc.
Let us see how to save a numpy array to a text file. Creating a text file using the in-built open() function and then converting the array into string and writing it into the text file using the write() function. Finally closing the file using close() function.
Element Assignment in NumPy Arrays We can assign new values to an element of a NumPy array using the = operator, just like regular python lists. A few examples are below (note that this is all one code block, which means that the element assignments are carried forward from step to step).
np.lib.index_tricks
has a number of functions (and classes) that can streamline indexing. np.s_
is one such function. It is actually an instance of a class that has a __get_item__
method, so it uses the []
notation that you want.
An illustration of its use:
In [249]: np.s_[1:5:2,::3]
Out[249]: (slice(1, 5, 2), slice(None, None, 3))
In [250]: np.arange(2*10*4).reshape(2,10,4)[_]
Out[250]:
array([[[40, 41, 42, 43],
[52, 53, 54, 55],
[64, 65, 66, 67],
[76, 77, 78, 79]]])
In [251]: np.arange(2*10*4).reshape(2,10,4)[1:5:2,::3]
Out[251]:
array([[[40, 41, 42, 43],
[52, 53, 54, 55],
[64, 65, 66, 67],
[76, 77, 78, 79]]])
Notice that it constructs the same tuple of slices that ajcr
did.
_
is the temporary variable that IPython uses for the last result.
To pass such a tuple to a function, try:
def myfunction(some_object_from_which_an_array_will_be_made, my_index=np.s_[:,:]):
my_array = whatever(some_object_from_which_an_array_will_be_made)
return my_array[my_index]
I = np.s_[1:5:2,::3]
myfunction(obj, my_index=I)
One way is to build a slice
object (or a tuple of slice
objects) and pass it in to the function to use as the index.
For example, the index notation
my_array[1:5:2, ::3]
is equivalent to
my_array[slice(1,5,2), slice(None,None,3)]
So your function could become:
def myfunction(some_object, my_index=(slice(1,5,2), slice(None,None,3))):
my_array = whatever(some_object)
return my_array[my_index]
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With