只有在空间有限的情况下,才值得尝试就地执行此操作。如果是这样,可以通过遍历数组的展平视图来稍微加快代码的速度。由于在可能的情况下会
reshape返回新视图,因此不会复制数据本身(除非原始数据具有异常的结构)。
我不知道一种更好的方法来实现任意Python函数的真正就地应用。
>>> def flat_for(a, f):... a = a.reshape(-1)... for i, v in enumerate(a):... a[i] = f(v)... >>> a = numpy.arange(25).reshape(5, 5)>>> flat_for(a, lambda x: x + 5)>>> aarray([[ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14], [15, 16, 17, 18, 19], [20, 21, 22, 23, 24], [25, 26, 27, 28, 29]])
一些时间:
>>> a = numpy.arange(2500).reshape(50, 50)>>> f = lambda x: x + 5>>> %timeit flat_for(a, f)1000 loops, best of 3: 1.86 ms per loop
它大约是嵌套循环版本的两倍:
>>> a = numpy.arange(2500).reshape(50, 50)>>> def nested_for(a, f):... for i in range(len(a)):... for j in range(len(a[0])):... a[i][j] = f(a[i][j])... >>> %timeit nested_for(a, f)100 loops, best of 3: 3.79 ms per loop
当然矢量化仍然更快,因此,如果可以进行复制,请使用以下方法:
>>> a = numpy.arange(2500).reshape(50, 50)>>> g = numpy.vectorize(lambda x: x + 5)>>> %timeit g(a)1000 loops, best of 3: 584 us per loop
如果可以
dim使用内置的ufuncs进行重写,请不要
vectorize:
>>> a = numpy.arange(2500).reshape(50, 50)>>> %timeit a + 5100000 loops, best of 3: 4.66 us per loop
numpy就像
+=您所期望的那样执行类似的操作-
因此您可以免费使用就地应用程序来获得ufunc的速度。有时甚至更快!请参阅此处的示例。
顺便说一句,我对这个问题的原始答案很荒谬,涉及到将索引向量化到,这个答案在编辑历史记录中可以看到
a。它不仅必须做一些时髦的东西,以旁路
vectorize的类型检测机制,它竟然是一样缓慢,因为嵌套循环版本。太聪明了!



