In [154]: x = np.arange(24).reshape(6,4)
In [155]: mask = np.array([1,0,1,0,1,0],bool)
При двухступенчатом подходе:
In [156]: x[mask] # x[mask, :]
Out[156]:
array([[ 0, 1, 2, 3],
[ 8, 9, 10, 11],
[16, 17, 18, 19]])
In [157]: x[mask][:,[1,3]]
Out[157]:
array([[ 1, 3],
[ 9, 11],
[17, 19]])
Или два индекса можно объединить с ix_
:
In [158]: np.ix_(mask, [1,3])
Out[158]:
(array([[0],
[2],
[4]]), array([[1, 3]]))
In [159]: x[np.ix_(mask, [1,3])]
Out[159]:
array([[ 1, 3],
[ 9, 11],
[17, 19]])
Обратите внимание, что первый массив в Out[158]
is np.nonzero(mask)[0][:,None]
, ненулевые индексы в векторной форме столбца. Этот индексный массив (3,1) может транслироваться с массивом столбцов (2,) для выбора массива элементов (3,2). Или в вашем примере массив (43,2).
Логическое значение mask
нельзя превратить в массив (6,1) и использовать для маскировки x
;это сработало бы, только если бы оно было превращено в маску (6,4), соответствующую форме x
.
Итак, используйте двухэтапное индексирование или используйте ix_
.