Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Index entire array backwards in for loop

Tags:

python

numpy

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.

like image 340
lhcgeneva Avatar asked Mar 08 '17 14:03

lhcgeneva


People also ask

How do you make a loop go backwards?

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.


2 Answers

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:])
like image 160
ShadowRanger Avatar answered Oct 11 '22 02:10

ShadowRanger


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:])
like image 27
miindlek Avatar answered Oct 11 '22 02:10

miindlek