myawesomepkg 0.1.5__py3-none-any.whl → 0.1.6__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,528 @@
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "code",
5
+ "execution_count": 1,
6
+ "id": "6a850c8f",
7
+ "metadata": {},
8
+ "outputs": [],
9
+ "source": [
10
+ "import numpy as np"
11
+ ]
12
+ },
13
+ {
14
+ "cell_type": "code",
15
+ "execution_count": 6,
16
+ "id": "70d23e09",
17
+ "metadata": {},
18
+ "outputs": [],
19
+ "source": [
20
+ "import numpy as np\n",
21
+ "def selection_sort(x):\n",
22
+ " for i in range(len(x)):\n",
23
+ " swap = i + np.argmin(x[i:])\n",
24
+ " (x[i], x[swap]) = (x[swap], x[i])\n",
25
+ " return x"
26
+ ]
27
+ },
28
+ {
29
+ "cell_type": "code",
30
+ "execution_count": 7,
31
+ "id": "96d81709",
32
+ "metadata": {},
33
+ "outputs": [
34
+ {
35
+ "data": {
36
+ "text/plain": [
37
+ "array([1, 2, 3, 4, 5])"
38
+ ]
39
+ },
40
+ "execution_count": 7,
41
+ "metadata": {},
42
+ "output_type": "execute_result"
43
+ }
44
+ ],
45
+ "source": [
46
+ "x = np.array([2, 1, 4, 3, 5])\n",
47
+ "selection_sort(x)\n"
48
+ ]
49
+ },
50
+ {
51
+ "cell_type": "code",
52
+ "execution_count": 8,
53
+ "id": "60299786",
54
+ "metadata": {},
55
+ "outputs": [],
56
+ "source": [
57
+ "def bogosort(x):\n",
58
+ " while np.any(x[:-1] > x[1:]):\n",
59
+ " np.random.shuffle(x)\n",
60
+ " return x"
61
+ ]
62
+ },
63
+ {
64
+ "cell_type": "code",
65
+ "execution_count": 9,
66
+ "id": "23b750a7",
67
+ "metadata": {},
68
+ "outputs": [
69
+ {
70
+ "data": {
71
+ "text/plain": [
72
+ "array([1, 2, 3, 4, 5])"
73
+ ]
74
+ },
75
+ "execution_count": 9,
76
+ "metadata": {},
77
+ "output_type": "execute_result"
78
+ }
79
+ ],
80
+ "source": [
81
+ "x = np.array([2, 1, 4, 3, 5])\n",
82
+ "bogosort(x)"
83
+ ]
84
+ },
85
+ {
86
+ "cell_type": "code",
87
+ "execution_count": 10,
88
+ "id": "4b82614b",
89
+ "metadata": {},
90
+ "outputs": [
91
+ {
92
+ "data": {
93
+ "text/plain": [
94
+ "array([1, 2, 3, 4, 5])"
95
+ ]
96
+ },
97
+ "execution_count": 10,
98
+ "metadata": {},
99
+ "output_type": "execute_result"
100
+ }
101
+ ],
102
+ "source": [
103
+ "#Fast Sorting in NumPy: np.sort and np.argsort\n",
104
+ "x = np.array([2, 1, 4, 3, 5])\n",
105
+ "np.sort(x)\n"
106
+ ]
107
+ },
108
+ {
109
+ "cell_type": "code",
110
+ "execution_count": 11,
111
+ "id": "c32c433b",
112
+ "metadata": {},
113
+ "outputs": [
114
+ {
115
+ "name": "stdout",
116
+ "output_type": "stream",
117
+ "text": [
118
+ "[1 2 3 4 5]\n"
119
+ ]
120
+ }
121
+ ],
122
+ "source": [
123
+ "x.sort()\n",
124
+ "print(x)\n"
125
+ ]
126
+ },
127
+ {
128
+ "cell_type": "code",
129
+ "execution_count": 12,
130
+ "id": "428fc405",
131
+ "metadata": {},
132
+ "outputs": [
133
+ {
134
+ "name": "stdout",
135
+ "output_type": "stream",
136
+ "text": [
137
+ "[1 0 3 2 4]\n"
138
+ ]
139
+ }
140
+ ],
141
+ "source": [
142
+ "x = np.array([2, 1, 4, 3, 5])\n",
143
+ "i = np.argsort(x)\n",
144
+ "print(i)"
145
+ ]
146
+ },
147
+ {
148
+ "cell_type": "code",
149
+ "execution_count": 13,
150
+ "id": "ee25c2c7",
151
+ "metadata": {},
152
+ "outputs": [
153
+ {
154
+ "data": {
155
+ "text/plain": [
156
+ "array([1, 2, 3, 4, 5])"
157
+ ]
158
+ },
159
+ "execution_count": 13,
160
+ "metadata": {},
161
+ "output_type": "execute_result"
162
+ }
163
+ ],
164
+ "source": [
165
+ "x[i]"
166
+ ]
167
+ },
168
+ {
169
+ "cell_type": "code",
170
+ "execution_count": 14,
171
+ "id": "9e3ef0fd",
172
+ "metadata": {},
173
+ "outputs": [
174
+ {
175
+ "name": "stdout",
176
+ "output_type": "stream",
177
+ "text": [
178
+ "[[6 3 7 4 6 9]\n",
179
+ " [2 6 7 4 3 7]\n",
180
+ " [7 2 5 4 1 7]\n",
181
+ " [5 1 4 0 9 5]]\n"
182
+ ]
183
+ }
184
+ ],
185
+ "source": [
186
+ "rand = np.random.RandomState(42)\n",
187
+ "X = rand.randint(0, 10, (4, 6))\n",
188
+ "print(X)"
189
+ ]
190
+ },
191
+ {
192
+ "cell_type": "code",
193
+ "execution_count": 15,
194
+ "id": "84bec266",
195
+ "metadata": {},
196
+ "outputs": [
197
+ {
198
+ "data": {
199
+ "text/plain": [
200
+ "array([[2, 1, 4, 0, 1, 5],\n",
201
+ " [5, 2, 5, 4, 3, 7],\n",
202
+ " [6, 3, 7, 4, 6, 7],\n",
203
+ " [7, 6, 7, 4, 9, 9]])"
204
+ ]
205
+ },
206
+ "execution_count": 15,
207
+ "metadata": {},
208
+ "output_type": "execute_result"
209
+ }
210
+ ],
211
+ "source": [
212
+ "#sort each column of X\n",
213
+ "np.sort(X, axis=0)"
214
+ ]
215
+ },
216
+ {
217
+ "cell_type": "code",
218
+ "execution_count": 16,
219
+ "id": "e4104005",
220
+ "metadata": {},
221
+ "outputs": [
222
+ {
223
+ "data": {
224
+ "text/plain": [
225
+ "array([[3, 4, 6, 6, 7, 9],\n",
226
+ " [2, 3, 4, 6, 7, 7],\n",
227
+ " [1, 2, 4, 5, 7, 7],\n",
228
+ " [0, 1, 4, 5, 5, 9]])"
229
+ ]
230
+ },
231
+ "execution_count": 16,
232
+ "metadata": {},
233
+ "output_type": "execute_result"
234
+ }
235
+ ],
236
+ "source": [
237
+ "# sort each row of X\n",
238
+ "np.sort(X, axis=1)"
239
+ ]
240
+ },
241
+ {
242
+ "cell_type": "code",
243
+ "execution_count": 17,
244
+ "id": "41eaae40",
245
+ "metadata": {},
246
+ "outputs": [
247
+ {
248
+ "data": {
249
+ "text/plain": [
250
+ "array([2, 1, 3, 4, 6, 5, 7])"
251
+ ]
252
+ },
253
+ "execution_count": 17,
254
+ "metadata": {},
255
+ "output_type": "execute_result"
256
+ }
257
+ ],
258
+ "source": [
259
+ "#Partial Sorts: Partitioning\n",
260
+ "x = np.array([7, 2, 3, 1, 6, 5, 4])\n",
261
+ "np.partition(x, 3)"
262
+ ]
263
+ },
264
+ {
265
+ "cell_type": "code",
266
+ "execution_count": 18,
267
+ "id": "f54bfb2b",
268
+ "metadata": {},
269
+ "outputs": [
270
+ {
271
+ "data": {
272
+ "text/plain": [
273
+ "array([[3, 4, 6, 7, 6, 9],\n",
274
+ " [2, 3, 4, 7, 6, 7],\n",
275
+ " [1, 2, 4, 5, 7, 7],\n",
276
+ " [0, 1, 4, 5, 9, 5]])"
277
+ ]
278
+ },
279
+ "execution_count": 18,
280
+ "metadata": {},
281
+ "output_type": "execute_result"
282
+ }
283
+ ],
284
+ "source": [
285
+ "np.partition(X, 2, axis=1)\n"
286
+ ]
287
+ },
288
+ {
289
+ "cell_type": "code",
290
+ "execution_count": 19,
291
+ "id": "8b159c21",
292
+ "metadata": {},
293
+ "outputs": [],
294
+ "source": [
295
+ "#Example: k-Nearest Neighbors\n",
296
+ "X = rand.rand(10, 2)"
297
+ ]
298
+ },
299
+ {
300
+ "cell_type": "code",
301
+ "execution_count": 20,
302
+ "id": "14c5d229",
303
+ "metadata": {},
304
+ "outputs": [
305
+ {
306
+ "data": {
307
+ "image/png": "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\n",
308
+ "text/plain": [
309
+ "<Figure size 640x480 with 1 Axes>"
310
+ ]
311
+ },
312
+ "metadata": {},
313
+ "output_type": "display_data"
314
+ }
315
+ ],
316
+ "source": [
317
+ "%matplotlib inline\n",
318
+ "import matplotlib.pyplot as plt\n",
319
+ "import seaborn; seaborn.set() # Plot styling\n",
320
+ "plt.scatter(X[:, 0], X[:, 1], s=100);"
321
+ ]
322
+ },
323
+ {
324
+ "cell_type": "code",
325
+ "execution_count": 21,
326
+ "id": "b57ef914",
327
+ "metadata": {},
328
+ "outputs": [],
329
+ "source": [
330
+ "dist_sq = np.sum((X[:,np.newaxis,:] - X[np.newaxis,:,:]) ** 2, axis=-1)\n"
331
+ ]
332
+ },
333
+ {
334
+ "cell_type": "code",
335
+ "execution_count": 22,
336
+ "id": "38c3077b",
337
+ "metadata": {},
338
+ "outputs": [
339
+ {
340
+ "data": {
341
+ "text/plain": [
342
+ "(10, 10, 2)"
343
+ ]
344
+ },
345
+ "execution_count": 22,
346
+ "metadata": {},
347
+ "output_type": "execute_result"
348
+ }
349
+ ],
350
+ "source": [
351
+ "# for each pair of points, compute differences in their coordinates\n",
352
+ "differences = X[:, np.newaxis, :] - X[np.newaxis, :, :]\n",
353
+ "differences.shape"
354
+ ]
355
+ },
356
+ {
357
+ "cell_type": "code",
358
+ "execution_count": 23,
359
+ "id": "6584b72b",
360
+ "metadata": {},
361
+ "outputs": [
362
+ {
363
+ "data": {
364
+ "text/plain": [
365
+ "(10, 10, 2)"
366
+ ]
367
+ },
368
+ "execution_count": 23,
369
+ "metadata": {},
370
+ "output_type": "execute_result"
371
+ }
372
+ ],
373
+ "source": [
374
+ "# square the coordinate differences\n",
375
+ "sq_differences = differences ** 2\n",
376
+ "sq_differences.shape"
377
+ ]
378
+ },
379
+ {
380
+ "cell_type": "code",
381
+ "execution_count": 24,
382
+ "id": "d1e8cad3",
383
+ "metadata": {},
384
+ "outputs": [
385
+ {
386
+ "data": {
387
+ "text/plain": [
388
+ "(10, 10)"
389
+ ]
390
+ },
391
+ "execution_count": 24,
392
+ "metadata": {},
393
+ "output_type": "execute_result"
394
+ }
395
+ ],
396
+ "source": [
397
+ "# sum the coordinate differences to get the squared distance\n",
398
+ "dist_sq = sq_differences.sum(-1)\n",
399
+ "dist_sq.shape"
400
+ ]
401
+ },
402
+ {
403
+ "cell_type": "code",
404
+ "execution_count": 25,
405
+ "id": "2308b5d2",
406
+ "metadata": {},
407
+ "outputs": [
408
+ {
409
+ "data": {
410
+ "text/plain": [
411
+ "array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])"
412
+ ]
413
+ },
414
+ "execution_count": 25,
415
+ "metadata": {},
416
+ "output_type": "execute_result"
417
+ }
418
+ ],
419
+ "source": [
420
+ "dist_sq.diagonal()\n"
421
+ ]
422
+ },
423
+ {
424
+ "cell_type": "code",
425
+ "execution_count": 26,
426
+ "id": "d41634f0",
427
+ "metadata": {},
428
+ "outputs": [
429
+ {
430
+ "name": "stdout",
431
+ "output_type": "stream",
432
+ "text": [
433
+ "[[0 3 9 7 1 4 2 5 6 8]\n",
434
+ " [1 4 7 9 3 6 8 5 0 2]\n",
435
+ " [2 1 4 6 3 0 8 9 7 5]\n",
436
+ " [3 9 7 0 1 4 5 8 6 2]\n",
437
+ " [4 1 8 5 6 7 9 3 0 2]\n",
438
+ " [5 8 6 4 1 7 9 3 2 0]\n",
439
+ " [6 8 5 4 1 7 9 3 2 0]\n",
440
+ " [7 9 3 1 4 0 5 8 6 2]\n",
441
+ " [8 5 6 4 1 7 9 3 2 0]\n",
442
+ " [9 7 3 0 1 4 5 8 6 2]]\n"
443
+ ]
444
+ }
445
+ ],
446
+ "source": [
447
+ "nearest = np.argsort(dist_sq, axis=1)\n",
448
+ "print(nearest)"
449
+ ]
450
+ },
451
+ {
452
+ "cell_type": "code",
453
+ "execution_count": 27,
454
+ "id": "1223b5a4",
455
+ "metadata": {},
456
+ "outputs": [],
457
+ "source": [
458
+ "K = 2\n",
459
+ "nearest_partition = np.argpartition(dist_sq, K + 1, axis=1)\n"
460
+ ]
461
+ },
462
+ {
463
+ "cell_type": "code",
464
+ "execution_count": 36,
465
+ "id": "275ecd62",
466
+ "metadata": {},
467
+ "outputs": [
468
+ {
469
+ "data": {
470
+ "image/png": "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zRw7+FWj0dCzZ0+mT59O/vz5KV68ONOmTcPT05PAwEB0Oh0RERHkyZMHJycnfH19qV69OiNGjGDixInExcXx2Wef0bFjR7li8hKMzff69evZvn07Y8aMISAggPv376fuy7COeDZj8/30G7NhYGGxYsVkTM9LMjbn/v7+1K1bl48++ohJkybh4eHBnDlzUKvVdOjQwdovx+YZm++OHTuyaNEihg8fnlpsz549G41GQ+fOna38anIGi/3dzPRE42wgOTlZmTp1qlK7dm2lWrVqysCBA1P7Nty6dUupWLGism7dutT1Hzx4oAwdOlSpVq2aUqtWLeWzzz5L02dDPJ8x+e7bt69SsWLFDP89+f9EPJux5/eTjhw5In1MMsHYnD9+/Fj57LPPlFq1aim+vr5K3759lb///tta4Wc7xub7ypUryuDBg5WAgACldu3ayvvvvy/neBZ89NFHafqYWOrvpkpRFMV09ZQQQgghRObl2DEmQgghhMh+pDARQgghhM2QwkQIIYQQNkMKEyGEEELYDClMhBBCCGEzpDARQgghhM2QwkQIIYQQNkMKEyGEEELYDClMhBBCCGEzpDARQgghhM2QwkQIIYQQNuP/bnrHkEG3pWUAAAAASUVORK5CYII=\n",
471
+ "text/plain": [
472
+ "<Figure size 640x480 with 1 Axes>"
473
+ ]
474
+ },
475
+ "metadata": {},
476
+ "output_type": "display_data"
477
+ }
478
+ ],
479
+ "source": [
480
+ "plt.scatter(X[:, 0], X[:, 1], s=100)\n",
481
+ "# draw lines from each point to its two nearest neighbors\n",
482
+ "K = 2\n",
483
+ "for i in range(X.shape[0]):\n",
484
+ " for j in nearest_partition[i, :K+1]:\n",
485
+ " # plot a line from X[i] to X[j]\n",
486
+ " # use some zip magic to make it happen:\n",
487
+ " plt.plot(*zip(X[j], X[i]), color='black')\n"
488
+ ]
489
+ },
490
+ {
491
+ "cell_type": "code",
492
+ "execution_count": null,
493
+ "id": "7399452d",
494
+ "metadata": {},
495
+ "outputs": [],
496
+ "source": []
497
+ },
498
+ {
499
+ "cell_type": "code",
500
+ "execution_count": null,
501
+ "id": "a1f46daf",
502
+ "metadata": {},
503
+ "outputs": [],
504
+ "source": []
505
+ }
506
+ ],
507
+ "metadata": {
508
+ "kernelspec": {
509
+ "display_name": "Python 3 (ipykernel)",
510
+ "language": "python",
511
+ "name": "python3"
512
+ },
513
+ "language_info": {
514
+ "codemirror_mode": {
515
+ "name": "ipython",
516
+ "version": 3
517
+ },
518
+ "file_extension": ".py",
519
+ "mimetype": "text/x-python",
520
+ "name": "python",
521
+ "nbconvert_exporter": "python",
522
+ "pygments_lexer": "ipython3",
523
+ "version": "3.9.13"
524
+ }
525
+ },
526
+ "nbformat": 4,
527
+ "nbformat_minor": 5
528
+ }