代码之家  ›  专栏  ›  技术社区  ›  Attack68

使用另一个数组作为沿轴的切片索引对数组进行切片

  •  2
  • Attack68  · 技术社区  · 8 年前

    假设我有一个类似以下的数组:

    arr = [[1, 2, 3],
           [4, 5, 6],
           [7, 8, 9]]
    

    我还有另一个阵列 slicer = [1,3,2] . 我想应用这些值作为轴0上沿轴1测量的切片索引。

    这不起作用(实际上不包含指定沿零件是ndarray中轴1的方法),但假设我尝试过 arr[:slicer, :]

    我希望得到,

    out = [[1,   2,   3],
           [nan, 5,   6],
           [nan, 8, nan]]
    

    这是应用切片的组合 arr[:1, :] , arr[:3, :] , arr[:2, :] 然后分别从第一列、第二列和第三列中进行选择,并重新组合到上面的数组中,删除缺少的值。

    我想避免循环,并试图找到一个快速的矢量化解决方案

    1 回复  |  直到 8 年前
        1
  •  6
  •   Nils Werner    8 年前

    对于此操作,需要首先生成一个布尔索引掩码,用于标记要设置为的所有字段。 nan . 广播使执行“外部比较”变得容易,从而产生所需的结果

    slicer = numpy.asarray([1, 3, 2])
    mask = numpy.arange(3)[:, None] >= slicer
    mask
    # array([[False, False, False],
    #        [ True, False, False],
    #        [ True, False,  True]])
    

    然后您可以简单地使用这个掩码来索引 data

    data = numpy.arange(1, 10, dtype=float).reshape(3, 3)
    data[mask] = numpy.nan
    data
    # array([[ 1.,  2.,  3.],
    #        [nan,  5.,  6.],
    #        [nan,  8., nan]])