def test_rollaxis(): data = np.random.standard_normal((3,4,7,5)) im = Image(data, AffineTransform.from_params('ijkl', 'xyzt', np.diag([1,2,3,4,1]))) # for the inverse we must specify an integer yield assert_raises, ValueError, image.rollaxis, im, 'i', True # Check that rollaxis preserves diagonal affines, as claimed yield assert_almost_equal, image.rollaxis(im, 1).affine, np.diag([2,1,3,4,1]) yield assert_almost_equal, image.rollaxis(im, 2).affine, np.diag([3,1,2,4,1]) yield assert_almost_equal, image.rollaxis(im, 3).affine, np.diag([4,1,2,3,1]) # Check that ambiguous axes raise an exception # 'l' appears both as an axis and a reference coord name # and in different places im_amb = Image(data, AffineTransform.from_params('ijkl', 'xylt', np.diag([1,2,3,4,1]))) yield assert_raises, ValueError, image.rollaxis, im_amb, 'l' # But if it's unambiguous, then # 'l' can appear both as an axis and a reference coord name im_unamb = Image(data, AffineTransform.from_params('ijkl', 'xyzl', np.diag([1,2,3,4,1]))) im_rolled = image.rollaxis(im_unamb, 'l') yield assert_almost_equal, im_rolled.get_data(), \ im_unamb.get_data().transpose([3,0,1,2]) for i, o, n in zip('ijkl', 'xyzt', range(4)): im_i = image.rollaxis(im, i) im_o = image.rollaxis(im, o) im_n = image.rollaxis(im, n) yield assert_almost_equal, im_i.get_data(), \ im_o.get_data() yield assert_almost_equal, im_i.affine, \ im_o.affine yield assert_almost_equal, im_n.get_data(), \ im_o.get_data() for _im in [im_n, im_o, im_i]: im_n_inv = image.rollaxis(_im, n, inverse=True) yield assert_almost_equal, im_n_inv.affine, \ im.affine yield assert_almost_equal, im_n_inv.get_data(), \ im.get_data()
def from_image(klass, image, axis=0): # Now, reorder the axes and reference image = rollaxis(image, axis) imlist = [] coordmap = image.coordmap # We drop the first output coordinate of image's coordmap drop1st = np.identity(coordmap.ndims[1]+1)[1:] drop1st_domain = image.reference drop1st_range = CoordinateSystem(image.reference.coord_names[1:], name=image.reference.name, coord_dtype=image.reference.coord_dtype) drop1st_coordmap = AffineTransform(drop1st_domain, drop1st_range, drop1st) # And arbitrarily add a 0 for the first axis add0 = np.vstack([np.zeros(image.axes.ndim), np.identity(image.axes.ndim)]) add0_domain = CoordinateSystem(image.axes.coord_names[1:], name=image.axes.name, coord_dtype=image.axes.coord_dtype) add0_range = image.axes add0_coordmap = AffineTransform(add0_domain, add0_range, add0) coordmap = compose(drop1st_coordmap, image.coordmap, add0_coordmap) data = np.asarray(image) imlist = [Image(dataslice, copy(coordmap)) for dataslice in data] return klass(imlist)