我对索引数组和切片的组合有问题。我有一个图像(A)和一个位置/索引(pos)的矢量。现在,我想在不同位置从A中选择切片(此处为3x)。我试图使用索引器函数(o1)而不是循环遍历位置数组,但我不起作用。 最后,所有切片应该在一个数组(o2)中。 你能帮我解决这个问题吗?
A = np.array([[0,0,0,0,0,0,3,3],
[0,0,0,0,0,0,3,3],
[0,0,0,1,1,0,0,0],
[0,0,0,1,1,0,0,0],
[0,0,0,0,0,0,2,2],
[0,0,0,0,0,0,2,2],
[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0]])
# positions to select
# EDIT:
# pos = np.array([[2,6,7],
# [3,4,0]])
pos = np.array([[2,4,0],
[3,6,6]])
# array with all selections
o1 = np.zeros((3,2,2)).astype(np.int)
# EDIT:
#o1 = A[pos[0]:pos[0]+1,pos[1]:pos[1]+1] ## this gives just one of the values in one area
o1 = A[pos[0]:pos[0] + 2,pos[1]:pos[1] + 2]
print(o1.shape)
print(o1)
# model result
o2 = np.array([[[1,1],[1,1]],[[2,2],[2,2]],[[3,3],[3,3]]])
print(o2.shape)
print(o2)
另一个例子:使用以下行我得到的区域。从位置[2,3]开始,选择接下来的两行和列:
print( A[pos[0,0] : pos[0,0] + 2 , pos[1,0] : pos[1,0] + 2] )
是不是可以将它扩展到几个位置对(在整个数组pos []上)?
答案 0 :(得分:1)
您可以使用scikit's sliding window utility
以非常直接的方式从pos
给出开始索引来提取此类窗口 -
from skimage.util.shape import view_as_windows
out = view_as_windows(A, (2,2))[pos[0], pos[1]]
示例运行 -
In [225]: A
Out[225]:
array([[0, 0, 0, 0, 0, 0, 3, 3],
[0, 0, 0, 0, 0, 0, 3, 3],
[0, 0, 0, 1, 1, 0, 0, 0],
[0, 0, 0, 1, 1, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 2, 2],
[0, 0, 0, 0, 0, 0, 2, 2],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0]])
In [226]: pos = np.array([[2,4,0],[3,6,6]])
In [227]: from skimage.util.shape import view_as_windows
In [228]: view_as_windows(A, (2,2))[pos[0], pos[1]]
Out[228]:
array([[[1, 1],
[1, 1]],
[[2, 2],
[2, 2]],
[[3, 3],
[3, 3]]])
答案 1 :(得分:0)
看起来你想要这个:
A[pos.tolist()]
即使用成对点进行花式索引。