Esto puede (¿casi?) Hacerse en pura numpy
usando matrices enmascaradas y trucos de zancadas. En primer lugar, creamos nuestra máscara:
>>> indices = numpy.arange(a.size)
>>> mask = ~((indices >= start[:,None]) & (indices < end[:,None]))
O más simplemente:
>>> mask = (indices < start[:,None]) | (indices >= end[:,None])
La máscara se False
(es decir, los valores no enmascarados) para aquellos índices que son >=
al valor de inicio y <
el valor final . (Cortar con None
(también conocido como numpy.newaxis
) agrega una nueva dimensión, que permite la transmisión.) Ahora, nuestra máscara se parece a esto:
>>> 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)
Ahora hay que estirar la matriz para adaptarse a la máscara usando 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)
Esto se ve como una matriz 3x12, pero cada uno de los puntos de fila al mismo memoria. Ahora podemos combinarlos en un conjunto de máscaras:
>>> 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)
Esto no es exactamente lo mismo que lo que pidieron, pero debe comportarse de manera similar.
estoy teniendo dificultades para entender lo que '' start' y tienen end' para hacer con esto Por otro lado, no creo que puedas hacer esto completamente en numpy ya que las matrices numpy deben ser rectangulares. – mgilson
Puede tratar de hacer que los valores de inicio como tuplas en una lista. – Keith
Como parece que no hay una solución numérica canónica aquí, si necesita más ideas, tal vez desee agregar lo que realmente hace con ella después y si las rebanadas tienen algunas propiedades especiales. – seberg