Вот решение vectorized
, использующее логическую маску для индексации array_2d
:
array_2d = np.array([[0,1,2,3,4,5],[8,9,10,11,12,0],[21,22,21,0,0,0]])
array_len = [6,5,3]
m = ~(np.ones(array_2d.shape).cumsum(axis=1).T > array_len).T
array_2d[m]
array([ 0, 1, 2, 3, 4, 5, 8, 9, 10, 11, 12, 21, 22, 21])
Подробности
Маска создается, взяв cumsum
поверх ndarray ones
той же формы, что и array_2d
, и выполнив построчное сравнение, чтобы увидеть, какие элементы больше array_len
.
Итак, первый шаг - создать следующее ndarray
:
np.ones(array_2d.shape).cumsum(axis=1)
array([[1., 2., 3., 4., 5., 6.],
[1., 2., 3., 4., 5., 6.],
[1., 2., 3., 4., 5., 6.]])
И выполнить рядовое сравнение с array_len
:
~(np.ones(array_2d.shape).cumsum(axis=1).T > array_len).T
array([[ True, True, True, True, True, True],
[ True, True, True, True, True, False],
[ True, True, True, False, False, False]])
Тогда вам просто нужно отфильтровать массив с помощью:
array_2d[m]
array([ 0, 1, 2, 3, 4, 5, 8, 9, 10, 11, 12, 21, 22, 21])