在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个赞
import numpy as np x = np.array([1, 2, 3, 4, 5])f = lambda x: x ** 2squares = f(x)
np.vectorize
方法比较
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
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
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
添加回答
举报
0/150
提交
取消