';环绕';在python/numpy中进行切片时

';环绕';在python/numpy中进行切片时,python,arrays,numpy,Python,Arrays,Numpy,我有一个NumPy数组 import numpy as np a = np.array([10, 20, 30, 40]) 我想以这样一种方式对它进行切片,返回整个数组,并将第一个元素附加到末尾,因此数组([10,20,30,40,10]),或者(作为一个普通列表)[10,20,30,40,10]考虑并从itertools库中实现这一点 >>将numpy作为np导入 >>>进口itertools >>>a=np.数组([10,20,30,40]) >>>列表(itertools.islice(

我有一个NumPy数组

import numpy as np
a = np.array([10, 20, 30, 40])
我想以这样一种方式对它进行切片,返回整个数组,并将第一个元素附加到末尾,因此
数组([10,20,30,40,10])
,或者(作为一个普通列表)
[10,20,30,40,10]
考虑并从
itertools
库中实现这一点

>>将numpy作为np导入
>>>进口itertools
>>>a=np.数组([10,20,30,40])
>>>列表(itertools.islice(itertools.cycle(a),len(a)+1))
[10, 20, 30, 40, 10]

请注意,这将产生一个iterable,您不需要立即消费。

有几种方法可以做到这一点,可以从我自己的发现、原始问题下面的评论以及其他人的回答中获得:

>>> a = np.array([10, 20, 30, 40])
>>> np.take(a, np.arange(5), mode='wrap')
array([10, 20, 30, 40, 10])
b1=a.tolist()+[a[0]]
b2=np.append(a,a[0])
c1=[a[i%len(a)]表示范围(len(a)+1)内的i
c2=a[np.arange(len(a)+1)%len(a)]
d1=np.array((*a,a[0]))
d2=[*a,a[0]]
e=np。调整大小(a,透镜(a)+1)
f=np.take(a,范围(len(a)+1),mode='wrap')
从itertools导入周期,islice
g=列表(islice(循环(a),长度(a)+1))

其中,
c1
c2
e
f
g
可通过更改赋值的
len(a)+1
部分灵活/轻松地调整,以防添加更多元素(而不仅仅是第一个元素)
e
在可读性和简洁性方面是我最喜欢的。

您可以使用
np.resize
np.resize(a,len(a)+1)
?请注意,这是
numpy.resize
函数,而不是数组方法。这个方法有完全不同的行为。啊,太好了,我不知道这个函数;谢谢不过,就解决方案而言,它并不比我的
np.append
建议好多少,至少在这种情况下,我只需要一个额外的元素。有什么原因不能使用
%
并取模吗?在这种情况下,我只能通过索引来获取元素,对吗?(我认为
[a[I%len(a)]代表范围内的I(len(a)+1)]
-为了完整性,我将把它添加到问题中。)这也太冗长了。啊,我以前看过
循环,但不知道如何利用它-因为它是一个生成器,切片不起作用。这也是一个很好的解决方案;我将把它添加到问题的列表中,以供有绊脚石的人使用,谢谢;它的可读性和灵活性。对于我的用例,我更喜欢
np.resize
而不是
np.take
,但我已经将其添加到了答案中的解决方案列表中。@ElRudi包括问题的答案并不是目前的常见做法。它使问题无缘无故地太长,重复了一些东西。你可以把你发现的方法作为你问题的另一个答案。并将证明对您最有用的一个标记为解决方案(您也可以接受自己的答案)。