Created
May 10, 2018 18:48
-
-
Save pgolding/46ff636c6937f11bcd42408e4ff1dff8 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"metadata": { | |
"trusted": true, | |
"collapsed": true | |
}, | |
"cell_type": "code", | |
"source": "from scipy import spatial\nimport numpy as np\nimport matplotlib.pyplot as plt\n%matplotlib inline", | |
"execution_count": 7, | |
"outputs": [] | |
}, | |
{ | |
"metadata": { | |
"trusted": true, | |
"collapsed": false | |
}, | |
"cell_type": "code", | |
"source": "x, y = np.mgrid[0:5, 2:8]", | |
"execution_count": 4, | |
"outputs": [] | |
}, | |
{ | |
"metadata": { | |
"trusted": true, | |
"collapsed": false | |
}, | |
"cell_type": "code", | |
"source": "plt.scatter(x,y)", | |
"execution_count": 12, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": "<matplotlib.collections.PathCollection at 0x116511e80>" | |
}, | |
"metadata": {}, | |
"execution_count": 12 | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"text/plain": "<matplotlib.figure.Figure at 0x1132544a8>", | |
"image/png": "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\n" | |
}, | |
"metadata": {} | |
} | |
] | |
}, | |
{ | |
"metadata": { | |
"trusted": true, | |
"collapsed": false | |
}, | |
"cell_type": "code", | |
"source": "data = np.vstack((x.ravel(), y.ravel())).T", | |
"execution_count": 27, | |
"outputs": [] | |
}, | |
{ | |
"metadata": { | |
"trusted": true, | |
"collapsed": true | |
}, | |
"cell_type": "code", | |
"source": "tree = spatial.KDTree(data)", | |
"execution_count": 28, | |
"outputs": [] | |
}, | |
{ | |
"metadata": { | |
"trusted": true, | |
"collapsed": false | |
}, | |
"cell_type": "code", | |
"source": "tree.data", | |
"execution_count": 29, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": "array([[0, 2],\n [0, 3],\n [0, 4],\n [0, 5],\n [0, 6],\n [0, 7],\n [1, 2],\n [1, 3],\n [1, 4],\n [1, 5],\n [1, 6],\n [1, 7],\n [2, 2],\n [2, 3],\n [2, 4],\n [2, 5],\n [2, 6],\n [2, 7],\n [3, 2],\n [3, 3],\n [3, 4],\n [3, 5],\n [3, 6],\n [3, 7],\n [4, 2],\n [4, 3],\n [4, 4],\n [4, 5],\n [4, 6],\n [4, 7]])" | |
}, | |
"metadata": {}, | |
"execution_count": 29 | |
} | |
] | |
}, | |
{ | |
"metadata": { | |
"trusted": true, | |
"collapsed": false | |
}, | |
"cell_type": "code", | |
"source": "# annotate the plot\nfig = plt.figure()\nax = fig.add_subplot(111)\nax.scatter(x,y)\nfor point in range(len(tree.data)):\n ax.annotate(str(point), xy=tree.data[point])\nplt.show()", | |
"execution_count": 70, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": "<matplotlib.collections.PathCollection at 0x1170b1518>" | |
}, | |
"metadata": {}, | |
"execution_count": 70 | |
}, | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": "Text(0,2,'0')" | |
}, | |
"metadata": {}, | |
"execution_count": 70 | |
}, | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": "Text(0,3,'1')" | |
}, | |
"metadata": {}, | |
"execution_count": 70 | |
}, | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": "Text(0,4,'2')" | |
}, | |
"metadata": {}, | |
"execution_count": 70 | |
}, | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": "Text(0,5,'3')" | |
}, | |
"metadata": {}, | |
"execution_count": 70 | |
}, | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": "Text(0,6,'4')" | |
}, | |
"metadata": {}, | |
"execution_count": 70 | |
}, | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": "Text(0,7,'5')" | |
}, | |
"metadata": {}, | |
"execution_count": 70 | |
}, | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": "Text(1,2,'6')" | |
}, | |
"metadata": {}, | |
"execution_count": 70 | |
}, | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": "Text(1,3,'7')" | |
}, | |
"metadata": {}, | |
"execution_count": 70 | |
}, | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": "Text(1,4,'8')" | |
}, | |
"metadata": {}, | |
"execution_count": 70 | |
}, | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": "Text(1,5,'9')" | |
}, | |
"metadata": {}, | |
"execution_count": 70 | |
}, | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": "Text(1,6,'10')" | |
}, | |
"metadata": {}, | |
"execution_count": 70 | |
}, | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": "Text(1,7,'11')" | |
}, | |
"metadata": {}, | |
"execution_count": 70 | |
}, | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": "Text(2,2,'12')" | |
}, | |
"metadata": {}, | |
"execution_count": 70 | |
}, | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": "Text(2,3,'13')" | |
}, | |
"metadata": {}, | |
"execution_count": 70 | |
}, | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": "Text(2,4,'14')" | |
}, | |
"metadata": {}, | |
"execution_count": 70 | |
}, | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": "Text(2,5,'15')" | |
}, | |
"metadata": {}, | |
"execution_count": 70 | |
}, | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": "Text(2,6,'16')" | |
}, | |
"metadata": {}, | |
"execution_count": 70 | |
}, | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": "Text(2,7,'17')" | |
}, | |
"metadata": {}, | |
"execution_count": 70 | |
}, | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": "Text(3,2,'18')" | |
}, | |
"metadata": {}, | |
"execution_count": 70 | |
}, | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": "Text(3,3,'19')" | |
}, | |
"metadata": {}, | |
"execution_count": 70 | |
}, | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": "Text(3,4,'20')" | |
}, | |
"metadata": {}, | |
"execution_count": 70 | |
}, | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": "Text(3,5,'21')" | |
}, | |
"metadata": {}, | |
"execution_count": 70 | |
}, | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": "Text(3,6,'22')" | |
}, | |
"metadata": {}, | |
"execution_count": 70 | |
}, | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": "Text(3,7,'23')" | |
}, | |
"metadata": {}, | |
"execution_count": 70 | |
}, | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": "Text(4,2,'24')" | |
}, | |
"metadata": {}, | |
"execution_count": 70 | |
}, | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": "Text(4,3,'25')" | |
}, | |
"metadata": {}, | |
"execution_count": 70 | |
}, | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": "Text(4,4,'26')" | |
}, | |
"metadata": {}, | |
"execution_count": 70 | |
}, | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": "Text(4,5,'27')" | |
}, | |
"metadata": {}, | |
"execution_count": 70 | |
}, | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": "Text(4,6,'28')" | |
}, | |
"metadata": {}, | |
"execution_count": 70 | |
}, | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": "Text(4,7,'29')" | |
}, | |
"metadata": {}, | |
"execution_count": 70 | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"text/plain": "<matplotlib.figure.Figure at 0x116bd8fd0>", | |
"image/png": "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\n" | |
}, | |
"metadata": {} | |
} | |
] | |
}, | |
{ | |
"metadata": { | |
"trusted": true, | |
"collapsed": true | |
}, | |
"cell_type": "code", | |
"source": "pts = np.array([[0, 0], [2.1, 2.9]])", | |
"execution_count": 31, | |
"outputs": [] | |
}, | |
{ | |
"metadata": { | |
"trusted": true, | |
"collapsed": false | |
}, | |
"cell_type": "code", | |
"source": "tree.query(pts)", | |
"execution_count": 32, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": "(array([2. , 0.14142136]), array([ 0, 13]))" | |
}, | |
"metadata": {}, | |
"execution_count": 32 | |
} | |
] | |
}, | |
{ | |
"metadata": { | |
"trusted": true, | |
"collapsed": false | |
}, | |
"cell_type": "code", | |
"source": "# Let's see what those nearest points [0,13] are?\ntree.data[0], tree.data[13]", | |
"execution_count": 35, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": "(array([0, 2]), array([2, 3]))" | |
}, | |
"metadata": {}, | |
"execution_count": 35 | |
} | |
] | |
}, | |
{ | |
"metadata": { | |
"trusted": true, | |
"collapsed": false | |
}, | |
"cell_type": "code", | |
"source": "# Let's confirm distances:\n# For the point at index 0\ntree_index = 0\nxd = tree.data[tree_index][0] - pts[0][0]\nyd = tree.data[tree_index][1] - pts[0][1]\nd = np.sqrt(xd * xd + yd * yd)\nd", | |
"execution_count": 44, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": "2.0" | |
}, | |
"metadata": {}, | |
"execution_count": 44 | |
} | |
] | |
}, | |
{ | |
"metadata": { | |
"trusted": true, | |
"collapsed": false | |
}, | |
"cell_type": "code", | |
"source": "# For the point at index 13\ntree_index = 13\nxd = tree.data[tree_index][0] - pts[1][0]\nyd = tree.data[tree_index][1] - pts[1][1]\nd = np.sqrt(xd * xd + yd * yd)\nd", | |
"execution_count": 45, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": "0.14142135623730964" | |
}, | |
"metadata": {}, | |
"execution_count": 45 | |
} | |
] | |
}, | |
{ | |
"metadata": { | |
"trusted": true, | |
"collapsed": false | |
}, | |
"cell_type": "code", | |
"source": "# find pairs with a maximum distance (r)\nr = 1.5\ntree.query_pairs(r)", | |
"execution_count": 53, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": "{(0, 1),\n (0, 6),\n (0, 7),\n (1, 2),\n (1, 6),\n (1, 7),\n (1, 8),\n (2, 3),\n (2, 7),\n (2, 8),\n (2, 9),\n (3, 4),\n (3, 8),\n (3, 9),\n (3, 10),\n (4, 5),\n (4, 9),\n (4, 10),\n (4, 11),\n (5, 10),\n (5, 11),\n (6, 7),\n (6, 12),\n (6, 13),\n (7, 8),\n (7, 12),\n (7, 13),\n (7, 14),\n (8, 9),\n (8, 13),\n (8, 14),\n (8, 15),\n (9, 10),\n (9, 14),\n (9, 15),\n (9, 16),\n (10, 11),\n (10, 15),\n (10, 16),\n (10, 17),\n (11, 16),\n (11, 17),\n (12, 13),\n (12, 18),\n (12, 19),\n (13, 14),\n (13, 18),\n (13, 19),\n (13, 20),\n (14, 15),\n (14, 19),\n (14, 20),\n (14, 21),\n (15, 16),\n (15, 20),\n (15, 21),\n (15, 22),\n (16, 17),\n (16, 21),\n (16, 22),\n (16, 23),\n (17, 22),\n (17, 23),\n (18, 19),\n (18, 24),\n (18, 25),\n (19, 20),\n (19, 24),\n (19, 25),\n (19, 26),\n (20, 21),\n (20, 25),\n (20, 26),\n (20, 27),\n (21, 22),\n (21, 26),\n (21, 27),\n (21, 28),\n (22, 23),\n (22, 27),\n (22, 28),\n (22, 29),\n (23, 28),\n (23, 29),\n (24, 25),\n (25, 26),\n (26, 27),\n (27, 28),\n (28, 29)}" | |
}, | |
"metadata": {}, | |
"execution_count": 53 | |
} | |
] | |
}, | |
{ | |
"metadata": { | |
"trusted": true, | |
"collapsed": false | |
}, | |
"cell_type": "code", | |
"source": "# What if we just have 1-d data?\n# convert to array of arrays\ny_data = [[i] for i in y.ravel()]\ny_tree = spatial.KDTree(y_data)", | |
"execution_count": 87, | |
"outputs": [] | |
}, | |
{ | |
"metadata": { | |
"trusted": true, | |
"collapsed": false | |
}, | |
"cell_type": "code", | |
"source": "# so this is the data (in its continual list form)\ny.ravel()", | |
"execution_count": 95, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": "array([2, 3, 4, 5, 6, 7, 2, 3, 4, 5, 6, 7, 2, 3, 4, 5, 6, 7, 2, 3, 4, 5,\n 6, 7, 2, 3, 4, 5, 6, 7])" | |
}, | |
"metadata": {}, | |
"execution_count": 95 | |
} | |
] | |
}, | |
{ | |
"metadata": { | |
"trusted": true, | |
"collapsed": false | |
}, | |
"cell_type": "code", | |
"source": "# And these are the pairs within dist or each other\ndist = 1\ny_tree.query_pairs(dist)", | |
"execution_count": 97, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": "{(0, 1),\n (0, 6),\n (0, 7),\n (0, 12),\n (0, 13),\n (0, 18),\n (0, 19),\n (0, 24),\n (0, 25),\n (1, 2),\n (1, 6),\n (1, 7),\n (1, 8),\n (1, 12),\n (1, 13),\n (1, 14),\n (1, 18),\n (1, 19),\n (1, 20),\n (1, 24),\n (1, 25),\n (1, 26),\n (2, 3),\n (2, 7),\n (2, 8),\n (2, 9),\n (2, 13),\n (2, 14),\n (2, 15),\n (2, 19),\n (2, 20),\n (2, 21),\n (2, 25),\n (2, 26),\n (2, 27),\n (3, 4),\n (3, 8),\n (3, 9),\n (3, 10),\n (3, 14),\n (3, 15),\n (3, 16),\n (3, 20),\n (3, 21),\n (3, 22),\n (3, 26),\n (3, 27),\n (3, 28),\n (4, 5),\n (4, 9),\n (4, 10),\n (4, 11),\n (4, 15),\n (4, 16),\n (4, 17),\n (4, 21),\n (4, 22),\n (4, 23),\n (4, 27),\n (4, 28),\n (4, 29),\n (5, 10),\n (5, 11),\n (5, 16),\n (5, 17),\n (5, 22),\n (5, 23),\n (5, 28),\n (5, 29),\n (6, 7),\n (6, 12),\n (6, 13),\n (6, 18),\n (6, 19),\n (6, 24),\n (6, 25),\n (7, 8),\n (7, 12),\n (7, 13),\n (7, 14),\n (7, 18),\n (7, 19),\n (7, 20),\n (7, 24),\n (7, 25),\n (7, 26),\n (8, 9),\n (8, 13),\n (8, 14),\n (8, 15),\n (8, 19),\n (8, 20),\n (8, 21),\n (8, 25),\n (8, 26),\n (8, 27),\n (9, 10),\n (9, 14),\n (9, 15),\n (9, 16),\n (9, 20),\n (9, 21),\n (9, 22),\n (9, 26),\n (9, 27),\n (9, 28),\n (10, 11),\n (10, 15),\n (10, 16),\n (10, 17),\n (10, 21),\n (10, 22),\n (10, 23),\n (10, 27),\n (10, 28),\n (10, 29),\n (11, 16),\n (11, 17),\n (11, 22),\n (11, 23),\n (11, 28),\n (11, 29),\n (12, 13),\n (12, 18),\n (12, 19),\n (12, 24),\n (12, 25),\n (13, 14),\n (13, 18),\n (13, 19),\n (13, 20),\n (13, 24),\n (13, 25),\n (13, 26),\n (14, 15),\n (14, 19),\n (14, 20),\n (14, 21),\n (14, 25),\n (14, 26),\n (14, 27),\n (15, 16),\n (15, 20),\n (15, 21),\n (15, 22),\n (15, 26),\n (15, 27),\n (15, 28),\n (16, 17),\n (16, 21),\n (16, 22),\n (16, 23),\n (16, 27),\n (16, 28),\n (16, 29),\n (17, 22),\n (17, 23),\n (17, 28),\n (17, 29),\n (18, 19),\n (18, 24),\n (18, 25),\n (19, 20),\n (19, 24),\n (19, 25),\n (19, 26),\n (20, 21),\n (20, 25),\n (20, 26),\n (20, 27),\n (21, 22),\n (21, 26),\n (21, 27),\n (21, 28),\n (22, 23),\n (22, 27),\n (22, 28),\n (22, 29),\n (23, 28),\n (23, 29),\n (24, 25),\n (25, 26),\n (26, 27),\n (27, 28),\n (28, 29)}" | |
}, | |
"metadata": {}, | |
"execution_count": 97 | |
} | |
] | |
}, | |
{ | |
"metadata": { | |
"trusted": true, | |
"collapsed": false | |
}, | |
"cell_type": "code", | |
"source": "# Let's confirm some of them\ndist = 1\npairs = []\nfor index in set([i[0] for i in y_tree.query_pairs(dist)]):\n pairs.append([y_data[i[1]] for i in y_tree.query_pairs(dist) if i[0] == index])", | |
"execution_count": 167, | |
"outputs": [] | |
}, | |
{ | |
"metadata": { | |
"trusted": true, | |
"collapsed": false | |
}, | |
"cell_type": "code", | |
"source": "y.ravel()", | |
"execution_count": 168, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": "array([2, 3, 4, 5, 6, 7, 2, 3, 4, 5, 6, 7, 2, 3, 4, 5, 6, 7, 2, 3, 4, 5,\n 6, 7, 2, 3, 4, 5, 6, 7])" | |
}, | |
"metadata": {}, | |
"execution_count": 168 | |
} | |
] | |
}, | |
{ | |
"metadata": { | |
"trusted": true, | |
"collapsed": false | |
}, | |
"cell_type": "code", | |
"source": "pairs", | |
"execution_count": 169, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": "[[[3], [3], [2], [2], [3], [2], [3], [2], [3]],\n [[2], [2], [4], [3], [4], [3], [4], [2], [3], [4], [2], [3], [4]],\n [[5], [3], [4], [3], [3], [4], [5], [4], [3], [4], [5], [5], [5]],\n [[6], [5], [6], [5], [5], [6], [6], [5], [4], [6], [4], [4], [4]],\n [[6], [7], [6], [5], [5], [6], [7], [7], [5], [6], [7], [5], [7]],\n [[7], [7], [6], [7], [7], [6], [6], [6]],\n [[3], [3], [3], [2], [2], [2], [3]],\n [[2], [3], [3], [4], [2], [2], [4], [4], [3], [4]],\n [[5], [5], [5], [3], [3], [3], [4], [4], [4], [5]],\n [[4], [5], [4], [6], [4], [5], [6], [5], [6], [6]],\n [[7], [7], [7], [5], [6], [7], [5], [5], [6], [6]],\n [[6], [6], [6], [7], [7], [7]],\n [[3], [2], [2], [3], [3]],\n [[4], [4], [3], [3], [2], [2], [4]],\n [[5], [5], [3], [3], [4], [5], [4]],\n [[5], [4], [6], [4], [6], [6], [5]],\n [[6], [6], [7], [7], [7], [5], [5]],\n [[7], [7], [6], [6]],\n [[3], [3], [2]],\n [[2], [4], [3], [4]],\n [[3], [4], [5], [5]],\n [[6], [5], [4], [6]],\n [[6], [7], [7], [5]],\n [[6], [7]],\n [[3]],\n [[4]],\n [[5]],\n [[6]],\n [[7]]]" | |
}, | |
"metadata": {}, | |
"execution_count": 169 | |
} | |
] | |
}, | |
{ | |
"metadata": { | |
"trusted": true, | |
"collapsed": true | |
}, | |
"cell_type": "code", | |
"source": "", | |
"execution_count": null, | |
"outputs": [] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"name": "conda-env-ocr-py", | |
"display_name": "Python [conda env:ocr]", | |
"language": "python" | |
}, | |
"language_info": { | |
"name": "python", | |
"file_extension": ".py", | |
"nbconvert_exporter": "python", | |
"mimetype": "text/x-python", | |
"pygments_lexer": "ipython3", | |
"version": "3.5.4", | |
"codemirror_mode": { | |
"name": "ipython", | |
"version": 3 | |
} | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 0 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment