Suppose I would like to loop over an array and within the loop index the array forward and backward for all of its indices like so:
x = np.random.uniform(size=600)
for i in range(len(x)):
dot = np.dot(x[:-i], x[i:])
Now this doesn't work, because x[:-0]
is just like x[:0]
which gives []
.
I could handle the zero case separately but was wondering whether there's a more pythonic way of doing this.
To reverse for loop in Python just need to read the last element first and then the last but one and so on till the element is at index 0. You can do it with the range function, List Comprehension, or reversed() function.
Use an end of slice value of -i or None
. If i
is non-zero, then it's just -i
, but if it's 0
, then -0
is falsy, and it evaluates and returns the second term, None
, which means "run to end of sequence". This works because foo[:None]
is equivalent to foo[:]
, when you omit that component of the slice it becomes None
implicitly, but it's perfectly legal to pass None
explicitly, with the same effect.
So your new line would be:
dot = np.dot(x[:-i or None], x[i:])
Why don't you just use the length information:
length = len(x)
for i in range(length):
dot = np.dot(x[:length-i], x[i:])
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