Index entire array backwards in for loop
假设我想循环一个数组,并且在循环中为数组的所有索引向前和向后进行索引,如下所示:
1 2 3
| x = np.random.uniform(size=600)
for i in range(len(x)):
dot = np.dot(x[:-i], x[i:]) |
现在这不起作用,因为x[:-0]就像x[:0]给[]一样。我可以单独处理这个零案例,但我想知道是否有一种更为Python式的方式来做这件事。
使用-i or None的片尾值。如果i不是零,那么它只是-i,但是如果是0,那么-0是不可靠的,它评估并返回第二个术语None,意思是"运行到序列结束"。这是因为foo[:None]相当于foo[:],当你省略了切片的那个部分,它就隐式地变成了None,但是显式地传递None是完全合法的,具有同样的效果。
所以你的新行是:
1
| dot = np.dot(x[:-i or None], x[i:]) |
- 今天我学了一个新词——"falsy":)
- 它与"真实"很相配。:-)比起"真"和"假",我更喜欢使用它,因为坦率地说,在python中,你很少关心实际值True和False,你只关心一个值是真是假,用于布尔值评估;truthy或falsy清楚地表明你关心的是意义,而不是具体值。
- 这真是太好了,谢谢!
- 我看到你在youtube.com/watch之前就玩过《魔兽骑士》?V=mce0aahbvfc
- 尼尔。我可能会和[:len(x)-i]一起去,但那只是因为我偏执于依赖布尔值对非布尔值的评估。
- @runelyngsoe:是的,这也很有效,尽管速度会变慢(特别是如果你没有在循环外预计算len(x)并将其存储起来;调用这样的内置函数的开销是惊人的高,因为它们实际上只做了很少的工作)。-i or None只在普通情况下增加了一个隐式布尔计算(关于cpython可以做的最便宜的事情,而不是pass语句),在这种情况下,len(x) - i增加了一个内置查找、内置调用,并将操作减去到每一个使用中(本地加载和减法,如果您预先计算只需要花费很少的金额,那么至少要花费很少的金额)。
为什么不使用长度信息:
1 2 3 4
| length = len(x)
for i in range(length):
dot = np.dot(x[:length-i], x[i:]) |
号
- 我想他们想要一片比X小的
- @pureferret它小于x的长度(除了第一次迭代)
- 是的,这相当于影子游侠的解决方案,谢谢!