У меня есть массив MxNxD I, а также двоичная маска MxN M.
Предположим, что в M есть k 1. Я хочу извлечь массив kxD, который содержит все векторы длины D, соответствующие 1 в маске.
Я могу получить индексы этих векторов в I, вызвав numpy.nonzero (), но я не могу найти хороший компактный способ получить свой срез без ужасных циклов.
Любая помощь будет высоко ценится.
Думаю, это то, что вам нужно:
In [283]: A = np.arange(24).reshape(2,3,4)
In [284]: M = np.array([[1,0,1],[0,1,0]],dtype=bool)
In [285]: A
Out[285]:
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],
[[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]]])
In [286]: M
Out[286]:
array([[ True, False, True],
[False, True, False]])
In [287]: I,J = np.nonzero(M)
In [288]: I,J
Out[288]: (array([0, 0, 1]), array([0, 2, 1]))
In [289]: A[I,J,:]
Out[289]:
array([[ 0, 1, 2, 3],
[ 8, 9, 10, 11],
[16, 17, 18, 19]])
Поскольку M
маскирует исходные размеры, его можно упростить до
A[np.nonzero(M)]