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

3

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

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

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

这样做是不行的(实际上在ndarray中没有指定沿着哪个轴进行操作),但假设我尝试了 arr[:slicer, :]

我希望得到的结果是:

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

这是将应用切片arr[:1, :]arr[:3, :]arr[:2, :]的组合,然后分别从中选择第1、2和3列,并重新组装成上述数组,删除缺失值。
我想避免循环并尝试寻找快速向量化的解决方案。
1个回答

7

在执行此操作之前,您需要首先生成一个布尔索引掩码,标记所有要设置为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 = numpy.arange(1, 10, dtype=float).reshape(3, 3)
data[mask] = numpy.nan
data
# array([[ 1.,  2.,  3.],
#        [nan,  5.,  6.],
#        [nan,  8., nan]])

在创纪录的时间内取得了惊人的成果。谢谢。 - Attack68

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接