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

时间:2015-04-30 08:21:15

标签: 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功能?如果没有,任何想法如何实现这个?

3 个答案:

答案 0 :(得分:3)

您可以执行以下操作:

print np.lib.pad(arr[3:7,3:7], ((0, 2), (0, 2)), 'constant', constant_values=(0,0 ))



[[19 20  0  0]
 [24 25  0  0]
 [ 0  0  0  0]
 [ 0  0  0  0]]

负面索引:

print np.lib.pad(arr[ max(0,-1):3 , 0:2 ], ((1, 0), (2, 0)), 'constant', constant_values=(0,0 ))

[[ 0  0  0  0]
 [ 0  0  1  2]
 [ 0  0  6  7]
 [ 0  0 11 12]]

检查here以获取参考

答案 1 :(得分:3)

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

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

-2

答案 2 :(得分:1)

import numpy as np

def convert(inarr, x1, x2, y1, y2):
  xd = x2 - x1
  yd = y2 - y1
  outarr = np.zeros(xd * yd).reshape(xd, yd)
  x1fr = max(0, x1)
  x2fr = min(x2, inarr.shape[0])
  y1fr = max(0, y1)
  y2fr = min(y2, inarr.shape[1])
  x1to = max(0, xd - x2) 
  x2to = x1to + x2fr - x1fr
  y1to = max(0, yd - y2)
  y2to = y1to + y2fr - y1fr
  outarr[x1to:x2to, y1to:y2to] = inarr[x1fr:x2fr, y1fr:y2fr]
  return outarr


arr = np.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]])

print(convert(arr, -2, 2, -1, 3))

这有效但返回

[[ 0.  0.  0.  0.]
 [ 0.  0.  0.  0.]
 [ 0.  1.  2.  3.]
 [ 0.  6.  7.  8.]]

为你的-ve索引示例。你可以玩弄它来做你期望的事情

相关问题