Commit b7a97729 authored by Markus Holzer's avatar Markus Holzer
Browse files

Generalised boolean_array_bounding_box

parent 24ef1d2f
import os import os
import itertools
from collections import Counter from collections import Counter
from contextlib import contextmanager from contextlib import contextmanager
from tempfile import NamedTemporaryFile from tempfile import NamedTemporaryFile
...@@ -96,16 +97,21 @@ def fully_contains(l1, l2): ...@@ -96,16 +97,21 @@ def fully_contains(l1, l2):
def boolean_array_bounding_box(boolean_array): def boolean_array_bounding_box(boolean_array):
"""Returns bounding box around "true" area of boolean array""" """Returns bounding box around "true" area of boolean array
dim = len(boolean_array.shape)
>>> a = np.zeros((4, 4), dtype=bool)
>>> a[1:-1, 1:-1] = True
>>> boolean_array_bounding_box(a)
[(1, 3), (1, 3)]
"""
dim = boolean_array.ndim
shape = boolean_array.shape
assert 0 not in shape, "Shape must not contain zero"
bounds = [] bounds = []
for i in range(dim): for ax in itertools.combinations(reversed(range(dim)), dim - 1):
for j in range(dim): nonzero = np.any(boolean_array, axis=ax)
if i != j: t = np.where(nonzero)[0][[0, -1]]
arr_1d = np.any(boolean_array, axis=j) bounds.append((t[0], t[1] + 1))
begin = np.argmax(arr_1d)
end = begin + np.argmin(arr_1d[begin:])
bounds.append((begin, end))
return bounds return bounds
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment