为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

幕布斯7119047 2019-07-06 14:50:57
在numpy数组上映射函数的最有效方法在numpy数组上映射函数的最有效方法是什么?我在当前项目中所做的工作如下:import numpy as np  x = np.array([1, 2, 3, 4, 5])# Obtain array of square of each element in xsquarer = lambda t: t ** 2squares = np.array([squarer(xi) for xi in x])然而,这似乎非常低效,因为在将新数组转换回numpy数组之前,我正在使用列表理解来将新数组构造为Python列表。我们能做得更好吗?
查看完整描述

3 回答

?
PIPIONE

TA贡献1829条经验 获得超9个赞

应用该函数的“直接”方法始终是在Numpy数组上映射函数的最快和最简单的方法:

import numpy as np
x = np.array([1, 2, 3, 4, 5])f = lambda x: x ** 2squares = f(x)

一般避免np.vectorize,因为它没有很好的表现,并且有(或有)一些问题..如果您正在处理其他数据类型,则可能需要研究下面所示的其他方法。

方法比较

下面是一些简单的测试来比较三个方法来映射一个函数,这个例子使用Python3.6和NumPy1.15.4。首先,用于测试的设置函数:

import timeitimport numpy as np

f = lambda x: x ** 2vf = np.vectorize(f)def test_array(x, n):
    t = timeit.timeit(
        'np.array([f(xi) for xi in x])',
        'from __main__ import np, x, f', number=n)
    print('array: {0:.3f}'.format(t))def test_fromiter(x, n):
    t = timeit.timeit(
        'np.fromiter((f(xi) for xi in x), x.dtype, count=len(x))',
        'from __main__ import np, x, f', number=n)
    print('fromiter: {0:.3f}'.format(t))def test_direct(x, n):
    t = timeit.timeit(
        'f(x)',
        'from __main__ import x, f', number=n)
    print('direct: {0:.3f}'.format(t))def test_vectorized(x, n):
    t = timeit.timeit(
        'vf(x)',
        'from __main__ import x, vf', number=n)
    print('vectorized: {0:.3f}'.format(t))

使用五个元素(从最快到最慢)进行测试:

x = np.array([1, 2, 3, 4, 5])n = 100000test_direct(x, n)      # 0.265test_fromiter(x, n)    # 0.479test_array(x, n)     
  # 0.865test_vectorized(x, n)  # 2.906

有100多个元素:

x = np.arange(100)n = 10000test_direct(x, n)      # 0.030test_array(x, n)       # 0.501test_vectorized(x, n) 
 # 0.670test_fromiter(x, n)    # 0.883

以及1000 s或更多的数组元素:

x = np.arange(1000)n = 1000test_direct(x, n)      # 0.007test_fromiter(x, n)    # 0.479test_array(x, n)     
  # 0.516test_vectorized(x, n)  # 0.945

不同版本的Python/NumPy和编译器优化将有不同的结果,因此对您的环境进行类似的测试。


查看完整回答
反对 回复 2019-07-06
  • 3 回答
  • 0 关注
  • 2403 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信