这可能是一个简单的问题,但我似乎花了太多时间在它上面......我的问题包括创建一个迭代列表的for循环。
对于每次迭代,应提取三个元素=>那些是我,i + 1和i + 2。但由于某种原因,我无法在没有退出索引之类的情况下迭代列表?...
我目前正在迭代的方式如下:
for i in xrange(0,len(data_train_output_full)-1,3):
data = np.array([data_train_output_full[i],data_train_output_full[i+1],data_train_output_full[i+2]])
data_train_output.append(data)
我得到的错误信息是:
IndexError: index 278 is out of bounds for axis 0 with size 278
答案 0 :(得分:1)
您的代码无效,因为您向stop
提供的xrange
值不正确。由于您在xrange
提供的最高索引之后检查两个索引,因此您需要从输入序列的长度中减去两个(len(data_train_output_full)-2
而不是-1
)。
这种迭代还有一个itertools
recipe:
def grouper(iterable, n, fillvalue=None):
"Collect data into fixed-length chunks or blocks"
# grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx
args = [iter(iterable)] * n
return izip_longest(fillvalue=fillvalue, *args)
如果您的列表可能不均衡,并且您希望跳过最后一个值而不是填充,则可以使用itertools.izip
代替itertools.izip_longest
。
答案 1 :(得分:0)
您总是可以使用itertools.islice
理想地为此编写快速生成器。
In [1]: x = list(range(28))
In [2]: def by_triples(iterable):
...: it = iter(iterable)
...: triple = tuple(itertools.islice(it, 3))
...: while triple:
...: yield triple
...: triple = tuple(itertools.islice(it, 3))
...:
...:
In [3]: import itertools
In [4]: for trip in by_triples(x):
...: print(trip)
...:
(0, 1, 2)
(3, 4, 5)
(6, 7, 8)
(9, 10, 11)
(12, 13, 14)
(15, 16, 17)
(18, 19, 20)
(21, 22, 23)
(24, 25, 26)
(27,)
答案 2 :(得分:0)
我想出了这个替代解决方案:
def by_n(a_list, n):
for i in xrange(0, len(a_list), n):
yield a_list[i:i+n]
data_train_output = [np.array(_) for _ in by_n(data_train_output_full, 3)]
# or
data_train_output = list(map(np.array, by_n(data_train_output_full, 3))