给定一个2D数组和一个具有索引(x,y)的特定元素,如何获得以该元素为中心的子集正方形2D数组(n x n)?
只有子集数组的大小完全在原始数组的范围内时,我才能实现它。如果特定元素位于原始数组的边缘或角落附近,我会遇到问题。在这种情况下,子集数组必须具有原始数组外部元素的nan值。
答案 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)