This should be obvious to me, but I can't seem to figure it out. Is there a way to take a compound units expression like: dyne*cm**2/g**2 and split it into its constituent parts, so that I have a list like this: [dyne, cm, g] and maybe even containing the information about the powers?
There is a sympy atoms method. If x and y are symbols, then:
a = x*y print a.atoms(sympy.Symbol) set([x, y])
I suspect that this would work with the units defined in yt. There is
probably a way to get powers too.
On Tue, Sep 30, 2014 at 10:38 AM, John ZuHone
This should be obvious to me, but I can't seem to figure it out.
Is there a way to take a compound units expression like:
dyne*cm**2/g**2
and split it into its constituent parts, so that I have a list like this:
[dyne, cm, g]
and maybe even containing the information about the powers? _______________________________________________ yt-dev mailing list yt-dev@lists.spacepope.org http://lists.spacepope.org/listinfo.cgi/yt-dev-spacepope.org
-- Michael Zingale Associate Professor Dept. of Physics & Astronomy • Stony Brook University • Stony Brook, NY 11794-3800 *phone*: 631-632-8225 *e-mail*: Michael.Zingale@stonybrook.edu *web*: http://www.astro.sunysb.edu/mzingale
You can do something like Mike's example, but you need to remember that the sympy expr is contained in the expr attribute of the unit object: In [1]: q = yt.YTQuantity(3, 'g/cm**2/s') In [2]: q.units.expr.atoms() Out[2]: {-2, -1, cm, g, s} In [3]: srepr(q.units.expr) Out[3]: "Mul(Pow(Symbol('cm'), Integer(-2)), Symbol('g'), Pow(Symbol('s'), Integer(-1)))" In [4]: q.units.expr.args Out[4]: (g, cm**(-2), 1/s) The unit object itself is actually (a little embarrassingly) a sympy expression, but a trivial one that doesn't actually contain any unit information. Admittedly this is not the best for discoverability of what's going on under the hood, but making it a class that inherits from object will require a bit of work and refactoring. Note that if you want to transform these sympy subexpressions into unit objects, you'll need to pass them through the Unit() constructor. See e.g. the __mul__ or __div__ function definitions in the Unit class definition (in yt/units/unit_object.py). Hope that helps, Nathan On Tue, Sep 30, 2014 at 7:44 AM, Michael Zingale < michael.zingale@stonybrook.edu> wrote:
There is a sympy atoms method. If x and y are symbols, then:
a = x*y print a.atoms(sympy.Symbol) set([x, y])
I suspect that this would work with the units defined in yt. There is probably a way to get powers too.
On Tue, Sep 30, 2014 at 10:38 AM, John ZuHone
wrote: This should be obvious to me, but I can't seem to figure it out.
Is there a way to take a compound units expression like:
dyne*cm**2/g**2
and split it into its constituent parts, so that I have a list like this:
[dyne, cm, g]
and maybe even containing the information about the powers? _______________________________________________ yt-dev mailing list yt-dev@lists.spacepope.org http://lists.spacepope.org/listinfo.cgi/yt-dev-spacepope.org
-- Michael Zingale Associate Professor
Dept. of Physics & Astronomy • Stony Brook University • Stony Brook, NY 11794-3800 *phone*: 631-632-8225 *e-mail*: Michael.Zingale@stonybrook.edu *web*: http://www.astro.sunysb.edu/mzingale
_______________________________________________ yt-dev mailing list yt-dev@lists.spacepope.org http://lists.spacepope.org/listinfo.cgi/yt-dev-spacepope.org
participants (3)
-
John ZuHone
-
Michael Zingale
-
Nathan Goldbaum