我在目前正在进行的项目中遇到了一个小问题.
直截了当,让我们假设我有一个二维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功能吗?如果没有,任何想法如何实现这一点?
关于问题的第一部分,您可以使用简单的索引,并且可以创建数组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]])
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)