DatetimeIndex.__getitem__ returns ndarray for nd indexer
I didn't know this was possible, but apparently it is (and tested).

For ndim > 1, `DatetimeIndex.__getitem__` returns an array

```python
In [13]: pd.date_range('2000', periods=12)[:, None]
Out[13]:
array([['2000-01-01T00:00:00.000000000'],
       ['2000-01-02T00:00:00.000000000'],
       ['2000-01-03T00:00:00.000000000'],
       ['2000-01-04T00:00:00.000000000'],
       ['2000-01-05T00:00:00.000000000'],
       ['2000-01-06T00:00:00.000000000'],
       ['2000-01-07T00:00:00.000000000'],
       ['2000-01-08T00:00:00.000000000'],
       ['2000-01-09T00:00:00.000000000'],
       ['2000-01-10T00:00:00.000000000'],
       ['2000-01-11T00:00:00.000000000'],
       ['2000-01-12T00:00:00.000000000']], dtype='datetime64[ns]')

```

while Index returns an Index:

```python
In [14]: pd.Index(np.arange(12))[:, None]
Out[14]: Int64Index([[0], [1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11]], dtype='int64')
```

FWIW, Categorical raises with an unfriendly error.

```python
In [17]: pd.Categorical([0, 1, 2])[:, None]
```

```pytb
Out[17]: ---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
~/Envs/pandas-dev/lib/python3.7/site-packages/IPython/core/formatters.py in __call__(self, obj)
    700                 type_pprinters=self.type_printers,
    701                 deferred_pprinters=self.deferred_printers)
--> 702             printer.pretty(obj)
    703             printer.flush()
    704             return stream.getvalue()

~/Envs/pandas-dev/lib/python3.7/site-packages/IPython/lib/pretty.py in pretty(self, obj)
    398                         if cls is not object \
    399                                 and callable(cls.__dict__.get('__repr__')):
--> 400                             return _repr_pprint(obj, self, cycle)
    401
    402             return _default_pprint(obj, self, cycle)

~/Envs/pandas-dev/lib/python3.7/site-packages/IPython/lib/pretty.py in _repr_pprint(obj, p, cycle)
    693     """A pprint that just redirects to the normal repr function."""
    694     # Find newlines and replace them with p.break_()
--> 695     output = repr(obj)
    696     for idx,output_line in enumerate(output.splitlines()):
    697         if idx:

~/sandbox/pandas/pandas/core/base.py in __repr__(self)
     75         Yields Bytestring in Py2, Unicode String in py3.
     76         """
---> 77         return str(self)
     78
     79

~/sandbox/pandas/pandas/core/base.py in __str__(self)
     54
     55         if compat.PY3:
---> 56             return self.__unicode__()
     57         return self.__bytes__()
     58

~/sandbox/pandas/pandas/core/arrays/categorical.py in __unicode__(self)
   1963             result = self._tidy_repr(_maxlen)
   1964         elif len(self._codes) > 0:
-> 1965             result = self._get_repr(length=len(self) > _maxlen)
   1966         else:
   1967             msg = self._get_repr(length=False, footer=True).replace("\n", ", ")

~/sandbox/pandas/pandas/core/arrays/categorical.py in _get_repr(self, length, na_rep, footer)
   1954         formatter = fmt.CategoricalFormatter(self, length=length,
   1955                                              na_rep=na_rep, footer=footer)
-> 1956         result = formatter.to_string()
   1957         return compat.text_type(result)
   1958

~/sandbox/pandas/pandas/io/formats/format.py in to_string(self)
    147                 return u('')
    148
--> 149         fmt_values = self._get_formatted_values()
    150
    151         result = [u('{i}').format(i=i) for i in fmt_values]

~/sandbox/pandas/pandas/io/formats/format.py in _get_formatted_values(self)
    135
    136     def _get_formatted_values(self):
--> 137         return format_array(self.categorical.get_values(), None,
    138                             float_format=None, na_rep=self.na_rep)
    139

~/sandbox/pandas/pandas/core/arrays/categorical.py in get_values(self)
   1455         if is_datetimelike(self.categories):
   1456             return self.categories.take(self._codes, fill_value=np.nan)
-> 1457         return np.array(self)
   1458
   1459     def check_for_ordered(self, op):

~/sandbox/pandas/pandas/core/arrays/categorical.py in __array__(self, dtype)
   1247             categorical.categories.dtype
   1248         """
-> 1249         ret = take_1d(self.categories.values, self._codes)
   1250         if dtype and not is_dtype_equal(dtype, self.categories.dtype):
   1251             return np.asarray(ret, dtype)

~/sandbox/pandas/pandas/core/algorithms.py in take_nd(arr, indexer, axis, out, fill_value, mask_info, allow_fill)
   1652     func = _get_take_nd_function(arr.ndim, arr.dtype, out.dtype, axis=axis,
   1653                                  mask_info=mask_info)
-> 1654     func(arr, indexer, out, fill_value)
   1655
   1656     if flip_order:

~/sandbox/pandas/pandas/_libs/algos_take_helper.pxi in pandas._libs.algos.take_1d_int64_int64()
   3420 @cython.boundscheck(False)
   3421 def take_1d_int64_int64(ndarray[int64_t, ndim=1] values,
-> 3422                               int64_t[:] indexer,
   3423                               int64_t[:] out,
   3424                               fill_value=np.nan):

ValueError: Buffer has wrong number of dimensions (expected 1, got 2)
```


