Подход № 1
Просто передайте a
в b'
s форму с np.broadcast_to
, а затем замаскируйте ее с b
-
In [15]: np.broadcast_to(a,b.shape)[b]
Out[15]: array([0, 2, 2, 3])
Подход № 2
Другой будет получать все индексы и mod с размером a
, который также будетразмер каждого 2D
блока в b
с последующим индексированием в уплощенный a
-
a.ravel()[np.flatnonzero(b)%a.size]
Подход № 3
На тех же строках, что иПриложение № 2, но с сохранением формата 2D
и использованием ненулевых индексов по двум последним осям b
-
_,r,c = np.nonzero(b)
out = a[r,c]
Синхронизация на больших массивах (данные формы выборки увеличиваются на100x) -
In [50]: np.random.seed(0)
...: a = np.random.rand(200,200)
...: b = np.random.rand(200,200,200)>0.5
In [51]: %timeit np.broadcast_to(a,b.shape)[b]
45.5 ms ± 381 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [52]: %timeit a.ravel()[np.flatnonzero(b)%a.size]
94.6 ms ± 1.64 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [53]: %%timeit
...: _,r,c = np.nonzero(b)
...: out = a[r,c]
128 ms ± 1.46 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)