Introduction and a question

56 views
Skip to first unread message

Mark Juers

unread,
Mar 10, 2019, 3:56:33 AM3/10/19
to sympy
I'm a 4th-year PhD student in evolutionary biology at Indiana University in Bloomington, IN. I've been using Python for about a year for various biology projects and am working on a package related to my dissertation work.  I am looking to replace Mathematica with SymPy in my workflow. I use Git and Github for my research projects and for personal projects, dotfiles, etc. as well.

Now for my question. Suppose I have an expression like the following:

        from sympy import *
    var('a:d')
    w = Wild('w')
    test = a * (1 - c) + b * (c - 1) + d

I'd like to rewrite test as (a - b) * (1 - c) + d
I tried test.replace(a * w - b * w, collect(a * w - b * w, w)), but this does not work.

Many thanks in advance for your help.

Oscar Benjamin

unread,
Mar 10, 2019, 5:37:23 AM3/10/19
to sympy
I'm not sure if this would work for your real problem but for this
example you can do:

In [8]: factor(test-d)+d
Out[8]: d - (a - b)⋅(c - 1)
> --
> You received this message because you are subscribed to the Google Groups "sympy" group.
> To unsubscribe from this group and stop receiving emails from it, send an email to sympy+un...@googlegroups.com.
> To post to this group, send email to sy...@googlegroups.com.
> Visit this group at https://groups.google.com/group/sympy.
> To view this discussion on the web visit https://groups.google.com/d/msgid/sympy/e14dd72b-ddc3-4280-93a3-faa42af092a3%40googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.

Mark Juers

unread,
Mar 10, 2019, 12:01:22 PM3/10/19
to sympy
In my real problem, d is an arbitrarily complex expression I'd rather not type out in full, and the factored part is inside a subexpression, so I'm not sure I could get this to work.

Oscar Benjamin

unread,
Mar 10, 2019, 1:55:06 PM3/10/19
to sympy
There probably is a better way of doing this in your problem but I
just want to point out a way to "manually" extract parts of an
expression. Let's create an expression with a few parts:

In [1]: a, b, c, x = symbols('a b c x')

In [2]: p = a*x**2 + b*x + c

In [3]: r1, r2 = solve(p, x)

In [4]: r1
Out[4]:
_____________
╱ 2
-b + ╲╱ -4⋅a⋅c + b
─────────────────────
2⋅a

Okay now suppose I want to get the discriminant out from inside the
square root and do something with it. I can use the .args attribute of
each sympy expression to drill down to the part I want like this:

In [5]: r1.args
Out[5]:
⎛ _____________⎞
⎜ 1 ╱ 2 ⎟
⎜1/2, ─, -b + ╲╱ -4⋅a⋅c + b ⎟
⎝ a ⎠

In [6]: r1.args[2]
Out[6]:
_____________
╱ 2
-b + ╲╱ -4⋅a⋅c + b

In [7]: r1.args[2].args
Out[7]:
⎛ _____________ ⎞
⎜ ╱ 2 ⎟
⎝╲╱ -4⋅a⋅c + b , -b⎠

In [8]: r1.args[2].args[0]
Out[8]:
_____________
╱ 2
╲╱ -4⋅a⋅c + b

In [9]: r1.args[2].args[0].args
Out[9]:
⎛ 2 ⎞
⎝-4⋅a⋅c + b , 1/2⎠

In [10]: r1.args[2].args[0].args[0]
Out[10]:
2
-4⋅a⋅c + b


On Sun, 10 Mar 2019 at 16:01, Mark Juers <mpj...@gmail.com> wrote:
>
> In my real problem, d is an arbitrarily complex expression I'd rather not type out in full, and the factored part is inside a subexpression, so I'm not sure I could get this to work.
>
> --
> You received this message because you are subscribed to the Google Groups "sympy" group.
> To unsubscribe from this group and stop receiving emails from it, send an email to sympy+un...@googlegroups.com.
> To post to this group, send email to sy...@googlegroups.com.
> Visit this group at https://groups.google.com/group/sympy.
> To view this discussion on the web visit https://groups.google.com/d/msgid/sympy/1b8b1b7e-22ea-4ae9-9338-f0829e2341b2%40googlegroups.com.

Aaron Meurer

unread,
Mar 13, 2019, 3:11:00 PM3/13/19
to sy...@googlegroups.com
If you follow the StackOverflow links at
https://github.com/sympy/sympy/issues/11869 you can see some
suggestions on how to do this sort of thing.

Aaron Meurer
> --
> You received this message because you are subscribed to the Google Groups "sympy" group.
> To unsubscribe from this group and stop receiving emails from it, send an email to sympy+un...@googlegroups.com.
> To post to this group, send email to sy...@googlegroups.com.
> Visit this group at https://groups.google.com/group/sympy.
> To view this discussion on the web visit https://groups.google.com/d/msgid/sympy/e14dd72b-ddc3-4280-93a3-faa42af092a3%40googlegroups.com.

Chris Smith

unread,
Mar 22, 2019, 12:00:03 PM3/22/19
to sympy
Perhaps the loosely connected components could be identified in some canonical way. #16225 
Reply all
Reply to author
Forward
0 new messages