在给定中心点索引的情况下获取2D数组的子集

时间:2019-07-11 07:30:27

标签: python python-3.x numpy

给定一个2D数组和一个具有索引(x,y)的特定元素,如何获得以该元素为中心的子集正方形2D数组(n x n)?

只有子集数组的大小完全在原始数组的范围内时,我才能实现它。如果特定元素位于原始数组的边缘或角落附近,我会遇到问题。在这种情况下,子集数组必须具有原始数组外部元素的nan值。

Example illustration

2 个答案:

答案 0 :(得分:1)

这是我的处理方式:

def fixed_size_subset(a, x, y, size):
    '''
    Gets a subset of 2D array given a x and y coordinates
    and an output size. If the slices exceed the bounds 
    of the input array, the non overlapping values
    are filled with NaNs
    ----
    a: np.array
        2D array from which to take a subset
    x, y: int. Coordinates of the center of the subset
    size: int. Size of the output array
    ----       
    Returns:
        np.array
        Subset of the input array
    '''
    o, r = np.divmod(size, 2)
    l = (x-(o+r-1)).clip(0)
    u = (y-(o+r-1)).clip(0)
    a_ = a[l: x+o+1, u:y+o+1]
    out = np.full((size, size), np.nan, dtype=a.dtype)
    out[:a_.shape[0], :a_.shape[1]] = a_
    return out

样品运行:

# random 2D array
a = np.random.randint(1,5,(6,6))

array([[1, 3, 2, 2, 4, 1],
       [1, 3, 1, 3, 3, 2],
       [1, 1, 4, 4, 2, 4],
       [1, 2, 3, 4, 1, 1],
       [4, 1, 4, 2, 3, 4],
       [3, 3, 2, 3, 2, 1]])

fixed_size_subset(a, 3, 3, 5)

array([[3., 1., 3., 3., 2.],
       [1., 4., 4., 2., 4.],
       [2., 3., 4., 1., 1.],
       [1., 4., 2., 3., 4.],
       [3., 2., 3., 2., 1.]])

让我们尝试一些示例,其中切片的数组小于预期的输出大小:

fixed_size_subset(a, 4, 1, 4)

array([[ 1.,  2.,  3.,  4.],
       [ 4.,  1.,  4.,  2.],
       [ 3.,  3.,  2.,  3.],
       [nan, nan, nan, nan]])

fixed_size_subset(a, 5, 5, 3)

array([[ 3.,  4., nan],
       [ 2.,  1., nan],
       [nan, nan, nan]])

以下内容也可以工作:

fixed_size_subset(a, -1, 0, 3)

array([[ 1.,  3., nan],
       [nan, nan, nan],
       [nan, nan, nan]])

答案 1 :(得分:0)

用NaNs填充数组,然后选择相应移位的子数组可以解决问题。 np.pad(arr, (2, 2), "constant", constant_values = np.NaN)