and unsurprisingly, lots of stuff seems to be broken even if the original `__getitem__` worked.

```pytb
In [36]: x
Out[36]: Int64Index([[1], [2], [4], [3]], dtype='int64')

In [37]: x.get_indexer_for(2)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-37-5c5d6de00158> in <module>()
----> 1 x.get_indexer_for(2)

~/sandbox/pandas/pandas/core/indexes/base.py in get_indexer_for(self, target, **kwargs)
   3511         This dispatches to get_indexer or get_indexer_nonunique as appropriate
   3512         """
-> 3513         if self.is_unique:
   3514             return self.get_indexer(target, **kwargs)
   3515         indexer, _ = self.get_indexer_non_unique(target, **kwargs)

~/sandbox/pandas/pandas/_libs/properties.pyx in pandas._libs.properties.CachedProperty.__get__()
     34             val = <object>PyDict_GetItem(cache, self.name)
     35         else:
---> 36             val = self.func(obj)
     37             PyDict_SetItem(cache, self.name, val)
     38         return val

~/sandbox/pandas/pandas/core/indexes/base.py in is_unique(self)
   1570     def is_unique(self):
   1571         """ return if the index has unique values """
-> 1572         return self._engine.is_unique
   1573
   1574     @property

~/sandbox/pandas/pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.is_unique.__get__()
    182     def is_unique(self):
    183         if self.need_unique_check:
--> 184             self._do_unique_check()
    185
    186         return self.unique == 1

~/sandbox/pandas/pandas/_libs/index.pyx in pandas._libs.index.IndexEngine._do_unique_check()
    189
    190         # this de-facto the same
--> 191         self._ensure_mapping_populated()
    192
    193     @property

~/sandbox/pandas/pandas/_libs/index.pyx in pandas._libs.index.IndexEngine._ensure_mapping_populated()
    248             values = self._get_index_values()
    249             self.mapping = self._make_hash_table(len(values))
--> 250             self._call_map_locations(values)
    251
    252             if len(self.mapping) == len(values):

~/sandbox/pandas/pandas/_libs/index_class_helper.pxi in pandas._libs.index.Int64Engine._call_map_locations()
    131         # self.mapping is of type Int64HashTable,
    132         # so convert dtype of values
--> 133         self.mapping.map_locations(algos.ensure_int64(values))
    134
    135     cdef _get_index_values(self):

~/sandbox/pandas/pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.Int64HashTable.map_locations()
    955
    956     @cython.boundscheck(False)
--> 957     def map_locations(self, ndarray[int64_t, ndim=1] values):
    958         cdef:
    959             Py_ssize_t i, n = len(values)

ValueError: Buffer has wrong number of dimensions (expected 1, got 2)

```