这是一个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])
详情
在与array_2d 形状相同的ones 的ndarray 上使用cumsum 创建掩码,并执行逐行比较以查看哪些元素大于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])