Python-在numpy数组上映射函数的最有效方法

发布于 2021-02-02 23:18:27

在numpy数组上映射函数的最有效方法是什么?我在当前项目中所做的工作如下:

import numpy as np 

x = np.array([1, 2, 3, 4, 5])

# Obtain array of square of each element in x
squarer = lambda t: t ** 2
squares = np.array([squarer(xi) for xi in x])

但是,这似乎效率很低,因为我正在使用列表推导将新数组构造为Python列表,然后再将其转换回numpy数组。

关注者
0
被浏览
138
1 个回答
  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

    我测试过的所有建议的方法,加上np.array(map(f, x))perfplot(我的一个小项目)。

    消息1:如果可以使用numpy的本机函数,请执行此操作。

    如果你想已经矢量化功能的矢量(如x**2在原岗位的例子),使用的是多比什么都更快(注意对数标度):

    如果你确实需要向量化,那么使用哪种变体并不重要。

    复制剧情的代码:

    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)',
        )
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看