这可以(几乎?)numpy
使用掩码数组和步幅技巧以纯方式完成。首先,我们创建我们的面具:
>>> indices = numpy.arange(a.size)
>>> mask = ~((indices >= start[:,None]) & (indices < end[:,None]))
或者更简单地说:
>>> mask = (indices < start[:,None]) | (indices >= end[:,None])
对于开始值和结束值False
的那些索引,掩码是(即未掩码的值)。(用(aka )切片增加了一个新维度,启用广播。)现在我们的掩码看起来像这样:>=
<
None
numpy.newaxis
>>> mask
array([[ True, False, True, True, True, True, True, True, True,
True, True, True],
[ True, True, True, True, True, False, False, False, False,
False, True, True],
[ True, True, True, True, True, True, True, False, False,
True, True, True]], dtype=bool)
现在我们必须使用以下方法拉伸数组以适应掩码stride_tricks
:
>>> as_strided = numpy.lib.stride_tricks.as_strided
>>> strided = as_strided(a, mask.shape, (0, a.strides[0]))
>>> strided
array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11],
[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11],
[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]], dtype=int16)
这看起来像一个 3x12 数组,但每一行都指向同一个内存。现在我们可以将它们组合成一个掩码数组:
>>> numpy.ma.array(strided, mask=mask)
masked_array(data =
[[-- 1 -- -- -- -- -- -- -- -- -- --]
[-- -- -- -- -- 5 6 7 8 9 -- --]
[-- -- -- -- -- -- -- 7 8 -- -- --]],
mask =
[[ True False True True True True True True True True True True]
[ True True True True True False False False False False True True]
[ True True True True True True True False False True True True]],
fill_value = 999999)
这与您所要求的并不完全相同,但它的行为应该相似。