如何获得多维数组的填充切片?

Rod*_*ira 9 python numpy

我在目前正在进行的项目中遇到了一个小问题.

直截了当,让我们假设我有一个二维numpy.array- 我会称之为arr.

我需要切片arr,但这个切片必须包含一些填充,具体取决于所选的间隔.

例:

arr = numpy.array([
    [  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]
])
Run Code Online (Sandbox Code Playgroud)

实际上,numpy的回应arr[3:7, 3:7]是:

array([[19, 20],
       [24, 25]])
Run Code Online (Sandbox Code Playgroud)

但是我需要它填充,好像arr比实际更大.

以下是我需要的回复arr[3:7, 3:7]:

array([[19, 20,  0,  0],
       [24, 25,  0,  0],
       [ 0,  0,  0,  0],
       [ 0,  0,  0,  0]])
Run Code Online (Sandbox Code Playgroud)

负指数的情况下也应该出现这种填充.如果请求的切片大于整个图像,则必须在所有侧面进行填充.

另一个例子,负面指数.这是预期的结果arr[-2:2, -1:3]:

array([[ 0,  0,  0,  0],
       [ 0,  0,  1,  2],
       [ 0,  0,  6,  7],
       [ 0,  0, 11, 12]])
Run Code Online (Sandbox Code Playgroud)

这有什么原生numpy功能吗?如果没有,任何想法如何实现这一点?

Kas*_*mvd 3

关于问题的第一部分,您可以使用简单的索引,并且可以创建数组zero_likenumpy.zeros_like然后分配特殊部分:

>>> new=numpy.zeros_like(arr)
>>> part=arr[3:7, 3:7]
>>> i,j=part.shape
>>> new[:i,:j]=part
>>> new
array([[19, 20,  0,  0,  0],
       [24, 25,  0,  0,  0],
       [ 0,  0,  0,  0,  0],
       [ 0,  0,  0,  0,  0],
       [ 0,  0,  0,  0,  0]])
Run Code Online (Sandbox Code Playgroud)

但对于第二种情况,您不能像这样对 numpy 数组使用负索引。负索引被解释为从数组末尾开始计数-2,因此如果您在 5x5 数组中实际计数,则 -2 和 2 之间没有任何行,因此结果将是一个空数组:

>>> arr[-2:2]
array([], shape=(0, 5), dtype=int64)
Run Code Online (Sandbox Code Playgroud)