';环绕';在python/numpy中进行切片时
我有一个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(
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包括问题的答案并不是目前的常见做法。它使问题无缘无故地太长,重复了一些东西。你可以把你发现的方法作为你问题的另一个答案。并将证明对您最有用的一个标记为解决方案(您也可以接受自己的答案)。