python教程—映射适当的NumPy数组-Python实用宝典

python教程—映射适当的NumPy数组

是否可以映射一个适当的NumPy数组?如果是,如何?给定a_values—2D数组—这段代码对我来说很有用:

是否可以映射一个适当的NumPy数组?如果是,如何? < /强>

给定a_values—2D数组—这段代码对我来说很有用:

    for row in range(len(a_values)): for col in range(len(a_values[0])): a_values[row][col] = dim(a_values[row][col])

但它是如此丑陋,我怀疑在NumPy的某个地方一定有一个函数对类似的东西做同样的事情:

    a_values.map_in_place(dim)

但如果有类似的东西存在,我就找不到了。

回答

只有在空间有限的情况下,才值得尝试在适当的位置进行此操作。如果是这种情况,通过遍历数组的扁平视图可以稍微加快代码的速度。因为重塑会返回一个新的视图(如果可能的话),数据本身不会被复制(除非原始数据具有不寻常的结构)。

我不知道有什么更好的方法可以真正实现任意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) >>> a array([[ 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

当然vectorize仍然更快,所以如果你可以复制,使用它:

    >>> 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

如果你可以用内置的ufuncs重写dim,那么请不要矢量化:

    >>> a = numpy.arange(2500).reshape(50, 50) >>> %timeit a + 5 100000 loops, best of 3: 4.66 us per loop

numpy执行像+= in place这样的操作,正如您可能期望的那样——因此您可以免费使用in-place应用程序获得ufunc的速度。有时甚至更快!参见 的示例。


顺便说一下,我原来对这个问题的回答,可以在其编辑历史,是荒谬的,和涉及vectorizing指数成。不仅它必须做一些时髦的东西绕过的< a href = " http://docs.scipy.org/doc/numpy/reference/generated/numpy.vectorize.html # numpy.vectorize”rel = " noreferrer " > < / >类型声明机制,结果是一样缓慢的嵌套循环的版本。聪明到此为止吧!

​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

本文由 Python实用宝典 作者:Python实用宝典 发表,其版权均为 Python实用宝典 所有,文章内容系作者个人观点,不代表 Python实用宝典 对观点赞同或支持。如需转载,请注明文章来源。
0

发表评论