Long time, no post, but now I have news to share!

`ufuncify`

stuffFirst, I just merged a PR to make SymPy's `ufuncify`

create actual instances of
`numpy.ufunc`

. This function takes in a tuple of arguments, and an expression,
and returns a binary function that will broadcast (apply the function to each
argument in turn) the arguments through the function, returning an array. An
example would be:

```
from sympy import *
from sympy.utilities.autowrap import ufuncify
import numpy as np
# Create an example expression
a, b, c = symbols('a, b, c')
expr = sin(a) + cos(b**2)*c
# Create a binary (compiled) function that broadcasts it's arguments
func = ufuncify((a, b, c), expr)
func(np.arange(5), 2.0, 3.0)
```

```
array([-1.96093086, -1.11945988, -1.05163344, -1.81981085, -2.71773336])
```

Previously all broadcasting was done using hardcoded loops. These limited arguments to:

- A single dimension array (only for the first argument)
- Scalars for the remaining arguments
- Floating point arguments (no type conversion)

Now, through the magic of `numpy.ufunc`

s:

*All*arguments can be n-dimensional arrays- Type conversion happens implicitly

This makes this functionality *incredibly* more useful. My next step is to add
the ability for multiple outputs, and a custom wrapper so that matrix calculations
can be broadcast as well. This should help with repeated computation of matrices,
which is something Jason
needs for his work. This should be done (hopefully) by the end of next week.

I gave a talk yesterday on code generation in SymPy for our local Python User Group. Discusses the why and how of the code generation tool chains we developed, and gives a little demo. Slides are here, and the corresponding demo here.

School recently started back up. In an effort to keep myself on task, I've started doing AIOs:

- Accomplishments: What did I do in the last week
- Issues: Things that came up and interfered with accomplishing things over the last week
- Objectives: Things I'd like to get done in the upcoming week. Note that these should be doable in ~1 week.

I've been hosting them on github in an effort to be open about my work, and update them every Friday. So far it seems to be a good idea - at the end of each week I get a chance to reflect on what I did that week, and what I plan to do over the next week. As a plus, my non-existant internet readers get to hold me accountable to my to-do list :).

comments powered by Disqus

All content copyright 2014-2017 Jim Crist unless otherwise noted. Licensed under Creative Commons.

Find me on Twitter, GitHub, Speaker Deck, or shoot me an email.