假设我有一个类似以下的数组:
arr = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
我还有另一个阵列 slicer = [1,3,2] . 我想应用这些值作为轴0上沿轴1测量的切片索引。
slicer = [1,3,2]
这不起作用(实际上不包含指定沿零件是ndarray中轴1的方法),但假设我尝试过 arr[:slicer, :]
arr[:slicer, :]
我希望得到,
out = [[1, 2, 3], [nan, 5, 6], [nan, 8, nan]]
这是应用切片的组合 arr[:1, :] , arr[:3, :] , arr[:2, :] 然后分别从第一列、第二列和第三列中进行选择,并重新组合到上面的数组中,删除缺少的值。
arr[:1, :]
arr[:3, :]
arr[:2, :]
我想避免循环,并试图找到一个快速的矢量化解决方案
对于此操作,需要首先生成一个布尔索引掩码,用于标记要设置为的所有字段。 nan . 广播使执行“外部比较”变得容易,从而产生所需的结果
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
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]])