PERF: use ndarray.take instead of algos.take
Un-revert part of #40510 in the hopes of tracking down where the perf impact was.
ok is this WIP? > ok is this WIP?

no, this is ready Can you run some benchmarks to verify this time? Eg the one I mentioned in https://github.com/pandas-dev/pandas/pull/40818#issuecomment-816463888. I didn't list the exact impacted benchmarks in https://github.com/pandas-dev/pandas/pull/40510#issuecomment-808496069, but eg the select_dtypes ones were also affected. > Eg the one I mentioned in #40818 (comment). I didn't list the exact impacted benchmarks in #40510 (comment), but eg the select_dtypes ones were also affected.

Just ran the time_frame_agg one, no change.  The non-asv motivator remains

```
In [1]: from pandas.core.algorithms import *
In [2]: arr = np.arange(10000)
In [3]: taker = np.random.randint(0, 10000, 1000)
In [4]: res = arr.take(taker)
In [5]: res2 = take_nd(arr, taker, allow_fill=False)

In [6]: %timeit res = arr.take(taker)
   ...: 
4.21 µs ± 93.8 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

In [7]: %timeit res2 = take_nd(arr, taker, allow_fill=False)
   ...: 
8.9 µs ± 670 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

``` `-b select_dtypes` also no change gentle ping; this should be an unambiguous perf win And this time https://pandas.pydata.org/speed/pandas/#/ doesn't show any regressions!