@jreback I tried 

  def array_equivalent(left, right):
      left, right = np.asarray(left), np.asarray(right)
      try:
          left = left.astype(float)
          right = right.astype(float)        
      except (ValueError, TypeError):
          return np.array_equal(left, right)
      else:
          return (left.shape == right.shape
                  and ((left == right) | (left != left) & (right != right)).all())

`time ./test_perf.sh -b master -t coerce-to-float` yields (using Python2.7, Numpy 1.7)

	series_align_irregular_string                |  97.3604 |  68.7210 |   1.4167 |
	series_align_left_monotonic                  |  32.0517 |  22.5259 |   1.4229 |
	concat_series_axis1                          | 430.0770 |  82.5344 |   5.2109 |
	reindex_frame_level_align                    |  23.5590 |   1.2616 |  18.6734 |
	-------------------------------------------------------------------------------
	Test name                                    | head[ms] | base[ms] |  ratio   |
	-------------------------------------------------------------------------------

Also, coercing to float drops the imaginary part of complex arrays:

    >>> np.array([nan, 1+1j], dtype='complex').astype(float)
    array([ nan,   1.])

So `np.isnan` will (I think) handle more dtypes than `(x != x)`, and has comparable, maybe even favorable speed, when applied to float arrays:

    In [6]: x = np.array([1, 2, nan])

    In [7]: %timeit x != x
    1000000 loops, best of 3: 1.23 µs per loop

    In [5]: %timeit np.isnan(x)
    1000000 loops, best of 3: 1.1 µs per loop