【问题标题】:How to setup a smart oneliner for calculating with very large data?如何设置一个智能的单线来计算非常大的数据?
【发布时间】:2018-05-17 13:00:18
【问题描述】:

我为纬度 (Xpos) 和经度 (Ypos) 设置了维度 (125,800,000) 的掩码数组。

我想计算数组中的纬度和经度差。这是数组Xpos(Ypos 类似)。

 masked_array(  data       = [ [-2.0551843643188477, -2.637551784515381, -2.720881223678589,  ..., 2.2812530994415283, 2.281250476837158, 2.281254768371582 ],
                               [-2.3242127895355225, -2.804257869720459, -2.8825504779815674, ..., 2.2812530994415283, 2.281250476837158, 2.281254768371582 ],
                               [-2.073770523071289, -2.6198980808258057, -2.708889961242676,  ..., 2.2812530994415283, 2.281250476837158, 2.281254768371582 ],
                               ...,
                               [-3.517531633377075, -2.908338785171509, -2.9069409370422363,  ..., 2.2812530994415283, 2.281250476837158, 2.281254768371582 ],
                               [-3.688690662384033, -3.0086288452148438, -3.010164260864258,  ..., 2.2812530994415283, 2.281250476837158, 2.281254768371582 ],
                               [-3.520817518234253, -2.943941116333008, -2.941941738128662,   ..., 2.2812530994415283, 2.281250476837158, 2.281254768371582 ]
                               ],
                mask       = [ [ False, False, False, ..., False, False, False ],
                               [ False, False, False, ..., False, False, False],
                               [ False, False, False, ..., False, False, False],
                               ...,
                               [ False, False, False, ..., False, False, False],
                               [ False, False, False, ..., False, False, False],
                               [ False, False, False, ..., False, False, False]
                               ],
                fill_value = 1e+20,
                dtype      = float32
                )

这是我的代码,它有效,但计算时间很长。

Dist= np.zeros((len(XposApr),len(XposApr[0])))
DiffLon=np.zeros((len(XposApr),len(XposApr[0])))
DiffLat=np.zeros((len(XposApr),len(XposApr[0])))
for i in range (1,len(XposApr),12):
    for j in range (0,len(XposApr[0])):
        DiffLon[i][j]=(XposApr[i][j]-XposApr[i-1][j])
        DiffLat[i][j]=(YposApr[i][j]-YposApr[i-1][j])

我真的不知道如何制作著名的单线,这是我尝试过的,但不起作用:

DistLon = [XposApr[i][j]-XposApr[i-1][j] for i in enumerate (XposApr) and j in enumerate (XposApr[0])]

是否可以制作单行代码或其他代码以使计算速度更快?
提前致谢!

【问题讨论】:

  • 我不知道单线是否会因为只有一条线而变得更快。可能使用像 numpy vector operations 这样的东西会有所帮助。

标签: python arrays performance loops


【解决方案1】:

是否有可能制作一个单行或另一个使计算更快的代码?

语法格式不是实现速度的核心,
智能矢量化或重新制定是:

直到光荣的 numba 团队决定将对屏蔽阵列操作的支持转移到前端,numba.jit( ... ) (Masked array support #2103) 缺乏 JIT 加速速度)

那么让我们试试numpy-native 步骤:

内部循环可能首先退出缓慢的 GIL 驱动运动:

for     i in range ( 1, len( XposApr    ), 12 ):
    #or j in range ( 0, len( XposApr[0] )     ):
        DiffLon[i][:] = ( XposApr[i][:] - XposApr[i-1][:] )
        DiffLat[i][:] = ( YposApr[i][:] - YposApr[i-1][:] )

然而,如果我正确地阅读了布局,整体可能会在两个维度上通过以下方式得到解决:

 DiffLon[1:len( XposApr ):12] = ( XposApr[1:len( XposApr   ):12]
                                - XposApr[0:len( XposApr )-1:12]
                                  )
 DiffLat[1:len( XposApr ):12] = ( YposApr[1:len( XposApr   ):12]
                                - YposApr[0:len( XposApr )-1:12]
                                  )

我相信@Divakar 或@cᴏʟᴅsᴘᴇᴇᴅ,这里真正的numpy-guru 会准备好告诉你更聪明、更有效的切片/矢量化技巧,所以请耐心等待 :o)

【讨论】:

    【解决方案2】:

    感谢您的回答和@patrick 的有用评论,我相信这也可以解决我的问题:

    Xapr=np.array(XposApr)
    Yapr=np.array(YposApr)
    for i in range (1,len(XposApr)):
        DiffLon[i]=(Xapr[i]-Xapr[i-1])
        DiffLat[i]=(Yapr[i]-Yapr[i-1])
    

    【讨论】:

      猜你喜欢
      • 2011-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多