Как настроить умный oneliner для расчета с очень большими данными? - PullRequest
0 голосов
/ 17 мая 2018

У меня есть маскированные массивы для широты (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])]

Можно ли сделатьoneliner или другой код, который делает расчет намного быстрее?
Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Спасибо за ваши ответы и @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])
0 голосов
/ 17 мая 2018

Можно ли создать отдельный код или другой код , который сделает расчет намного быстрее ?

Синтаксис-Формат не является основой для достижения скорости,
Интеллектуальные векторизации или переформулировки:

До тех пор, пока славный numba -группа не решит переместить поддержкуОперации с массивами в масках на передней панели, отсутствуют скорости JIT-ускорения, поступающие из numba.jit( ... ) ( Поддержка маскируемых массивов # 2103 )

Так что давайте попробуем с numpy -национальнымшаги:

Внутренний цикл может выйти из медленного, 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 -гуру здесь приготовится кскажу вам еще более умные и эффективные приемы нарезки / векторизации для того же, так что будьтеatient: o)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...