«Правильный» способ достижения вашей цели - не расширять маску до 2D.Вместо этого индексируйте с [:, mask]
с 1D маской.Это указывает numpy, что вы хотите, чтобы ось 0 не изменялась и mask
применялась вдоль оси 1.
a = np.arange(12).reshape(3, 4)
b = np.array((1,0,1,0),'?')
a
# array([[ 0, 1, 2, 3],
# [ 4, 5, 6, 7],
# [ 8, 9, 10, 11]])
b
# array([ True, False, True, False])
a[:, b]
# array([[ 0, 2],
# [ 4, 6],
# [ 8, 10]])
Если ваш mask
уже 2D, numpy не будет проверять, все ли строки одинаковы, потому чтоэто было бы неэффективно.Но очевидно, что в этом случае вы можете использовать [:, mask[0]]
.
Если ваш mask
является двумерным и в нем просто одинаковое количество True
с в каждой строке, тогда либо используйте ответ @ tel.Или создайте индексный массив:
B = b^b[:3, None]
B
# array([[False, True, False, True],
# [ True, False, True, False],
# [False, True, False, True]])
J = np.where(B)[1].reshape(len(B), -1)
А теперь либо
np.take_along_axis(a, J, 1)
# array([[ 1, 3],
# [ 4, 6],
# [ 9, 11]])
, либо
I = np.arange(len(J))[:, None]
IJ = I, J
a[IJ]
# #array([[ 1, 3],
# [ 4, 6],
# [ 9, 11]])