首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用np.select()或if else子句加速

使用np.select()或if else子句加速
EN

Stack Overflow用户
提问于 2020-11-02 00:58:34
回答 1查看 57关注 0票数 0

Python GIS开发人员的问题。我有一个高密度的三维点云,每个像素有73个观察值。用SFM获得云量。我正在将云中的DEM作为新的波段融合在HSI图像中,以供将来分析。

我有一个numpy数组,表示8个波段(n点,min z,maz z,sum z...)。我需要基于点云更改此数组的值。因此,我一次只能使用一个像素,这使得numpy向量化不是一个好主意。

变量为: map_z =平均海平面以上单个云点高度的浮点数组是8波段numpy数组

代码语言:javascript
复制
array = np.full((nbands, 2000, 3000), np.nan, dtype=OUTPUT_RASTER_DTYPE)

我已经尝试了两个版本的代码。一个矢量化版本和一个Else If版本。

代码语言:javascript
复制
slice_arr = array[0:4, pixel_y, pixel_x]
slice_arr[0] = np.where(slice_arr[0] == 0, 1, slice_arr[0] + 1)
slice_arr[1] = np.select([np.isnan(slice_arr[1]) == True, slice_arr[1] > map_z], [map_z, map_z], slice_arr[1])
slice_arr[2] = np.select([np.isnan(slice_arr[2]) == True, slice_arr[2] < map_z], [map_z, map_z], slice_arr[2])
slice_arr[3] = np.where(np.isnan(slice_arr[3]) == True, map_z, slice_arr[3] + map_z)
array[0:4, pixel_y, pixel_x] = slice_arr

代码语言:javascript
复制
slice_arr = array[0:4, pixel_y, pixel_x] # Take a slice of the array
if slice_arr[0] == 0:
    slice_arr[0] = 1
else:
    slice_arr[0] = slice_arr[0] + 1
if np.isnan(slice_arr[1]) == True:
    slice_arr[1] = map_z
elif slice_arr[1] > map_z:
    slice_arr[1] = map_z
else:
    pass
if np.isnan(slice_arr[2]) == True:  
    slice_arr[2] = map_z
elif slice_arr[2] < map_z:
    slice_arr[2] = map_z
else:
    pass
if np.isnan(slice_arr[3]) == True:  
    slice_arr[3] = map_z
else:
    slice_arr[3] = slice_arr[3] + map_z
array[0:4, pixel_y, pixel_x] = slice_arr

显然,If else版本的速度要快4倍,因为我一次只操作一个像素。这是因为map_z是一个点云,我一次只能处理一个点,而这些点只落在我的数组中的一个像素上。向量化应该在更大的数组上操作。

有没有办法使用numpy来加速这部分代码?如果数组(8,2000,3000)比(8,2000,3000)大得多,对数组(slice_arr)进行分片是否具有速度优势?

EN

回答 1

Stack Overflow用户

发布于 2020-11-02 03:56:05

最后,我提高了If Else子句的速度,但把它放在一个函数中并使用numba。这将时间从2.33分钟缩短。为.42 min.!

代码语言:javascript
复制
from numba import jit
@jit(nopython=True)
def query_speed_up(slice_arr, map_z):

    if slice_arr[0] == 0:
        slice_arr[0] = 1
    else:
        slice_arr[0] = slice_arr[0] + 1

    # min z
    if np.isnan(slice_arr[1]) == True:  # not is
        slice_arr[1] = map_z
    elif slice_arr[1] > map_z:
        slice_arr[1] = map_z
    else:
        pass

    # max z
    if np.isnan(slice_arr[2]) == True:  # not is
        slice_arr[2] = map_z
    elif slice_arr[2] < map_z:
        slice_arr[2] = map_z
    else:
        pass

    # sum z
    if np.isnan(slice_arr[3]) == True:  # not is
        slice_arr[3] = map_z
    else:
        slice_arr[3] = slice_arr[3] + map_z

    return slice_arr

slice_arr = array[0:4, pixel_y, pixel_x]  # Take a slice of the array
jittest = query_speed_up(slice_arr, map_z)
array[0:4, pixel_y, pixel_x] = jittest
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64634503

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档