【问题标题】:Slicing array by using another array as the slice indices along axis通过使用另一个数组作为沿轴的切片索引来切片数组
【发布时间】:2018-07-09 10:40:48
【问题描述】:

假设我有一个如下所示的数组:

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, :],然后分别从第一列、第二列和第三列中选择并重新组装到上面的数组中,删除缺失值的组合。

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

【问题讨论】:

    标签: python numpy slice


    【解决方案1】:

    对于此操作,您需要首先生成一个布尔索引掩码,该掩码标记您要设置为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]])
    

    【讨论】:

    • 惊人的结果,在创纪录的时间内。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-10
    • 2014-08-15
    • 1970-01-01
    • 2012-09-17
    • 1970-01-01
    • 2017-07-03
    • 2021-06-27
    相关资源
    最近更新 更多