這可以(幾乎?)在純numpy
中使用掩碼數組和步進技巧完成。首先,我們創建面膜:
>>> indices = numpy.arange(a.size)
>>> mask = ~((indices >= start[:,None]) & (indices < end[:,None]))
或者更簡單地說:
>>> mask = (indices < start[:,None]) | (indices >= end[:,None])
的掩碼False
(即值沒有被屏蔽),對於那些>=
的起始值和<
年底價值指數。 (切片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)
這是不太一樣的,你問什麼,但它應該表現相似。
我有一個很難理解什麼'start'和'end'有與此相關。另外,我不認爲你可以完全用numpy做這個,因爲numpy數組需要是矩形的。 – mgilson
YOu可能會嘗試將起始值作爲列表中的元組。 – Keith
因爲在這裏似乎沒有規範的numpy解決方案,所以如果您需要更多的想法,您可能希望事後添加您實際做的事情,以及切片是否具有某些特殊屬性。 – seberg