3

问题:

给定一个ndarray:

In [2]: a
Out[2]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

我寻找一个例程给我:

array([7, 8, 9, 0, 1])

例如:从索引 8 开始,跨越数组边界并在索引 2 处停止(包括)如果我使用切片,我(当然)得到:

In [3]: a[-3:2]
Out[3]: array([], dtype=int64)

一个可能的答案:

就是使用翻滚功能。

In [5]: np.roll(a,3)[:5]
Out[5]: array([7, 8, 9, 0, 1])

我要找的东西:

我不喜欢这个,它不像切片那么简单。所以我寻找类似的东西:

In [6]: a.xxx[-3:2]

例如在pandas.DataFrame.iloc中存在与此类似的语法。非常感谢您!

注意:iloc,不做我想做的事。我只是提到了语法(我喜欢)。感谢您的评论,cᴏʟᴅsᴘᴇᴇᴅ

4

3 回答 3

3

python/numpy 中没有任何切片机制可以自动环绕列表/数组(作为循环容器),就像您正在寻找的那样,所以真正做到这一点的唯一方法是使用函数。你正在做的事情roll既好又紧凑,即使它不像你喜欢的那样惯用。下面,我概述了几个(稍微多一点)惯用/pythonic 解决方案,它们做同样的事情。

选项 1
np.take基于hpaulj 的评论

np.take(a, range(len(a) - 3, len(a) + 2), mode='wrap')
array([7, 8, 9, 0, 1])

选项 2
islice对象cycle

from itertools import islice, cycle

list(islice(cycle(a), len(a) - 3, len(a) + 2))
[7, 8, 9, 0, 1] 
于 2018-02-07T08:56:13.893 回答
1

不像coldspeeds解决方案或滚动那么漂亮,但是

def over_edge_slicing(arr, start, end):
    return np.append(arr[start:], arr[:end])

a = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
print(over_edge_slicing(a, -3, 2))

将是另一种方式来写这个。但是,您失去了一般性(例如,您不能使用它从索引 2-4 切片)。

于 2018-02-07T09:02:43.203 回答
0

采用np.arange()

在问了这个问题 3 年后,这个问题突然出现在我的脑海中......

>>> a = np.arange(10)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> a[np.arange(-3, 2)]
array([7, 8, 9, 0, 1])
于 2021-04-16T09:24:11.600 回答