lhcgeneva
lhcgeneva

Reputation: 1981

Index entire array backwards in for loop

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.

Upvotes: 5

Views: 8981

Answers (2)

miindlek
miindlek

Reputation: 3553

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:])

Upvotes: 2

ShadowRanger
ShadowRanger

Reputation: 155353

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:])

Upvotes: 9

Related Questions