thunder-project / thunder

scalable analysis of images and time series
http://thunder-project.org
Apache License 2.0
814 stars 184 forks source link

Dimensions from image.mean() or other across images methods & image.squeeze() functionality #287

Open kr-hansen opened 8 years ago

kr-hansen commented 8 years ago

I was interested to know why when an across images method is applied, such as image.mean(), image.max(), or image.std(), that the final dimensions are left as (1, dim1, dim2), rather than squeezing out the first singleton dimension? I ran into a couple bumps from this functionality.

In the registration tutorials, to create a reference, .toarray() is always used. I'm guessing because it is assumed the tutorials are being done in local mode. toarray() squeezes out these extra dimensions.

When generating my own reference as a mean, image.mean() provides this additional dimension so that in and of itself does not work as a reference because the dimensions don't match. I attempted to do a image.squeeze() to fix this, but it didn't work, as it only works from [1:] in lines 240-245 of thunder/images.py:

def squeeze(self): """ Remove single-dimensional axes from images. """ axis = tuple(range(1, len(self.shape) - 1)) if prod(self.shape[1:]) == 1 else None return self.map(lambda x: x.squeeze(axis=axis))

Is there a reason that thunder is pushing/forcing a toarray() call to successfully squeeze out these dimensions? Would it be appropriate to have these functions that apply a function across all images simply return the array with a squeeze() call built in? Otherwise, could we alter images.squeeze() to remove that first singleton dimension?

I'd be happy to submit a pull request to try and implement this, but I wanted to understand the rationale behind why toarray() is currently the only way to squeeze out that dimension and images.squeeze() doesn't work that way, or even the condensing functions themselves (images.mean(), images.std(), etc...). That way it can be implemented in the most beneficial manner. I think simply altering images.squeeze() would be the simplest to change from a pull-request point of view.