I think we really need copy (and maybe deepcopy) functions that work with all transforms, not just Separable transforms. This looks fairly easy except for one thing: the transform creation functions return objects that don't provide any clean way of distinguishing among the types of transform. type(trans) reports <type 'Affine'>, regardless of what kind of transform it really is. I have not been able to figure out where this is coming from. One can't cleanly use hasattr(funcxy) to detect a Nonseparable transform because all transforms have the attribute, whether they use it or not. I could use "try: trans.get_funcxy()" and catch the exception, but that is ugly. (And the second time I tried it, it hung ipython.)
I suspect you have thought about this already--do you have any suggested solutions? Is there at least a simple way to get type(trans) to work right? From the code it looks like it should, so there appears to be a bug in the code or in cxx.