Most efficient way to map function over numpy array

前端 未结 11 1339
庸人自扰
庸人自扰 2020-11-22 02:13

What is the most efficient way to map a function over a numpy array? The way I\'ve been doing it in my current project is as follows:

import numpy as np 

x          


        
11条回答
  •  悲哀的现实
    2020-11-22 02:38

    I've tested all suggested methods plus np.array(map(f, x)) with perfplot (a small project of mine).

    Message #1: If you can use numpy's native functions, do that.

    If the function you're trying to vectorize already is vectorized (like the x**2 example in the original post), using that is much faster than anything else (note the log scale):

    If you actually need vectorization, it doesn't really matter much which variant you use.


    Code to reproduce the plots:

    import numpy as np
    import perfplot
    import math
    
    
    def f(x):
        # return math.sqrt(x)
        return np.sqrt(x)
    
    
    vf = np.vectorize(f)
    
    
    def array_for(x):
        return np.array([f(xi) for xi in x])
    
    
    def array_map(x):
        return np.array(list(map(f, x)))
    
    
    def fromiter(x):
        return np.fromiter((f(xi) for xi in x), x.dtype)
    
    
    def vectorize(x):
        return np.vectorize(f)(x)
    
    
    def vectorize_without_init(x):
        return vf(x)
    
    
    perfplot.show(
        setup=lambda n: np.random.rand(n),
        n_range=[2 ** k for k in range(20)],
        kernels=[f, array_for, array_map, fromiter, vectorize, vectorize_without_init],
        xlabel="len(x)",
    )
    

提交回复
热议问题