说我有一个看起来像下面的数组:
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, :]
然后分别从第一列,第二列和第三列中进行选择,然后重新组合到上面的数组中的组合,值。
我想避免循环,并试图找到一种快速的矢量化解决方案
答案 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]])