在数组边界上切片 ndarrays
Slicing of ndarrays over array boundaries
问题:
给定一个数组:
In [2]: a
Out[2]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
我正在寻找一个例程给我:
array([7, 8, 9, 0, 1])
Ex.: 从索引 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ᴘᴇᴇᴅ
python/numpy 中没有任何切片机制可以自动环绕 lists/arrays(作为圆形容器),正如您似乎正在寻找的那样,所以真正做到这一点的唯一方法是使用职能。你用 roll
做的事情既漂亮又紧凑,即使它不像你喜欢的那样地道。下面,我概述了几个(稍微多一些)idiomatic/pythonic 解决方案,它们做同样的事情。
选项 1
np.take
基于 :
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]
不如冷速解决方案或滚动那么漂亮,但是
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 进行切片)。
使用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])
问题:
给定一个数组:
In [2]: a
Out[2]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
我正在寻找一个例程给我:
array([7, 8, 9, 0, 1])
Ex.: 从索引 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ᴘᴇᴇᴅ
python/numpy 中没有任何切片机制可以自动环绕 lists/arrays(作为圆形容器),正如您似乎正在寻找的那样,所以真正做到这一点的唯一方法是使用职能。你用 roll
做的事情既漂亮又紧凑,即使它不像你喜欢的那样地道。下面,我概述了几个(稍微多一些)idiomatic/pythonic 解决方案,它们做同样的事情。
选项 1
np.take
基于
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]
不如冷速解决方案或滚动那么漂亮,但是
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 进行切片)。
使用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])