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)
これはあなたが求めたものとはまったく同じではありませんが、同じように動作するはずです。