: is the delimiter of the slice syntax to 'slice out' sub-parts in sequences , [start:end]
[1:5] is equivalent to "from 1 to 5" (5 not included)
[1:] is equivalent to "1 to end"
[len(a):] is equivalent to "from length of a to end"
Watch https://youtu.be/tKTZoB2Vjuk?t=41m40s at around 40:00 he starts explaining that.
Works with tuples and strings, too.
Answer from soulseekah on Stack Overflow: is the delimiter of the slice syntax to 'slice out' sub-parts in sequences , [start:end]
[1:5] is equivalent to "from 1 to 5" (5 not included)
[1:] is equivalent to "1 to end"
[len(a):] is equivalent to "from length of a to end"
Watch https://youtu.be/tKTZoB2Vjuk?t=41m40s at around 40:00 he starts explaining that.
Works with tuples and strings, too.
slicing operator. http://docs.python.org/tutorial/introduction.html#strings and scroll down a bit
Videos
new_list = [10, 20, 30, 40]
for i in new_list[:]:
print(i)
new_value = new_list.pop(0)As suggested from numpy's documentation about indexing you can use the slice built-in function and tuple concatenation to create variable indexes.
In fact the : in the subscript is simply the literal notation for a slice literal.
In particular : is equivalent to slice(None) (which, itself, is equivalent to slice(None, None, None) where the arguments are start, stop and step).
For example:
a[(0,) * N + (slice(None),)]
is equivalent to:
a[0, 0, ..., 0, :] # with N zeros
The : notation for slices can only be used directly inside a subscript. For example this fails:
In [10]: a[(0,0,:)]
File "<ipython-input-10-f41b33bd742f>", line 1
a[(0,0,:)]
^
SyntaxError: invalid syntax
To allow extracting a slice from an array of arbitrary dimensions you can write a simple function such as:
def make_index(num_dimension, slice_pos):
zeros = [0] * num_dimension
zeros[slice_pos] = slice(None)
return tuple(zeros)
And use it as in:
In [3]: a = np.array(range(24)).reshape((2, 3, 4))
In [4]: a[make_index(3, 2)]
Out[4]: array([0, 1, 2, 3])
In [5]: a[make_index(3, 1)]
Out[5]: array([0, 4, 8])
In [6]: a[make_index(3, 0)]
Out[6]: array([ 0, 12])
You can generalize make_index to do any kind of things. The important thing to remember is that it should, in the end, return a tuple containing either integers or slices.
You could compose an string with the code selecting the dimension you want and use eval to execute that code string.
An start is:
n = 2
sel = "0,"*(n-1) + ":"
eval('x[' + sel + ']')
To get exactly what you want, thinks are a little bit more complicated (but not so much):
ind = 2
n = 3
sel = "".join([ ("0" if i != ind else ":") + ("," if i < n-1 else "") for i in xrange(n)])
eval('x[' + sel + ']')
It is the same strategy that is used for Dynamic SQL.
If I have a list l= list(range(1,11)) then if I want a slice of the odd numbers then l[::2] will return the odd numbers. My question is does the first colon mean start from index 0, the second to stop at the end of the list and 2 means the step size?
Hello! I am writing a program that will have an arbitrary number of `:` and `None` in arbitrary locations of an n-dimensional NumPy array. Therefore, I want a way to unpack these `:` and `None` axis operators into the `[]` that indexes an array and auto-populates certain axes according to where the `:` and `None` are. According to Pylance:
Unpack operator in subscript requires Python 3.11 or newerPylance
However, while using Python 3.11, I get the following error:
Traceback (most recent call last):
File "/home/.../quant.py", line 261, in <module>
print(arr[*lhs_axes] + arr2[None,None,:])
~~~^^^^^^^^^^^
IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indicesCurrent code:
import numpy as np
if __name__ == "__main__":
lhs_ind, rhs_ind = 'ij', 'k'
lhs_axes = [':' for i in lhs_ind]
lhs_axes.append(None)
arr1 = np.ones((2,2))
arr2 = np.ones(2)
print(arr1[*lhs_axes] + arr2[None,None,:])