我在目前正在进行的项目中遇到一个小问题。
直截了当,让我们假设我有一个二维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]
])
实际上,numpy
对arr[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
功能?如果没有,任何想法如何实现这个?
答案 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索引示例。你可以玩弄它来做你期望的事情