【问题标题】:vectorized code for pythonpython的矢量化代码
【发布时间】:2014-12-12 14:45:55
【问题描述】:

我使用 npr.uniform(size=(N, 2)) 创建了一个存储 N 个随机点坐标的数组。现在我想使用一个计算 Xtotal^2+Ytotal^2 的函数,其中 Xtotal 和 Ytotal 分别是 N 个 x 坐标和 N 个 y 坐标的总和。使用for循环我没有问题,但现在我想多次独立运行程序(超过1000次),我能想到的唯一方法是使用for循环。是否可以在矢量化代码中执行它以使其运行得更快?我正在做的实际项目有点复杂,在这里描述起来太困难了,但我想如果我能解决这个简化的程序,我做更难的程序是没有问题的。

谢谢

【问题讨论】:

    标签: python arrays loops vectorization


    【解决方案1】:

    这是你想要的吗?

    >>> N = 5
    >>> coords = np.random.uniform(size=(N, 2))
    >>> coords
    
    [[ 0.00510663  0.52338403]
     [ 0.88250555  0.0440339 ]
     [ 0.1753249   0.4534223 ]
     [ 0.13600696  0.71194949]
     [ 0.87044574  0.80934245]]
    
    >>> coords.sum(axis=0)
    array([ 2.31797242,  0.95364616])
    
    >>> (coords.sum(axis=0)**2).sum()
    12.247833350611774
    

    如果你想重复这个 1000 次,那么你可以尝试生成 1000*5 个随机数。请注意,如果您正在进行复杂的处理(而不仅仅是求和和幂),那么通常您的 1000 次重复不能被矢量化。

    【讨论】:

      【解决方案2】:

      假设你的npr 是numpy.random,

      >>> import numpy as np
      >>> N = 5
      >>> xy = np.random.uniform(size=(N, 2))
      >>> xy[:, 0]
      array([ 0.91602043,  0.14053012,  0.01789579,  0.84857576,  0.20245375])
      >>> xy[:, 1]
      array([ 0.39608331,  0.46119256,  0.23600489,  0.93313743,  0.9790776 ])
      

      然后只需使用切片和索引:

      >>> xy[:, 0]**2 + xy[:, 1]**2
      array([ 0.99597542,  0.23244729,  0.05601857,  1.5908263 ,  0.99958046])
      >>> 
      >>> xy[0, :]**2 + xy[1, :]**2
      array([ 0.85884215,  0.36958056])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-01-05
        • 2016-02-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-17
        相关资源
        最近更新 更多