Skip to content

Instantly share code, notes, and snippets.

@vals
Created June 28, 2014 23:37
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save vals/150ec97a5b7db9c82ee9 to your computer and use it in GitHub Desktop.
Save vals/150ec97a5b7db9c82ee9 to your computer and use it in GitHub Desktop.
IPython notebook illustrating how to extract cluster elements in Python Dendrograms
Display the source blob
Display the rendered blob
Raw
{
"metadata": {
"name": "",
"signature": "sha256:83bfe0fdc640954eec9c5be1cd0ab239da3c9d4f47bfdf9af143156b7d39af1d"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Extract Clusters from Python Dendrogram"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"One aspect of using Python for data analysis is that hierarchical clustering dendrograms are rather cumbersome to work with. Both in terms of plotting next to a heatmap, and how to relate the input data to the resulting plot. Ideally the `dendrogram` function would return a proper instances of some Dendrogram class.\n",
"\n",
"There are plenty ([1](http://nbviewer.ipython.org/github/OxanaSachenkova/hclust-python/blob/master/hclust.ipynb), [2](http://nbviewer.ipython.org/github/herrfz/dataanalysis/blob/master/week3/hierarchical_clustering.ipynb)) of guides around on how to make R inspired heatmaps with dendrograms. Here I will describe how to parse out the cluster members as seen in a dendrogram, which can be handy if one notices interesting patterns in the corresponding heatmap.\n",
"\n",
"Let's start with importing some modules."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%pylab inline"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Populating the interactive namespace from numpy and matplotlib\n"
]
}
],
"prompt_number": 1
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from collections import defaultdict\n",
"\n",
"import pandas as pd\n",
"from scipy.cluster.hierarchy import dendrogram, set_link_color_palette\n",
"from fastcluster import linkage\n",
"import seaborn as sns\n",
"from matplotlib.colors import rgb2hex, colorConverter"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 2
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We also set some prettier non-default colors."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"sns.set_palette('Set1', 10, 0.65)\n",
"palette = sns.color_palette()\n",
"set_link_color_palette(map(rgb2hex, palette))\n",
"sns.set_style('white')"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 3
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"numpy.random.seed(0025)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 4
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We should create some simple example data for the purpose of illustration."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"x, y = 3, 10\n",
"df = pd.DataFrame(np.random.randn(x, y),\n",
" index=['sample_{}'.format(i) for i in range(1, x + 1)],\n",
" columns=['gene_{}'.format(i) for i in range(1, y + 1)])"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 5
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"link = linkage(df, metric='correlation', method='ward')"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 6
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"figsize(8, 3)\n",
"den = dendrogram(link, labels=df.index, abv_threshold_color='#AAAAAA')\n",
"plt.xticks(rotation=90)\n",
"no_spine = {'left': True, 'bottom': True, 'right': True, 'top': True}\n",
"sns.despine(**no_spine);\n",
"\n",
"plt.tight_layout()\n",
"plt.savefig('tree1.png');"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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\nJLXRfwP8srEYBlrZZAAAAABJRU5ErkJggg==\n",
"text": [
"<matplotlib.figure.Figure at 0x108d12190>"
]
}
],
"prompt_number": 7
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The dendrogram function will return a dictonary containing a representation of the tree as plotted."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"den"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 8,
"text": [
"{'color_list': ['#c13d3f', '#AAAAAA'],\n",
" 'dcoord': [[0.0, 0.70210454159043401, 0.70210454159043401, 0.0],\n",
" [0.0, 1.1003608323279817, 1.1003608323279817, 0.70210454159043401]],\n",
" 'icoord': [[15.0, 15.0, 25.0, 25.0], [5.0, 5.0, 20.0, 20.0]],\n",
" 'ivl': ['sample_3', 'sample_1', 'sample_2'],\n",
" 'leaves': [2, 0, 1]}"
]
}
],
"prompt_number": 8
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The tree is represented as a collection of \u220f shaped components.\n",
"\n",
"The three items named 'color_list', 'dcoord', 'icoord' indexes these \u220f's\n",
"\n",
"Obviosly 'color\\_list' contains the colors. The lists in 'dcoord' contain the y coordinates of the \u220f's (the _distances_) while 'icoord' has the x coordinates. These would be the _index coordinates_.\n",
"\n",
"In the minimal example above we have two \u220f's, and one can see that the x-coordinates are repeated once.\n",
"\n",
"The coordinates go from left to right. So for the red \u220f, the 'legs' are located at 15 and 25, while the grey one has legs at 5 and 20.\n",
"\n",
"The apperant pattern is that legs positioned at leaves will end with 5. The reason is to nicely place the leg at the middle of the corresponding leaf index value. This also implies the actual list indices of the leaf are multiplied by 10.\n",
"\n",
"Thus we first subtract 5 from each colors icoord, then divide by 10. If the resulting number is close to the closest integer, we consider this to be an index for a leaf. If the resulting number is not close to an integer index, it means the colored tree we got it from is from non-leaf parts of the trees.\n",
"\n",
"For each leaf, we add it to a list per color in a dictionary."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"cluster_idxs = defaultdict(list)\n",
"for c, pi in zip(den['color_list'], den['icoord']):\n",
" for leg in pi[1:3]:\n",
" i = (leg - 5.0) / 10.0\n",
" if abs(i - int(i)) < 1e-5:\n",
" cluster_idxs[c].append(int(i))"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 9
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"cluster_idxs"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 10,
"text": [
"defaultdict(<type 'list'>, {'#c13d3f': [1, 2], '#AAAAAA': [0]})"
]
}
],
"prompt_number": 10
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Next we need to grab the labels of the leaves given the indexes. But before we do that, since it's difficult to keep track of what color e.g. '#c13d3f' is, we make make an [IPython notebook compatible HTML representation](http://ipython.org/ipython-doc/dev/config/integrating.html) of the dictionary holding the information. Objects of this class will behave just like dictionaries, except for representing them as a HTML table."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"class Clusters(dict):\n",
" def _repr_html_(self):\n",
" html = '<table style=\"border: 0;\">'\n",
" for c in self:\n",
" hx = rgb2hex(colorConverter.to_rgb(c))\n",
" html += '<tr style=\"border: 0;\">' \\\n",
" '<td style=\"background-color: {0}; ' \\\n",
" 'border: 0;\">' \\\n",
" '<code style=\"background-color: {0};\">'.format(hx)\n",
" html += c + '</code></td>'\n",
" html += '<td style=\"border: 0\"><code>' \n",
" html += repr(self[c]) + '</code>'\n",
" html += '</td></tr>'\n",
" \n",
" html += '</table>'\n",
" \n",
" return html"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 11
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"(Note that the representation uses colerConverter from matplotlib, so it supports any matplotlib supported color representation, not only hex color strings.)\n",
"\n",
"Now just go through the list of indices and fetch labels."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"cluster_classes = Clusters()\n",
"for c, l in cluster_idxs.items():\n",
" i_l = [den['ivl'][i] for i in l]\n",
" cluster_classes[c] = i_l"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 12
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"cluster_classes"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"<table style=\"border: 0;\"><tr style=\"border: 0;\"><td style=\"background-color: #c13d3f; border: 0;\"><code style=\"background-color: #c13d3f;\">#c13d3f</code></td><td style=\"border: 0\"><code>['sample_1', 'sample_2']</code></td></tr><tr style=\"border: 0;\"><td style=\"background-color: #aaaaaa; border: 0;\"><code style=\"background-color: #aaaaaa;\">#AAAAAA</code></td><td style=\"border: 0\"><code>['sample_3']</code></td></tr></table>"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 13,
"text": [
"{'#AAAAAA': ['sample_3'], '#c13d3f': ['sample_1', 'sample_2']}"
]
}
],
"prompt_number": 13
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"print(cluster_classes._repr_html_())"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"<table style=\"border: 0;\"><tr style=\"border: 0;\"><td style=\"background-color: #c13d3f; border: 0;\"><code style=\"background-color: #c13d3f;\">#c13d3f</code></td><td style=\"border: 0\"><code>['sample_1', 'sample_2']</code></td></tr><tr style=\"border: 0;\"><td style=\"background-color: #aaaaaa; border: 0;\"><code style=\"background-color: #aaaaaa;\">#AAAAAA</code></td><td style=\"border: 0\"><code>['sample_3']</code></td></tr></table>\n"
]
}
],
"prompt_number": 14
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's combine this to a nice reusable function, and try it out on a larger example."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def get_cluster_classes(den, label='ivl'):\n",
" cluster_idxs = defaultdict(list)\n",
" for c, pi in zip(den['color_list'], den['icoord']):\n",
" for leg in pi[1:3]:\n",
" i = (leg - 5.0) / 10.0\n",
" if abs(i - int(i)) < 1e-5:\n",
" cluster_idxs[c].append(int(i))\n",
" \n",
" cluster_classes = Clusters()\n",
" for c, l in cluster_idxs.items():\n",
" i_l = [den[label][i] for i in l]\n",
" cluster_classes[c] = i_l\n",
" \n",
" return cluster_classes"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 15
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"x, y = 96, 10\n",
"df = pd.DataFrame(np.random.randn(x, y),\n",
" index=['sample_{}'.format(i) for i in range(1, x + 1)],\n",
" columns=['gene_{}'.format(i) for i in range(1, y + 1)])"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 16
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"link = linkage(df, metric='correlation', method='ward')"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 17
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"figsize(12, 4)\n",
"den = dendrogram(link, labels=df.index, abv_threshold_color='#AAAAAA')\n",
"plt.xticks(rotation=90)\n",
"sns.despine(**no_spine);\n",
"\n",
"plt.tight_layout()\n",
"plt.savefig('tree2.png');"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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\nbDtmf1PUoY6y+pri+ixFjBTXTTF1OVRXY9r/WXkn5StmdqbvH9F6tLBO6NjEtDOh/Znt7l/KY7zD\n3Tf1yGOJ8vNgAAAdkUlEQVSXu7/GzE6SdLWZfUBZ5+t77v6+iPKI2ZfiemWfEZL0mLvfJ+279u5e\nXlZXY+rIILlMMztmpUSONbMrJD1mZidIkpmdrKznuC8fMzvg4JjZ6cqGKiVJ7v4Td3+tshGGrcp6\n42u7/ubZ7v7fyoYnZWZPknRovnijmS0zs/nuvl3ZN0LXKftWqbONT0j6U0nvlnSYpEfcfaNnPduO\nW8zs85LWS7rVzK4wsy9KWp0vP8jMnprHW6usl/05Zd8M7OPul/XpWEXFCOUauS8/MbPfl/T3ZnaB\nmT3OzP5Q2bduMWXayaX72LxJBx6bgy0bKVJ+nB81s8XKvnWJyiPfzlQnfzM71LL7lHsuL+R/WOHH\nDWb2ITN7gZldL2mdmT2/uJ0E+xJT30PHN3g+xJZZ4PjNMrOzlH0bs9TMjjOzI5XVF8WsE1nPYs7v\n4rGda2Zz1MXdpyRtMbOf714emUfMsQmVa0yZhco9Jo8U5R7KI6YOhep7TJnE7O++OmBms83siZbd\nV98Rc06kqO+l24ks9+B2uur7kvzipijmcyRVu1r22ZqiLUpxDRD7uTpU+52iHXH3H0s6V9LzzOyN\n6t0xi/mMf3e/jlXncy2wvynqUCeXYn19fHc+Ca7PUsQY+rpJcedM8JwI7auyRxKuN7OD3P3CfJ03\nSPphYZ3QsYlpz0L742b2KWUd2QfN7O1m9mfKbts7gLvf7e4vlPRsZZ2rzv7EtBEprpsWmdk3JR1l\nZheb2WGWdfT2DZJY9nzYtOvAgphzIurzqp8qR67OUfZNjks63szuV3Z71isL61woaZll993OkrRH\n0j2SOj3tfRUub7iuy/8reoWkt5vZWt//TMIyZSeSlH1b8VLlt965+39Y1mN9g5Q1Vu7+iLvfY2bn\nS7pB2XM5B3D3d+Z/95uS/iNf51p3X5mv8ieS3mdmL3H3H7r7p8zsEGXDsrFem8d4sbv/qF+MiFxL\nlysr33crG5I/WtK7JH1N+4dyQ2UqZcO7ne31OzavlHR9fuLfL+kiZcf8zZF5yAL3BlvcM3Uvz7f1\nXEl3Knv+6hmSXpwv/3GCfYmp753j26+OXKjy8yGqzBQ+fi+X9BZltyP8pqSbJc3rihFcJ6Kele6P\n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\n/yFe1vkg+112AAAAAElFTkSuQmCC\n",
"text": [
"<matplotlib.figure.Figure at 0x108d36bd0>"
]
}
],
"prompt_number": 18
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"get_cluster_classes(den)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"<table style=\"border: 0;\"><tr style=\"border: 0;\"><td style=\"background-color: #c13d3f; border: 0;\"><code style=\"background-color: #c13d3f;\">#c13d3f</code></td><td style=\"border: 0\"><code>['sample_20', 'sample_87', 'sample_35', 'sample_2', 'sample_24', 'sample_13', 'sample_6', 'sample_82', 'sample_11', 'sample_12', 'sample_44', 'sample_94', 'sample_73', 'sample_77', 'sample_76']</code></td></tr><tr style=\"border: 0;\"><td style=\"background-color: #4e7ca1; border: 0;\"><code style=\"background-color: #4e7ca1;\">#4e7ca1</code></td><td style=\"border: 0\"><code>['sample_56', 'sample_81', 'sample_69', 'sample_9', 'sample_27', 'sample_21', 'sample_45', 'sample_52', 'sample_59', 'sample_46', 'sample_93', 'sample_10', 'sample_48', 'sample_78', 'sample_14', 'sample_50', 'sample_31', 'sample_91', 'sample_75', 'sample_86', 'sample_84', 'sample_55', 'sample_88', 'sample_43', 'sample_58', 'sample_33', 'sample_96', 'sample_34', 'sample_19', 'sample_68', 'sample_21']</code></td></tr><tr style=\"border: 0;\"><td style=\"background-color: #8e5d93; border: 0;\"><code style=\"background-color: #8e5d93;\">#8e5d93</code></td><td style=\"border: 0\"><code>['sample_4', 'sample_92', 'sample_15', 'sample_54', 'sample_1', 'sample_17', 'sample_42', 'sample_79', 'sample_41', 'sample_57', 'sample_63', 'sample_67', 'sample_22', 'sample_64', 'sample_83', 'sample_30', 'sample_53', 'sample_26', 'sample_3', 'sample_29', 'sample_28', 'sample_36', 'sample_7', 'sample_80', 'sample_8', 'sample_5', 'sample_71', 'sample_65', 'sample_39', 'sample_62', 'sample_85']</code></td></tr><tr style=\"border: 0;\"><td style=\"background-color: #5e9d5c; border: 0;\"><code style=\"background-color: #5e9d5c;\">#5e9d5c</code></td><td style=\"border: 0\"><code>['sample_23', 'sample_38', 'sample_90', 'sample_51', 'sample_25', 'sample_60', 'sample_74', 'sample_18', 'sample_61', 'sample_32', 'sample_49', 'sample_37', 'sample_70', 'sample_66', 'sample_16', 'sample_95', 'sample_40', 'sample_72', 'sample_47', 'sample_89', 'sample_40']</code></td></tr></table>"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 19,
"text": [
"{'#4e7ca1': ['sample_56',\n",
" 'sample_81',\n",
" 'sample_69',\n",
" 'sample_9',\n",
" 'sample_27',\n",
" 'sample_21',\n",
" 'sample_45',\n",
" 'sample_52',\n",
" 'sample_59',\n",
" 'sample_46',\n",
" 'sample_93',\n",
" 'sample_10',\n",
" 'sample_48',\n",
" 'sample_78',\n",
" 'sample_14',\n",
" 'sample_50',\n",
" 'sample_31',\n",
" 'sample_91',\n",
" 'sample_75',\n",
" 'sample_86',\n",
" 'sample_84',\n",
" 'sample_55',\n",
" 'sample_88',\n",
" 'sample_43',\n",
" 'sample_58',\n",
" 'sample_33',\n",
" 'sample_96',\n",
" 'sample_34',\n",
" 'sample_19',\n",
" 'sample_68',\n",
" 'sample_21'],\n",
" '#5e9d5c': ['sample_23',\n",
" 'sample_38',\n",
" 'sample_90',\n",
" 'sample_51',\n",
" 'sample_25',\n",
" 'sample_60',\n",
" 'sample_74',\n",
" 'sample_18',\n",
" 'sample_61',\n",
" 'sample_32',\n",
" 'sample_49',\n",
" 'sample_37',\n",
" 'sample_70',\n",
" 'sample_66',\n",
" 'sample_16',\n",
" 'sample_95',\n",
" 'sample_40',\n",
" 'sample_72',\n",
" 'sample_47',\n",
" 'sample_89',\n",
" 'sample_40'],\n",
" '#8e5d93': ['sample_4',\n",
" 'sample_92',\n",
" 'sample_15',\n",
" 'sample_54',\n",
" 'sample_1',\n",
" 'sample_17',\n",
" 'sample_42',\n",
" 'sample_79',\n",
" 'sample_41',\n",
" 'sample_57',\n",
" 'sample_63',\n",
" 'sample_67',\n",
" 'sample_22',\n",
" 'sample_64',\n",
" 'sample_83',\n",
" 'sample_30',\n",
" 'sample_53',\n",
" 'sample_26',\n",
" 'sample_3',\n",
" 'sample_29',\n",
" 'sample_28',\n",
" 'sample_36',\n",
" 'sample_7',\n",
" 'sample_80',\n",
" 'sample_8',\n",
" 'sample_5',\n",
" 'sample_71',\n",
" 'sample_65',\n",
" 'sample_39',\n",
" 'sample_62',\n",
" 'sample_85'],\n",
" '#c13d3f': ['sample_20',\n",
" 'sample_87',\n",
" 'sample_35',\n",
" 'sample_2',\n",
" 'sample_24',\n",
" 'sample_13',\n",
" 'sample_6',\n",
" 'sample_82',\n",
" 'sample_11',\n",
" 'sample_12',\n",
" 'sample_44',\n",
" 'sample_94',\n",
" 'sample_73',\n",
" 'sample_77',\n",
" 'sample_76']}"
]
}
],
"prompt_number": 19
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"print(_._repr_html_())"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"<table style=\"border: 0;\"><tr style=\"border: 0;\"><td style=\"background-color: #c13d3f; border: 0;\"><code style=\"background-color: #c13d3f;\">#c13d3f</code></td><td style=\"border: 0\"><code>['sample_20', 'sample_87', 'sample_35', 'sample_2', 'sample_24', 'sample_13', 'sample_6', 'sample_82', 'sample_11', 'sample_12', 'sample_44', 'sample_94', 'sample_73', 'sample_77', 'sample_76']</code></td></tr><tr style=\"border: 0;\"><td style=\"background-color: #4e7ca1; border: 0;\"><code style=\"background-color: #4e7ca1;\">#4e7ca1</code></td><td style=\"border: 0\"><code>['sample_56', 'sample_81', 'sample_69', 'sample_9', 'sample_27', 'sample_21', 'sample_45', 'sample_52', 'sample_59', 'sample_46', 'sample_93', 'sample_10', 'sample_48', 'sample_78', 'sample_14', 'sample_50', 'sample_31', 'sample_91', 'sample_75', 'sample_86', 'sample_84', 'sample_55', 'sample_88', 'sample_43', 'sample_58', 'sample_33', 'sample_96', 'sample_34', 'sample_19', 'sample_68', 'sample_21']</code></td></tr><tr style=\"border: 0;\"><td style=\"background-color: #8e5d93; border: 0;\"><code style=\"background-color: #8e5d93;\">#8e5d93</code></td><td style=\"border: 0\"><code>['sample_4', 'sample_92', 'sample_15', 'sample_54', 'sample_1', 'sample_17', 'sample_42', 'sample_79', 'sample_41', 'sample_57', 'sample_63', 'sample_67', 'sample_22', 'sample_64', 'sample_83', 'sample_30', 'sample_53', 'sample_26', 'sample_3', 'sample_29', 'sample_28', 'sample_36', 'sample_7', 'sample_80', 'sample_8', 'sample_5', 'sample_71', 'sample_65', 'sample_39', 'sample_62', 'sample_85']</code></td></tr><tr style=\"border: 0;\"><td style=\"background-color: #5e9d5c; border: 0;\"><code style=\"background-color: #5e9d5c;\">#5e9d5c</code></td><td style=\"border: 0\"><code>['sample_23', 'sample_38', 'sample_90', 'sample_51', 'sample_25', 'sample_60', 'sample_74', 'sample_18', 'sample_61', 'sample_32', 'sample_49', 'sample_37', 'sample_70', 'sample_66', 'sample_16', 'sample_95', 'sample_40', 'sample_72', 'sample_47', 'sample_89', 'sample_40']</code></td></tr></table>\n"
]
}
],
"prompt_number": 20
},
{
"cell_type": "code",
"collapsed": false,
"input": [],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 20
}
],
"metadata": {}
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment