How to get the borders of "numpy.array"?

If I have size d np.array , how can I get pointers to the border?

For example, in 2d,

 test = np.arange(16).reshape((4, 4)) test array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11], [12, 13, 14, 15]]) 

Now I would like to get the boundaries

 array([[ True, True, True, True], [ True, False, False, True], [ True, False, False, True], [ True, True, True, True]]) 

It’s great if it is effective and works for an arbitrary number of dimensions, but it should work at least 3. The array is not necessarily a hypercube, but perhaps a hyperreceptor: the number of grid points in all dimensions is not necessarily the same, unlike the example.

For an array of form (4, 5, 6) expected result

 array([[[ True, True, True, True, True, True], [ True, True, True, True, True, True], [ True, True, True, True, True, True], [ True, True, True, True, True, True], [ True, True, True, True, True, True]], [[ True, True, True, True, True, True], [ True, False, False, False, False, True], [ True, False, False, False, False, True], [ True, False, False, False, False, True], [ True, True, True, True, True, True]], [[ True, True, True, True, True, True], [ True, False, False, False, False, True], [ True, False, False, False, False, True], [ True, False, False, False, False, True], [ True, True, True, True, True, True]], [[ True, True, True, True, True, True], [ True, True, True, True, True, True], [ True, True, True, True, True, True], [ True, True, True, True, True, True], [ True, True, True, True, True, True]]], dtype=bool) 
+7
python numpy
source share
1 answer

You can do this by constructing a tuple of slices, for example

 import numpy as np def edge_mask(x): mask = np.ones(x.shape, dtype=bool) mask[x.ndim * (slice(1, -1),)] = False return mask x = np.random.rand(4, 5) edge_mask(x) # array([[ True, True, True, True, True], # [ True, False, False, False, True], # [ True, False, False, False, True], # [ True, True, True, True, True]], dtype=bool) 
+7
source share

All Articles