Skip to main content
 首页 » 编程设计

python之如何矢量化 3D numpy 数组中切片的阈值

2025年05月04日9qq号

我正在尝试对 3D 数组中切片的阈值进行矢量化。 不幸的是,阈值被应用于维度中的所有 3 个值。 我能想到的唯一方法是提取切片 1,进行处理,然后将其放回数组中,但我确信有更好的方法。 这里有一些代码来解释我在做什么和我想做什么。 非常感谢您的帮助。 J

import numpy as np 
arr = np.arange(18).reshape(3, 2, 3) 
arr[ arr[:,:,1] < 10 ] = 0 

给予:

array([[[ 0,  0,  0], 
        [ 0,  0,  0]], 
 
       [[ 0,  0,  0], 
        [ 9, 10, 11]], 
 
       [[12, 13, 14], 
        [15, 16, 17]]]) 

我希望:

array([[[ 0,  0,  2], 
        [ 3,  0,  5]], 
 
       [[ 6,  0,  8], 
        [ 9, 10, 11]], 
 
       [[12, 13, 14], 
        [15, 16, 17]]]) 

请您参考如下方法:

这应该有效:

arr[:, :, 1][arr[:, :, 1] < 10] = 0 

这将为 arr 的维度 3 的第二个元素创建一个 bool 掩码与:arr[:, :, 1] < 10 .然后使用此 bool 掩码仅索引其特定的数组切片。

使最后一个维度的选择更具可读性的一个很好的功能是省略号 ... .它将在显式索引轴之前对所有轴进行切片。

print(arr[..., 1]) 
# Out: array([[ 1,  4], 
              [ 7, 10], 
              [13, 16]]) 

在这种情况下,您可以像这样使用它:

slc = (..., 1) 
arr[slc][arr[slc] < 10] = 0