Reputation: 1981
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
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
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