Numpy fusing multiply and add to avoid wasting memory
Numpy only supports operations one at a time. With that said, there are several workarounds.
In place operations
The most simple solution is to use in-place operations via +=
and *=
import numpy as np
n = 100
b = 5.0
x = np.random.rand(n)
y = np.random.rand(n)
z = b * x
z += y
BLAS
You can access the underlying BLAS programs and apply them manually. Sadly, there is no multiply add instruction, but there is the "AXPY" instruction, which performs
y <- a * x + y
This can be called via:
import scipy
axpy = scipy.linalg.blas.get_blas_funcs('axpy', arrays=(x, y))
axpy(x, y, n, b)
Numexpr
Another option is to use some package like numexpr
which allows you to compile expressions:
import numexpr
z = numexpr.evaluate('b * x + y')
Theano
Recently several machine-learning packages have started supporting compiled expressions, one such package is theano. You could do something like:
import theano
x = theano.tensor.vector() # declare variable
y = theano.tensor.vector() # declare variable
out = b * x + y # build symbolic expression
f = theano.function([x, y], out) # compile function
z = f(x, y)