I got a bit stuck here...
I progressively refactored the calculations converted to numpy, while using test_analysis.TestAnalysisWeights to check the results.
I finally boiled it down to the following, which looks pretty neat ...
```
#fill in a new array of areas
cos_colat_deltas = np.diff(np.cos(radian_colat_bounds))
lon_bounds_deltas = np.diff(radian_lon_bounds)
areas = ((radius_of_earth ** 2) *
         lon_bounds_deltas.transpose() *
         cos_colat_deltas)
```

But then I ran other tests, and found that some of them can't handle the small rounding differences (presumably, hopefully) that are introduced. 
E.G.
```
$ python -m unittest -v iris.tests.test_analysis.TestAreaWeights
 . . .
======================================================================
FAIL: test_area_weights (iris.tests.test_analysis.TestAreaWeights)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/h05/itpp/git/iris/iris_main/lib/iris/tests/test_analysis.py", line 423, in test_area_weights
    self.assertEquals(zlib.crc32(area_weights), 253962218)
AssertionError: 863942321 != 253962218

======================================================================
FAIL: test_quadrant_area (iris.tests.test_analysis.TestAreaWeights)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/h05/itpp/git/iris/iris_main/lib/iris/tests/test_analysis.py", line 444, in test_quadrant_area
    self.assertAlmostEquals(area, [[319251845980.763671875]])
AssertionError: array([[  3.19251846e+11]]) != [[319251845980.7637]] within 7 places

----------------------------------------------------------------------
Ran 2 tests in 0.330s

FAILED (failures=2)
$
```

So here, the second one looks "close", but the first test, using crc32 requires bit-for-bit matching, which just seems inappropriate for a floating-point calculation.

-------

**Conclude** :  that without more work we can't be sure what constitutes 'ok' here.
@rhattersley suggests in that case, let's just revert this bit + move on.