Efficient evaluation of a function at every cell of a NumPy array

arrays, numpy, performance, python, vectorization

Solution

You could just vectorize the function and then apply it directly to a Numpy array each time you need it:

import numpy as np

def f(x):
    return x * x + 3 * x - 2 if x > 0 else x * 5 + 8

f = np.vectorize(f)  # or use a different name if you want to keep the original f

result_array = f(A)  # if A is your Numpy array

It's probably better to specify an explicit output type directly when vectorizing:

f = np.vectorize(f, otypes=[np.float])

Problem

Given NumPy array `A`, what is the fastest/most efficient way to apply the same function `f()` to every cell? I assign to `A(i,j)` by `f(A(i,j))`. Function `f()` doesn't have binary output, so masking operations won't help. Is double loop iteration through every cell the optimal solution?

Original source

Related problems