猿问

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

在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列表。

我们能做得更好吗?



幕布斯7119047
浏览 2404回答 3
3回答

PIPIONE

应用该函数的“直接”方法始终是在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和编译器优化将有不同的结果,因此对您的环境进行类似的测试。
随时随地看视频慕课网APP

相关分类

Python
我要回答