Skip to content

Instantly share code, notes, and snippets.

@cpelley
Created April 25, 2014 09:45
Show Gist options
  • Save cpelley/11283916 to your computer and use it in GitHub Desktop.
Save cpelley/11283916 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"metadata": {
"name": "",
"signature": "sha256:96de4f5cb98aaf951599e9cf1190219cb9bfd07aecafb8b796930e99ab94aeb4"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "heading",
"level": 3,
"metadata": {},
"source": [
"Comparing readability of merge and concatenation failure reporting"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import numpy as np\n",
"\n",
"import iris\n",
"import iris.tests.stock as stock"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 1
},
{
"cell_type": "heading",
"level": 4,
"metadata": {},
"source": [
"Load a stock cube and create a scalar coord so that we can merge more than one together"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"cube = stock.lat_lon_cube()\n",
"cube.rename('stock cube')\n",
"cube.add_aux_coord(iris.coords.AuxCoord(1, long_name='scalar_coord'), None)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 2
},
{
"cell_type": "heading",
"level": 4,
"metadata": {},
"source": [
"Create a duplicate cube where the dimension coordinates differ by the coordinate system (cannot then merge)"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"cube2 = cube.copy()\n",
"cube2.remove_coord('latitude')\n",
"new_lat = cube.coord('latitude').copy()\n",
"new_lat.coord_system = iris.coord_systems.GeogCS(6371230.0)\n",
"cube2.add_dim_coord(new_lat, 0)\n",
"\n",
"cube2.coord('scalar_coord').points = 2"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 3
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"print cube, 2*'\\n', cube2, 2*'\\n'\n",
"\n",
"print cube.coord('latitude')\n",
"print cube2.coord('latitude')"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"stock cube / (unknown) (latitude: 3; longitude: 4)\n",
" Dimension coordinates:\n",
" latitude x -\n",
" longitude - x\n",
" Scalar coordinates:\n",
" scalar_coord: 1 \n",
"\n",
"stock cube / (unknown) (latitude: 3; longitude: 4)\n",
" Dimension coordinates:\n",
" latitude x -\n",
" longitude - x\n",
" Scalar coordinates:\n",
" scalar_coord: 2 \n",
"\n",
"\n",
"DimCoord(array([-1, 0, 1], dtype=int32), standard_name='latitude', units=Unit('degrees'), coord_system=GeogCS(6371229.0))\n",
"DimCoord(array([-1, 0, 1], dtype=int32), standard_name='latitude', units=Unit('degrees'), coord_system=GeogCS(6371230.0))\n"
]
}
],
"prompt_number": 4
},
{
"cell_type": "heading",
"level": 4,
"metadata": {},
"source": [
"Lets take a look at the failed merge message that is returned"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"print iris.cube.CubeList([cube, cube2]).merge_cube()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"ename": "MergeError",
"evalue": "failed to merge into a single cube.\n Coordinates in cube.dim_coords differ: latitude.",
"output_type": "pyerr",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[1;31mMergeError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-5-37c1b4c97f19>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[1;32mprint\u001b[0m \u001b[0miris\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcube\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mCubeList\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mcube\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcube2\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mmerge_cube\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[1;32m/home/h05/cpelley/git/iris/lib/iris/cube.pyc\u001b[0m in \u001b[0;36mmerge_cube\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 340\u001b[0m \u001b[0mproto_cube\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0miris\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_merge\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mProtoCube\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 341\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0mcube\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 342\u001b[1;33m \u001b[0mproto_cube\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mregister\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mcube\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0merror_on_mismatch\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mTrue\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 343\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 344\u001b[0m \u001b[1;31m# Extract the merged cube from the ProtoCube.\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32m/home/h05/cpelley/git/iris/lib/iris/_merge.pyc\u001b[0m in \u001b[0;36mregister\u001b[1;34m(self, cube, error_on_mismatch)\u001b[0m\n\u001b[0;32m 1226\u001b[0m \u001b[0mcoord_payload\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_extract_coord_payload\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mcube\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1227\u001b[0m match = coord_payload.match_signature(self._coord_signature,\n\u001b[1;32m-> 1228\u001b[1;33m error_on_mismatch)\n\u001b[0m\u001b[0;32m 1229\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mmatch\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1230\u001b[0m \u001b[1;31m# Register the cube as a source-cube for this ProtoCube.\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32m/home/h05/cpelley/git/iris/lib/iris/_merge.pyc\u001b[0m in \u001b[0;36mmatch_signature\u001b[1;34m(self, signature, error_on_mismatch)\u001b[0m\n\u001b[0;32m 257\u001b[0m \u001b[0mmatch\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;32mnot\u001b[0m \u001b[0mbool\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mmsgs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 258\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0merror_on_mismatch\u001b[0m \u001b[1;32mand\u001b[0m \u001b[1;32mnot\u001b[0m \u001b[0mmatch\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 259\u001b[1;33m \u001b[1;32mraise\u001b[0m \u001b[0miris\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mexceptions\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mMergeError\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mmsgs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 260\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mmatch\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 261\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;31mMergeError\u001b[0m: failed to merge into a single cube.\n Coordinates in cube.dim_coords differ: latitude."
]
}
],
"prompt_number": 5
},
{
"cell_type": "heading",
"level": 4,
"metadata": {},
"source": [
"Now lets take a look at the concatenate message reporting"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Let us just check that these can merge (before introducing artificial differences)\n",
"cube3 = cube.copy()\n",
"cube3.remove_coord('latitude')\n",
"new_lat = cube.coord('latitude').copy(np.array([2, 3, 4], dtype=np.int32))\n",
"cube3.add_dim_coord(new_lat, 0)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 6
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"print iris.cube.CubeList([cube, cube3]).concatenate_cube()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"stock cube / (unknown) (latitude: 6; longitude: 4)\n",
" Dimension coordinates:\n",
" latitude x -\n",
" longitude - x\n",
" Scalar coordinates:\n",
" scalar_coord: 1\n"
]
}
],
"prompt_number": 7
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Again, modify the coordinate system of the coordinate\n",
"new_lat.coord_system = iris.coord_systems.GeogCS(6371230.0)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 8
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"print iris.cube.CubeList([cube, cube3]).concatenate_cube()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"ename": "ConcatenateError",
"evalue": "failed to concatenate into a single cube.\n Dimensions metadata differs: [CoordMetaData(defn=CoordDefn(standard_name='latitude', long_name=None, var_name=None, units=Unit('degrees'), attributes={}, coord_system=GeogCS(6371229.0)), dims=(0,), points_dtype=dtype('int32'), bounds_dtype=None, kwargs={'order': 1, 'circular': False}), CoordMetaData(defn=CoordDefn(standard_name='longitude', long_name=None, var_name=None, units=Unit('degrees'), attributes={}, coord_system=GeogCS(6371229.0)), dims=(1,), points_dtype=dtype('int32'), bounds_dtype=None, kwargs={'order': 1, 'circular': False})] != [CoordMetaData(defn=CoordDefn(standard_name='latitude', long_name=None, var_name=None, units=Unit('degrees'), attributes={}, coord_system=GeogCS(6371230.0)), dims=(0,), points_dtype=dtype('int32'), bounds_dtype=None, kwargs={'order': 1, 'circular': False}), CoordMetaData(defn=CoordDefn(standard_name='longitude', long_name=None, var_name=None, units=Unit('degrees'), attributes={}, coord_system=GeogCS(6371229.0)), dims=(1,), points_dtype=dtype('int32'), bounds_dtype=None, kwargs={'order': 1, 'circular': False})]",
"output_type": "pyerr",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[1;31mConcatenateError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-9-66d60292bda2>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[1;32mprint\u001b[0m \u001b[0miris\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcube\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mCubeList\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mcube\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcube3\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mconcatenate_cube\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[1;32m/home/h05/cpelley/git/iris/lib/iris/cube.pyc\u001b[0m in \u001b[0;36mconcatenate_cube\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 440\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 441\u001b[0m \"\"\"\n\u001b[1;32m--> 442\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0miris\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_concatenate\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mconcatenate\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0merror_on_mismatch\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mTrue\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 443\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 444\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mconcatenate\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32m/home/h05/cpelley/git/iris/lib/iris/_concatenate.pyc\u001b[0m in \u001b[0;36mconcatenate\u001b[1;34m(cubes, error_on_mismatch)\u001b[0m\n\u001b[0;32m 237\u001b[0m \u001b[1;31m# Register cube with an existing proto-cube.\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 238\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0mproto_cube\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mproto_cubes\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 239\u001b[1;33m \u001b[0mregistered\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mproto_cube\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mregister\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mcube\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0merror_on_mismatch\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 240\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mregistered\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 241\u001b[0m \u001b[0maxis\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mproto_cube\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0maxis\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32m/home/h05/cpelley/git/iris/lib/iris/_concatenate.pyc\u001b[0m in \u001b[0;36mregister\u001b[1;34m(self, cube, axis, error_on_mismatch)\u001b[0m\n\u001b[0;32m 628\u001b[0m \u001b[1;31m# Check for compatible cube signatures.\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 629\u001b[0m \u001b[0mcube_signature\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0m_CubeSignature\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mcube\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 630\u001b[1;33m \u001b[0mmatch\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_cube_signature\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mmatch\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mcube_signature\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0merror_on_mismatch\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 631\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 632\u001b[0m \u001b[1;31m# Check for compatible coordinate signatures.\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32m/home/h05/cpelley/git/iris/lib/iris/_concatenate.pyc\u001b[0m in \u001b[0;36mmatch\u001b[1;34m(self, other, error_on_mismatch)\u001b[0m\n\u001b[0;32m 372\u001b[0m \u001b[0mmatch\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;32mnot\u001b[0m \u001b[0mbool\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mmsgs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 373\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0merror_on_mismatch\u001b[0m \u001b[1;32mand\u001b[0m \u001b[1;32mnot\u001b[0m \u001b[0mmatch\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 374\u001b[1;33m \u001b[1;32mraise\u001b[0m \u001b[0miris\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mexceptions\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mConcatenateError\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mmsgs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 375\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mmatch\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 376\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;31mConcatenateError\u001b[0m: failed to concatenate into a single cube.\n Dimensions metadata differs: [CoordMetaData(defn=CoordDefn(standard_name='latitude', long_name=None, var_name=None, units=Unit('degrees'), attributes={}, coord_system=GeogCS(6371229.0)), dims=(0,), points_dtype=dtype('int32'), bounds_dtype=None, kwargs={'order': 1, 'circular': False}), CoordMetaData(defn=CoordDefn(standard_name='longitude', long_name=None, var_name=None, units=Unit('degrees'), attributes={}, coord_system=GeogCS(6371229.0)), dims=(1,), points_dtype=dtype('int32'), bounds_dtype=None, kwargs={'order': 1, 'circular': False})] != [CoordMetaData(defn=CoordDefn(standard_name='latitude', long_name=None, var_name=None, units=Unit('degrees'), attributes={}, coord_system=GeogCS(6371230.0)), dims=(0,), points_dtype=dtype('int32'), bounds_dtype=None, kwargs={'order': 1, 'circular': False}), CoordMetaData(defn=CoordDefn(standard_name='longitude', long_name=None, var_name=None, units=Unit('degrees'), attributes={}, coord_system=GeogCS(6371229.0)), dims=(1,), points_dtype=dtype('int32'), bounds_dtype=None, kwargs={'order': 1, 'circular': False})]"
]
}
],
"prompt_number": 9
}
],
"metadata": {}
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment