通过使用另一个数组作为沿轴的切片索引来切片数组

时间:2018-07-09 10:40:48

标签: python numpy slice

说我有一个看起来像下面的数组:

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

我还有另一个数组slicer = [1,3,2]。我想将这些值应用为沿轴1的轴0上的切片索引。

这是行不通的(实际上没有办法指定nd数组中nd为轴1),但是假设我尝试了arr[:slicer, :]

我希望获得

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

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

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

1 个答案:

答案 0 :(得分:6)

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