Backwards slicing including the first element
Dear all, Is there a way to give an integer value to j when using a[i:j:-1] so that the first element of the array can be included in the slice ? I would like to use some code like a[i:i-k:-1] to get a slice of length k. The numpy documentation seems to suggest that j=-1 should work: "Assume n is the number of elements in the dimension being sliced. Then, if i is not given it defaults to 0 for k > 0 and n for k < 0 . If j is not given it defaults to n for k > 0 and -1 for k < 0 . If k is not given it defaults to 1." But a[i:i-k:-1] is empty if i-k is -1. The workaround is a[i::-1][:k], is there something simpler ? Many thanks in advance, Jerome.
Jerome Esteve wrote:
Dear all,
Is there a way to give an integer value to j when using a[i:j:-1] so that the first element of the array can be included in the slice ?
I would like to use some code like a[i:i-k:-1] to get a slice of length k.
The numpy documentation seems to suggest that j=-1 should work:
"Assume n is the number of elements in the dimension being sliced. Then, if i is not given it defaults to 0 for k > 0 and n for k < 0 . If j is not given it defaults to n for k > 0 and -1 for k < 0 . If k is not given it defaults to 1."
But a[i:i-k:-1] is empty if i-k is -1. The workaround is a[i::-1][:k], is there something simpler ?
You could use a[i:i-(len(a)+k):-1]. This works because a[-len(a)] is the same as a[0]. For example: ----- In [57]: a Out[57]: array([10, 11, 12, 13, 14, 15, 16, 17, 18, 19]) In [58]: i = 3 In [59]: for k in range(5): ....: print k, a[i:i-(len(a)+k):-1] ....: ....: 0 [] 1 [13] 2 [13 12] 3 [13 12 11] 4 [13 12 11 10] ----- Warren
Many thanks in advance, Jerome.
------------------------------------------------------------------------
_______________________________________________ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion
Warren Weckesser wrote:
Jerome Esteve wrote:
Dear all,
Is there a way to give an integer value to j when using a[i:j:-1] so that the first element of the array can be included in the slice ?
I would like to use some code like a[i:i-k:-1] to get a slice of length k.
The numpy documentation seems to suggest that j=-1 should work:
"Assume n is the number of elements in the dimension being sliced. Then, if i is not given it defaults to 0 for k > 0 and n for k < 0 . If j is not given it defaults to n for k > 0 and -1 for k < 0 . If k is not given it defaults to 1."
But a[i:i-k:-1] is empty if i-k is -1. The workaround is a[i::-1][:k], is there something simpler ?
You could use a[i:i-(len(a)+k):-1]. This works because a[-len(a)] is the same as a[0].
I'm going to be pedantic and amend that last sentence. While it is true the a[-len(a)] is the same as a[0], that is not why this works. A better explanation is that Python is lenient about handling the value given as the end position in a slice. It does not have to be a valid index. If the value is out of range, Python will include everything up to the end of the actual data, and it will not raise an error. So you can do slices like the following: ----- In [101]: w Out[101]: [10, 11, 12, 13, 14] In [102]: w[2:-5:-1] Out[102]: [12, 11] In [103]: w[2:-6:-1] Out[103]: [12, 11, 10] In [104]: w[2:-7:-1] Out[104]: [12, 11, 10] ----- Note that -6 and -7 are not valid indices; using w[-6] will raise an IndexError. Warren
For example:
----- In [57]: a Out[57]: array([10, 11, 12, 13, 14, 15, 16, 17, 18, 19])
In [58]: i = 3
In [59]: for k in range(5): ....: print k, a[i:i-(len(a)+k):-1] ....: ....: 0 [] 1 [13] 2 [13 12] 3 [13 12 11] 4 [13 12 11 10]
-----
Warren
Many thanks in advance, Jerome.
------------------------------------------------------------------------
_______________________________________________ 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
On Wed, Mar 10, 2010 at 10:19 AM, Warren Weckesser <warren.weckesser@enthought.com> wrote:
Warren Weckesser wrote:
Jerome Esteve wrote:
Dear all,
Is there a way to give an integer value to j when using a[i:j:-1] so that the first element of the array can be included in the slice ?
I would like to use some code like a[i:i-k:-1] to get a slice of length k.
The numpy documentation seems to suggest that j=-1 should work:
"Assume n is the number of elements in the dimension being sliced. Then, if i is not given it defaults to 0 for k > 0 and n for k < 0 . If j is not given it defaults to n for k > 0 and -1 for k < 0 . If k is not given it defaults to 1."
But a[i:i-k:-1] is empty if i-k is -1. The workaround is a[i::-1][:k], is there something simpler ?
You could use a[i:i-(len(a)+k):-1]. This works because a[-len(a)] is the same as a[0].
I'm going to be pedantic and amend that last sentence. While it is true the a[-len(a)] is the same as a[0], that is not why this works. A better explanation is that Python is lenient about handling the value given as the end position in a slice. It does not have to be a valid index. If the value is out of range, Python will include everything up to the end of the actual data, and it will not raise an error. So you can do slices like the following: ----- In [101]: w Out[101]: [10, 11, 12, 13, 14]
In [102]: w[2:-5:-1] Out[102]: [12, 11]
In [103]: w[2:-6:-1] Out[103]: [12, 11, 10]
In [104]: w[2:-7:-1] Out[104]: [12, 11, 10] ----- Note that -6 and -7 are not valid indices; using w[-6] will raise an IndexError.
Warren
For example:
----- In [57]: a Out[57]: array([10, 11, 12, 13, 14, 15, 16, 17, 18, 19])
In [58]: i = 3
In [59]: for k in range(5): ....: print k, a[i:i-(len(a)+k):-1] ....: ....: 0 [] 1 [13] 2 [13 12] 3 [13 12 11] 4 [13 12 11 10]
-----
I thought, I had also used the -1 before, but it only works with range, e.g.
[(i,i-k,np.arange(5)[range(i,i-k,-1)]) for i in range(1,5)] [(1, -1, array([1, 0])), (2, 0, array([2, 1])), (3, 1, array([3, 2])), (4, 2, array([4, 3]))]
the "or None" trick is more complicated when counting down
[(i,i-k,np.arange(5)[i:(i-k if (i-k!=-1) else None):-1]) for i in range(1,5)] [(1, -1, array([1, 0])), (2, 0, array([2, 1])), (3, 1, array([3, 2])), (4, 2, array([4, 3]))]
I will mark Warrens solution as something to remember. Josef
Warren
Many thanks in advance, Jerome.
------------------------------------------------------------------------
_______________________________________________ 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
_______________________________________________ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion
Jerome Esteve wrote:
Is there a way to give an integer value to j when using a[i:j:-1] so that the first element of the array can be included in the slice ?
Is this what you are looking for? In [11]: a = np.arange(10) In [12]: a[6::-1] Out[12]: array([6, 5, 4, 3, 2, 1, 0]) I know it's not an integer, but it does indicate "the last (or first) element of the array" -Chris -- Christopher Barker, Ph.D. Oceanographer Emergency Response Division NOAA/NOS/OR&R (206) 526-6959 voice 7600 Sand Point Way NE (206) 526-6329 fax Seattle, WA 98115 (206) 526-6317 main reception Chris.Barker@noaa.gov
participants (4)
-
Chris Barker -
Jerome Esteve -
josef.pktd@gmail.com -
Warren Weckesser