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

标签 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]
])

实际上,numpyarr[3:7, 3:7] 的响应是:

array([[19, 20],
       [24, 25]])

但我需要填充它,就好像 arr 比实际的大。

这是我需要的响应 arr[3:7, 3:7]:

array([[19, 20,  0,  0],
       [24, 25,  0,  0],
       [ 0,  0,  0,  0],
       [ 0,  0,  0,  0]])

这种填充也应该出现在负指数的情况下。如果请求的切片大于整个图像,则填充必须出现在所有边上(如果需要)。

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

array([[ 0,  0,  0,  0],
       [ 0,  0,  1,  2],
       [ 0,  0,  6,  7],
       [ 0,  0, 11, 12]])

有没有原生的 numpy 函数?如果没有,我知道如何实现吗?

最佳答案

关于问题的第一部分,您可以使用简单的索引,并且可以使用 numpy.zeros_like 创建数组的 zero_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]])

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

>>> arr[-2:2]
array([], shape=(0, 5), dtype=int64)

关于python - 如何获得多维数组的填充切片?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29962593/

相关文章:

python - 创建包含特定元素的数组列表

python - 使用Python拉取一个目录下所有pdf文档的页数

python - 在 Python 中重现一个 C 函数指针数组

python - 在python numpy中是否有更快的方法来有效地执行此伪代码?

python - 如何保存从 python 中的稀疏库创建的稀疏矩阵

python - 生成相同项目索引的排列

python - 使用多个条件遍历数据框的正确方法

python - 如何从元组列表中删除项目?

python - 根据多种条件将列表中的项目替换为其他项目(小列表)

python - numpy 识别的特殊方法的文档位置