def parse_array(self, ar):
"""
Consolidate an array to something smaller and remains
broadcastable to the original dimensions. ndim remains the same.
todo:
- if squeezable in multiple dimensions, squeeze in all dimensions.
it currently does this, but the entire most_squeezable_dim can be
left out.
:param ar: array to be parsed
:return: consolidated array
"""
assert isinstance(ar, np.ndarray)
output = np.unique(ar)
if output.size == 1:
return 0, output.item()
elif output.size == 0:
return -1, output
else:
items_per_squeezed_dim = ar.ndim * [0]
for dim in range(ar.ndim):
output, index = uniquend(ar, axis=dim, return_index=True)
if len(index) == 1:
items_per_squeezed_dim[dim] = output.size
else:
items_per_squeezed_dim[dim] = ar.size
most_squeezable_dim = items_per_squeezed_dim.index(
min(items_per_squeezed_dim))
if ar.size == items_per_squeezed_dim[most_squeezable_dim]:
return -1, ar
else:
# can be squeezable in multiple dimensions
# therefore call self
cur = uniquend(ar, axis=most_squeezable_dim)
# test if broadcastable shape, same elements values
assert np.array_equiv(ar, cur)
return 1, self.parse_array(cur)[1]
评论列表
文章目录