如何在numpy中组合索引数组和切片

时间:2017-06-08 13:25:22

标签: python arrays numpy

我对索引数组和切片的组合有问题。我有一个图像(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 []上)?

2 个答案:

答案 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()]

即使用成对点进行花式索引。