zoukankan      html  css  js  c++  java
  • numpy(2)ufunc运算

    >>> x = np.linspace(0, 2*np.pi, 10)
    # 对数组x中的每个元素进行正弦计算,返回一个同样大小的新数组
    >>> y = np.sin(x)
    >>> y
    array([  0.00000000e+00,   6.42787610e-01,   9.84807753e-01,
             8.66025404e-01,   3.42020143e-01,  -3.42020143e-01,
            -8.66025404e-01,  -9.84807753e-01,  -6.42787610e-01,
            -2.44921271e-16])

    先用linspace产生一个从0到2*PI的等距离的10个数,

    后将其传递给sin函数,由于np.sin是一个ufunc函数,因此它对x中的每个元素求正弦值,然后将结果返回,并且赋值给y。

    计算之后x中的值并没有改变,而是新创建了一个数组保存结果。如果我们希望将sin函数所计算的结果直接覆盖到数组x上去的话,可以将要被覆盖的数组作为第二个参数传递给ufunc函数。例如:

    >>> t = np.sin(x,x)
    >>> x
    array([  0.00000000e+00,   6.42787610e-01,   9.84807753e-01,
             8.66025404e-01,   3.42020143e-01,  -3.42020143e-01,
            -8.66025404e-01,  -9.84807753e-01,  -6.42787610e-01,
            -2.44921271e-16])
    >>> id(t) == id(x)
    True

    sin函数的第二个参数也是x,那么它所做的事情就是对x中的每给值求正弦值,并且把结果保存到x中的对应的位置中。此时函数的返回值仍然是整个计算的结果,只不过它就是x,因此两个变量的id是相同的(变量t和变量x指向同一块内存区域)。

    我用下面这个小程序,比较了一下numpy.math和Python标准库的math.sin的计算速度::

     
    import time
    import math
    import numpy as np
    
    x = [i * 0.001 for i in xrange(1000000)]
    start = time.clock()
    for i, t in enumerate(x):
        x[i] = math.sin(t)
    print "math.sin:", time.clock() - start
    
    x = [i * 0.001 for i in xrange(1000000)]
    x = np.array(x)
    start = time.clock()
    np.sin(x,x)
    print "numpy.sin:", time.clock() - start
    
    # 输出
    # math.sin: 1.15426932753
    # numpy.sin: 0.0882399858083

    NumPy中有众多的ufunc函数为我们提供各式各样的计算。除了sin这种单输入函数之外,还有许多多个输入的函数,add函数就是一个最常用的例子。先来看一个例子:

    >>> a = np.arange(0,4)
    >>> a
    array([0, 1, 2, 3])
    >>> b = np.arange(1,5)
    >>> b
    array([1, 2, 3, 4])
    >>> np.add(a,b)
    array([1, 3, 5, 7])
    >>> np.add(a,b,a)
    array([1, 3, 5, 7])
    >>> a
    array([1, 3, 5, 7])

    由于Python的操作符重载功能,计算两个数组相加可以简单地写为a+b,而np.add(a,b,a)则可以用a+=b来表示。

    下面是数组的运算符和其对应的ufunc函数的一个列表,注意除号"/"的意义根据是否激活__future__.division有所不同。

    数组对象支持这些操作符,极大地简化了算式的编写,不过要注意如果你的算式很复杂,并且要运算的数组很大的话,会因为产生大量的中间结果而降低程序的运算效率。例如:假设a b c三个数组采用算式x=a*b+c计算,那么它相当于:

    t = a * b
    x = t + c
    del t

    也就是说需要产生一个数组t保存乘法的计算结果,然后再产生最后的结果数组x。我们可以通过手工将一个算式分解为:

    x = a*b
    x += c

    以减少一次内存分配。

  • 相关阅读:
    Linux文档目录结构
    Git
    Scrapy爬虫框架(架构图与解析)
    爬虫(总目录)
    Django模型(Meta Optins)
    Django模型(字段关系)
    Django模型(模型类)
    Django模型(索引)
    Django模型(字段选项)
    Django模型(字段类型)
  • 原文地址:https://www.cnblogs.com/zhoulixue/p/6496768.html
Copyright © 2011-2022 走看看