extract index of element in list python - python

I have a list named 'partition'
[array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29]), array([214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226,
227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239,
240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250]), array([251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263,
264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276]), array([277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289,
290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302,
303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314]), array([30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46,
47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
64, 65, 66, 67, 68, 69, 70]), array([ 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83,
84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96,
97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109,
110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121]), array([122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134,
135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147,
148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160,
161, 162, 163, 164]), array([165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177,
178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190,
191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203,
204, 205, 206, 207, 208, 209, 210, 211, 212, 213])]
And i try to extract the index of an element (1 for example) with this code:
a= partition.index(1)
But i get this error :
ValueError Traceback (most recent call last)
/tmp/ipykernel_582922/1287398992.py in <module>
----> 1 a= partition.index(1)
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
Can you help me please to fix this error?
Kind regards

This should solve the problem:
import numpy as np
from numpy import array
partition = array([array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29]), array([214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226,
227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239,
240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250]), array([251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263,
264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276]), array([277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289,
290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302,
303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314]), array([30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46,
47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
64, 65, 66, 67, 68, 69, 70]), array([ 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83,
84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96,
97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109,
110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121]), array([122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134,
135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147,
148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160,
161, 162, 163, 164]), array([165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177,
178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190,
191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203,
204, 205, 206, 207, 208, 209, 210, 211, 212, 213])], dtype="object")
result = [(i, np.where(j == 1)[0]) for i, j in enumerate(partition) if np.any(np.where(j == 1))]
print(result)
The result will be in the format of (This is an example):
[(*the index of the array*, *an array with all indexes of the elements that are 1*), (*the index of the array*, *an array with all indexes of the elements that are 1*)]
I'm not sure if this is the best way to do it though.
Or if you have a list of numpy arrays you could do something like this:
from numpy import array
partition = [array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29]), array([214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226,
227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239,
240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250]), array([251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263,
264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276]), array([277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289,
290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302,
303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314]), array([30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46,
47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
64, 65, 66, 67, 68, 69, 70]), array([ 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83,
84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96,
97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109,
110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121]), array([122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134,
135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147,
148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160,
161, 162, 163, 164]), array([165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177,
178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190,
191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203,
204, 205, 206, 207, 208, 209, 210, 211, 212, 213])]
result = []
for i, j in enumerate(partition):
for l in j:
if l == 1:
result.append((i, l))
print(result)

Related

Python : Creating raw ECC-ECDSA-SECP256R1 private(32-bytes) and public(64-bytes) keys

I want to generate raw 32-bytes private key and raw 64-bytes public key (ECC-SECP256R1) using Python.
Which library should I install in my Python 3.7 and what APIs do I call to be able to generate raw keys?
Please help.
TIA.
The ECDSA library can do this.
Generate a key pair:
import ecdsa
sk = ecdsa.SigningKey.generate(curve=ecdsa.SECP256k1)
vk = sk.get_verifying_key()
# Your byte values will vary, each time you generate(). Here is an example pair.
skBytes = sk.to_string()
print(f"Signing key = {[b for b in skBytes]}")
# [242, 122, 66, 46, 189, 185, 103, 40, 162, 156, 155, 213, 77, 38, 251, 23, 148, 207, 49, 206, 122, 63, 117, 150, 196, 115, 82, 203, 95, 104, 60, 227]
vkBytes = vk.to_string()
print(f"Verifying key = {[b for b in vkBytes]}")
# [31, 164, 220, 214, 106, 22, 45, 112, 244, 49, 124, 250, 217, 209, 51, 83, 161, 239, 137, 124, 25, 220, 112, 116, 80, 9, 64, 130, 9, 27, 92, 198, 123, 146, 213, 154, 142, 148, 90, 6, 142, 177, 31, 151, 215, 9, 216, 36, 51, 27, 222, 224, 132, 7, 39, 227, 48, 31, 244, 218, 206, 59, 249, 196]
The key pair can be restored from bytes:
skBytes = bytes([242, 122, 66, 46, 189, 185, 103, 40, 162, 156, 155, 213, 77, 38, 251, 23, 148, 207, 49, 206, 122, 63, 117, 150, 196, 115, 82, 203, 95, 104, 60, 227])
vkBytes = bytes([31, 164, 220, 214, 106, 22, 45, 112, 244, 49, 124, 250, 217, 209, 51, 83, 161, 239, 137, 124, 25, 220, 112, 116, 80, 9, 64, 130, 9, 27, 92, 198, 123, 146, 213, 154, 142, 148, 90, 6, 142, 177, 31, 151, 215, 9, 216, 36, 51, 27, 222, 224, 132, 7, 39, 227, 48, 31, 244, 218, 206, 59, 249, 196])
sk = ecdsa.SigningKey.from_string(skBytes, curve=ecdsa.SECP256k1)
vk = ecdsa.VerifyingKey.from_string(vkBytes, curve=ecdsa.SECP256k1)
# or vk = sk.get_verifying_key()
Example signing and verifying:
message = b"Hello, world!"
signature = sk.sign(message)
print(f"{[b for b in signature]}")
# [161, 22, 110, 48, 232, 36, 152, 153, 22, 7, 177, 219, 157, 102, 237, 57, 243, 216, 186, 207, 22, 168, 170, 247, 216, 235, 160, 13, 35, 37, 141, 237, 63, 50, 84, 31, 203, 95, 212, 91, 13, 150, 156, 125, 255, 197, 30, 133, 193, 174, 129, 174, 192, 33, 90, 160, 243, 78, 96, 92, 38, 1, 237, 129]
isSignatureValid = vk.verify(signature, message)
print(f"{isSignatureValid=}")
# isSignatureValid=True
Credit to this question for introducing me to the ecdsa package:
ECDSA Signing and Verifying issue between python ECDSA and C micro-ecc library

Dask distributed calculation performance drop in loop

I'm new to Dask and still trying to figure out how to get this running smoothly. I've been experimenting with future API and I get some surprising results.
I have a simple while loop in my code that call the function cpi5. When I %timeit the execution of the fucntion I get :
%timeit min(cpci5(x,N,M,n,lciw,uciw))
6.74 s ± 178 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Now I've run the same function but using a distributed sheduler in dask and I get this :
from dask.distributed import Client
client= Client()
%timeit B.append(client.submit(cpci5,x,N,M,n,lciw,uciw)); bb = np.array(client.gather(B))
29 ms ± 6.01 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)
So far so good, the expected improvement is there but when I time the execution of the loop itself where the function is called, I barely get any difference and they both run in approximately 19s. (I've profile the initial loop and more than 90% of the computation time is due to the function so the improvement should be there.)
The results are coherent and identical.
What could cause such a difference ?
You'll find below the relevant piece of code.
PS : I've already gone as far as i could in code optimization but it's not enough in my case.
N = 392
n = 326
x = np.arange(0,n+1)
if np.floor(n/2) == n/2:
xvalue = int(n/2 +1)
else :
xvalue = int((n+1)/2)
aa = np.arange(lciw[xvalue-1],np.floor(N/2)).astype(int)
lciw :
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
13, 14, 15, 16, 17, 18, 19, 21, 22, 23, 24, 25, 26,
27, 28, 29, 31, 32, 33, 34, 35, 36, 37, 38, 40, 41,
42, 43, 44, 45, 46, 47, 49, 50, 51, 52, 53, 54, 55,
57, 58, 59, 60, 61, 62, 64, 65, 66, 67, 68, 69, 70,
72, 73, 74, 75, 76, 77, 79, 80, 81, 82, 83, 84, 86,
87, 88, 89, 90, 91, 93, 94, 95, 96, 97, 98, 100, 101,
102, 103, 104, 105, 107, 108, 109, 110, 111, 112, 114, 115, 116,
117, 118, 120, 121, 122, 123, 124, 125, 127, 128, 129, 130, 131,
132, 134, 135, 136, 137, 138, 140, 141, 142, 143, 144, 146, 147,
148, 149, 150, 151, 153, 154, 155, 156, 157, 159, 160, 161, 162,
163, 165, 166, 167, 168, 169, 170, 172, 173, 174, 175, 176, 178,
179, 180, 181, 182, 184, 185, 186, 189, 188, 190, 191, 192, 193,
194, 196, 197, 198, 199, 200, 202, 203, 204, 205, 206, 208, 209,
210, 211, 212, 214, 215, 216, 217, 218, 220, 221, 222, 223, 225,
226, 227, 228, 229, 231, 232, 233, 234, 235, 237, 238, 239, 240,
241, 243, 244, 245, 246, 248, 249, 250, 251, 252, 254, 255, 256,
257, 258, 260, 261, 262, 263, 265, 266, 267, 268, 269, 271, 272,
273, 274, 276, 277, 278, 279, 280, 282, 283, 284, 285, 287, 288,
289, 290, 292, 293, 294, 295, 296, 298, 299, 300, 301, 303, 304,
305, 306, 308, 309, 310, 311, 313, 314, 315, 316, 317, 319, 320,
321, 322, 324, 325, 326, 327, 329, 330, 331, 332, 334, 335, 336,
338, 339, 340, 341, 343, 344, 345, 346, 348, 349, 350, 351, 353,
354, 355, 357, 358, 359, 360, 362, 363, 364, 366, 367, 368, 369,
371, 372, 373, 375, 376, 377, 379, 380, 382, 383, 384, 386, 387,
389, 390])
uciw :
array([2, 3, 5, 6, 8, 9, 10, 12, 13, 15, 16, 17, 19,
20, 21, 23, 24, 25, 26, 28, 29, 30, 32, 33, 34, 35,
37, 38, 39, 41, 42, 43, 44, 46, 47, 48, 49, 51, 52,
53, 54, 56, 57, 58, 60, 61, 62, 63, 65, 66, 67, 68,
70, 71, 72, 73, 75, 76, 77, 78, 79, 81, 82, 83, 84,
86, 87, 88, 89, 91, 92, 93, 94, 96, 97, 98, 99, 100,
102, 103, 104, 105, 107, 108, 109, 110, 112, 113, 114, 115, 116,
118, 119, 120, 121, 123, 124, 125, 126, 127, 129, 130, 131, 132,
134, 135, 136, 137, 138, 140, 141, 142, 143, 144, 146, 147, 148,
149, 151, 152, 153, 154, 155, 157, 158, 159, 160, 161, 163, 164,
165, 166, 167, 169, 170, 171, 172, 174, 175, 176, 177, 178, 180,
181, 182, 183, 184, 186, 187, 188, 189, 190, 192, 193, 194, 195,
196, 198, 199, 200, 201, 202, 204, 203, 206, 207, 208, 210, 211,
212, 213, 214, 216, 217, 218, 219, 220, 222, 223, 224, 225, 226,
227, 229, 230, 231, 232, 233, 235, 236, 237, 238, 239, 241, 242,
243, 244, 245, 246, 248, 249, 250, 251, 252, 254, 255, 256, 257,
258, 260, 261, 262, 263, 264, 265, 267, 268, 269, 270, 271, 272,
274, 275, 276, 277, 278, 280, 281, 282, 283, 284, 285, 287, 288,
289, 290, 291, 292, 294, 295, 296, 297, 298, 299, 301, 302, 303,
304, 305, 306, 308, 309, 310, 311, 312, 313, 315, 316, 317, 318,
319, 320, 322, 323, 324, 325, 326, 327, 328, 330, 331, 332, 333,
334, 335, 337, 338, 339, 340, 341, 342, 343, 345, 346, 347, 348,
349, 350, 351, 352, 354, 355, 356, 357, 358, 359, 360, 361, 363,
364, 365, 366, 367, 368, 369, 370, 371, 373, 374, 375, 376, 377,
378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390,
391, 392])
def cpci5(x,N,M,n,lciw,uciw):
f = np.vectorize(hypergeom.pmf)
idd = np.vectorize(ind)
X, m = np.meshgrid(x,M)
kk = idd(m,lciw,uciw) * f(X, N, m, n) #idd just implement a test lciw<= m <=uciw
return min(pd.Series(kk.sum(axis=1)))
M = np.arange(0,N+1) # Initial implementation of the function
ii = 0
while (ii <len(aa)+1):
lciw[xvalue-1] = aa[ii]
uciw[xvalue-1] = N - aa[ii]
bb = min(cpci5(x,N,M,n,lciw,uciw))
if bb >= 1-alpha:
ii1 = ii
ii += 1
else :
ii = len(aa)+1
lciw[xvalue-1] = aa[ii1]
uciw[xvalue-1] = N - lciw[xvalue-1]
M = np.arange(0,N+1) # Distributed version
ii = 0
B = []
while (ii <len(aa)):
lciw[xvalue-1] = aa[ii]
uciw[xvalue-1] = N - aa[ii]
B.append(client.submit(cpci5,x,N,M,n,lciw,uciw))
ii += 1
bb = np.array(client.gather(B))
ii1 = len(bb[bb>1-alpha])-1
lciw[xvalue-1] = aa[ii1]
uciw[xvalue-1] = N - lciw[xvalue-1]

How to deal with large array in numpy/python when memory becomes issue

I have an array all with dimensions (19494500, 376) I need to arrange these 376 columns in a particular sequence I have generated,
l
array([ 0, 94, 188, 282, 1, 95, 189, 283, 2, 96, 190, 284, 3,
97, 191, 285, 4, 98, 192, 286, 5, 99, 193, 287, 6, 100,
194, 288, 7, 101, 195, 289, 8, 102, 196, 290, 9, 103, 197,
291, 10, 104, 198, 292, 11, 105, 199, 293, 12, 106, 200, 294,
13, 107, 201, 295, 14, 108, 202, 296, 15, 109, 203, 297, 16,
110, 204, 298, 17, 111, 205, 299, 18, 112, 206, 300, 19, 113,
207, 301, 20, 114, 208, 302, 21, 115, 209, 303, 22, 116, 210,
304, 23, 117, 211, 305, 24, 118, 212, 306, 25, 119, 213, 307,
26, 120, 214, 308, 27, 121, 215, 309, 28, 122, 216, 310, 29,
123, 217, 311, 30, 124, 218, 312, 31, 125, 219, 313, 32, 126,
220, 314, 33, 127, 221, 315, 34, 128, 222, 316, 35, 129, 223,
317, 36, 130, 224, 318, 37, 131, 225, 319, 38, 132, 226, 320,
39, 133, 227, 321, 40, 134, 228, 322, 41, 135, 229, 323, 42,
136, 230, 324, 43, 137, 231, 325, 44, 138, 232, 326, 45, 139,
233, 327, 46, 140, 234, 328, 47, 141, 235, 329, 48, 142, 236,
330, 49, 143, 237, 331, 50, 144, 238, 332, 51, 145, 239, 333,
52, 146, 240, 334, 53, 147, 241, 335, 54, 148, 242, 336, 55,
149, 243, 337, 56, 150, 244, 338, 57, 151, 245, 339, 58, 152,
246, 340, 59, 153, 247, 341, 60, 154, 248, 342, 61, 155, 249,
343, 62, 156, 250, 344, 63, 157, 251, 345, 64, 158, 252, 346,
65, 159, 253, 347, 66, 160, 254, 348, 67, 161, 255, 349, 68,
162, 256, 350, 69, 163, 257, 351, 70, 164, 258, 352, 71, 165,
259, 353, 72, 166, 260, 354, 73, 167, 261, 355, 74, 168, 262,
356, 75, 169, 263, 357, 76, 170, 264, 358, 77, 171, 265, 359,
78, 172, 266, 360, 79, 173, 267, 361, 80, 174, 268, 362, 81,
175, 269, 363, 82, 176, 270, 364, 83, 177, 271, 365, 84, 178,
272, 366, 85, 179, 273, 367, 86, 180, 274, 368, 87, 181, 275,
369, 88, 182, 276, 370, 89, 183, 277, 371, 90, 184, 278, 372,
91, 185, 279, 373, 92, 186, 280, 374, 93, 187, 281, 375])
So I am doing following
all_c = all[:,l]
but I am getting
"memory error"
Can you suggest what could be the most memory-efficient way?
Rather than permute the whole array at once you can do it row by row in place. Try
for r in range(all.shape[0]):
all[r] = all[r, l]

Is there a way to make this sequence creator faster?

I hope someone can give me some tips on how to speed up the following process. Its not really slow, but any time won could be very helpful.
from datetime import datetime
START_CLOCK = datetime.now()
TotalNumbcol = 266
NeighborsperColumn = [[3, 2, 5, 6, 7], [3, 6, 1, 7, 5, 4, 10, 11, 12, 13], [7, 2, 1, 6, 5, 11, 12, 13], [5, 10, 11, 9, 2, 6, 8, 12, 16, 17, 18, 19, 20], [6, 11, 4, 2, 12, 10, 1, 3, 7, 9, 13, 17, 18, 19, 20], [7, 12, 5, 2, 3, 13, 11, 1, 4, 10, 18, 19, 20], [13, 6, 3, 12, 2, 1, 5, 11, 19, 20], [9, 16, 17, 15, 4, 10, 14, 18, 24, 25, 26, 27, 28], [10, 17, 8, 4, 18, 16, 5, 11, 15, 19, 25, 26, 27, 28, 29], [11, 18, 9, 4, 5, 19, 17, 2, 6, 8, 12, 16, 20, 26, 27, 28, 29], [12, 19, 10, 5, 6, 20, 18, 4, 2, 3, 7, 9, 13, 17, 27, 28, 29], [13, 20, 11, 6, 7, 19, 5, 2, 3, 4, 10, 18, 28, 29], [12, 7, 20, 6, 2, 3, 5, 11, 19, 29], [15, 24, 25, 23, 8, 16, 22, 26, 34, 35, 36, 37, 38], [16, 25, 14, 8, 26, 24, 9, 17, 23, 27, 35, 36, 37, 38, 39], [17, 26, 15, 8, 9, 27, 25, 4, 10, 14, 18, 24, 28, 36, 37, 38, 39, 40], [18, 27, 16, 9, 10, 28, 26, 8, 4, 5, 11, 15, 19, 25, 29, 37, 38, 39, 40, 41], [19, 28, 17, 10, 11, 29, 27, 9, 4, 5, 6, 8, 12, 16, 20, 26, 38, 39, 40, 41], [20, 29, 18, 11, 12, 28, 10, 4, 5, 6, 7, 9, 13, 17, 27, 39, 40, 41], [19, 12, 13, 29, 11, 4, 5, 6, 7, 10, 18, 28, 40, 41], [22, 33, 34, 32, 23, 31, 35, 45, 46, 47, 48, 49], [23, 34, 21, 35, 33, 14, 24, 32, 36, 46, 47, 48, 49, 50], [24, 35, 22, 14, 36, 34, 15, 21, 25, 33, 37, 47, 48, 49, 50, 51], [25, 36, 23, 14, 15, 37, 35, 8, 16, 22, 26, 34, 38, 48, 49, 50, 51, 52], [26, 37, 24, 15, 16, 38, 36, 14, 8, 9, 17, 23, 27, 35, 39, 49, 50, 51, 52, 53], [27, 38, 25, 16, 17, 39, 37, 15, 8, 9, 10, 14, 18, 24, 28, 36, 40, 50, 51, 52, 53, 54], [28, 39, 26, 17, 18, 40, 38, 16, 8, 9, 10, 11, 15, 19, 25, 29, 37, 41, 51, 52, 53, 54], [29, 40, 27, 18, 19, 41, 39, 17, 8, 9, 10, 11, 12, 16, 20, 26, 38, 52, 53, 54], [41, 28, 19, 20, 40, 18, 9, 10, 11, 12, 13, 17, 27, 39, 53, 54], [31, 44, 45, 43, 32, 42, 46, 58, 59, 60, 61, 62], [32, 45, 30, 46, 44, 21, 33, 43, 47, 59, 60, 61, 62, 63], [33, 46, 31, 21, 47, 45, 22, 30, 34, 44, 48, 60, 61, 62, 63, 64], [34, 47, 32, 21, 22, 48, 46, 23, 31, 35, 45, 49, 61, 62, 63, 64, 65], [35, 48, 33, 22, 23, 49, 47, 21, 14, 24, 32, 36, 46, 50, 62, 63, 64, 65, 66], [36, 49, 34, 23, 24, 50, 48, 22, 14, 15, 21, 25, 33, 37, 47, 51, 63, 64, 65, 66, 67], [37, 50, 35, 24, 25, 51, 49, 23, 14, 15, 16, 22, 26, 34, 38, 48, 52, 64, 65, 66, 67, 68], [38, 51, 36, 25, 26, 52, 50, 24, 14, 15, 16, 17, 23, 27, 35, 39, 49, 53, 65, 66, 67, 68, 69], [39, 52, 37, 26, 27, 53, 51, 25, 14, 15, 16, 17, 18, 24, 28, 36, 40, 50, 54, 66, 67, 68, 69], [40, 53, 38, 27, 28, 54, 52, 26, 15, 16, 17, 18, 19, 25, 29, 37, 41, 51, 67, 68, 69], [41, 54, 39, 28, 29, 53, 27, 16, 17, 18, 19, 20, 26, 38, 52, 68, 69], [40, 29, 54, 28, 17, 18, 19, 20, 27, 39, 53, 69], [43, 58, 59, 57, 30, 44, 56, 60, 74, 75, 76, 77, 78], [44, 59, 42, 30, 60, 58, 31, 45, 57, 61, 75, 76, 77, 78, 79], [45, 60, 43, 30, 31, 61, 59, 32, 42, 46, 58, 62, 76, 77, 78, 79, 80], [46, 61, 44, 31, 32, 62, 60, 30, 21, 33, 43, 47, 59, 63, 77, 78, 79, 80, 81], [47, 62, 45, 32, 33, 63, 61, 31, 21, 22, 30, 34, 44, 48, 60, 64, 78, 79, 80, 81, 82], [48, 63, 46, 33, 34, 64, 62, 32, 21, 22, 23, 31, 35, 45, 49, 61, 65, 79, 80, 81, 82, 83], [49, 64, 47, 34, 35, 65, 63, 33, 21, 22, 23, 24, 32, 36, 46, 50, 62, 66, 80, 81, 82, 83, 84], [50, 65, 48, 35, 36, 66, 64, 34, 21, 22, 23, 24, 25, 33, 37, 47, 51, 63, 67, 81, 82, 83, 84, 85], [51, 66, 49, 36, 37, 67, 65, 35, 22, 23, 24, 25, 26, 34, 38, 48, 52, 64, 68, 82, 83, 84, 85], [52, 67, 50, 37, 38, 68, 66, 36, 23, 24, 25, 26, 27, 35, 39, 49, 53, 65, 69, 83, 84, 85], [53, 68, 51, 38, 39, 69, 67, 37, 24, 25, 26, 27, 28, 36, 40, 50, 54, 66, 84, 85], [54, 69, 52, 39, 40, 68, 38, 25, 26, 27, 28, 29, 37, 41, 51, 67, 85], [53, 40, 41, 69, 39, 26, 27, 28, 29, 38, 52, 68], [56, 73, 74, 72, 57, 71, 75, 90, 91, 92, 93, 94], [57, 74, 55, 75, 73, 42, 58, 72, 76, 91, 92, 93, 94, 95], [58, 75, 56, 42, 76, 74, 43, 55, 59, 73, 77, 92, 93, 94, 95, 96], [59, 76, 57, 42, 43, 77, 75, 30, 44, 56, 60, 74, 78, 93, 94, 95, 96, 97], [60, 77, 58, 43, 44, 78, 76, 42, 30, 31, 45, 57, 61, 75, 79, 94, 95, 96, 97, 98], [61, 78, 59, 44, 45, 79, 77, 43, 30, 31, 32, 42, 46, 58, 62, 76, 80, 95, 96, 97, 98, 99], [62, 79, 60, 45, 46, 80, 78, 44, 30, 31, 32, 33, 43, 47, 59, 63, 77, 81, 96, 97, 98, 99, 100], [63, 80, 61, 46, 47, 81, 79, 45, 30, 31, 32, 33, 34, 44, 48, 60, 64, 78, 82, 97, 98, 99, 100, 101], [64, 81, 62, 47, 48, 82, 80, 46, 31, 32, 33, 34, 35, 45, 49, 61, 65, 79, 83, 98, 99, 100, 101, 102], [65, 82, 63, 48, 49, 83, 81, 47, 32, 33, 34, 35, 36, 46, 50, 62, 66, 80, 84, 99, 100, 101, 102], [66, 83, 64, 49, 50, 84, 82, 48, 33, 34, 35, 36, 37, 47, 51, 63, 67, 81, 85, 100, 101, 102], [67, 84, 65, 50, 51, 85, 83, 49, 34, 35, 36, 37, 38, 48, 52, 64, 68, 82, 101, 102], [68, 85, 66, 51, 52, 84, 50, 35, 36, 37, 38, 39, 49, 53, 65, 69, 83, 102], [69, 67, 52, 53, 85, 51, 36, 37, 38, 39, 40, 50, 54, 66, 84], [68, 53, 54, 52, 37, 38, 39, 40, 41, 51, 67, 85], [71, 89, 90, 88, 72, 87, 91, 106, 107, 108, 109, 110], [72, 90, 70, 91, 89, 55, 73, 88, 92, 107, 108, 109, 110, 111], [73, 91, 71, 55, 92, 90, 56, 70, 74, 89, 93, 108, 109, 110, 111, 112], [74, 92, 72, 55, 56, 93, 91, 57, 71, 75, 90, 94, 109, 110, 111, 112, 113], [75, 93, 73, 56, 57, 94, 92, 55, 42, 58, 72, 76, 91, 95, 110, 111, 112, 113, 114], [76, 94, 74, 57, 58, 95, 93, 56, 42, 43, 55, 59, 73, 77, 92, 96, 111, 112, 113, 114, 115], [77, 95, 75, 58, 59, 96, 94, 57, 42, 43, 44, 56, 60, 74, 78, 93, 97, 112, 113, 114, 115, 116], [78, 96, 76, 59, 60, 97, 95, 58, 42, 43, 44, 45, 57, 61, 75, 79, 94, 98, 113, 114, 115, 116, 117], [79, 97, 77, 60, 61, 98, 96, 59, 42, 43, 44, 45, 46, 58, 62, 76, 80, 95, 99, 114, 115, 116, 117, 118], [80, 98, 78, 61, 62, 99, 97, 60, 43, 44, 45, 46, 47, 59, 63, 77, 81, 96, 100, 115, 116, 117, 118, 119], [81, 99, 79, 62, 63, 100, 98, 61, 44, 45, 46, 47, 48, 60, 64, 78, 82, 97, 101, 116, 117, 118, 119, 120], [82, 100, 80, 63, 64, 101, 99, 62, 45, 46, 47, 48, 49, 61, 65, 79, 83, 98, 102, 117, 118, 119, 120], [83, 101, 81, 64, 65, 102, 100, 63, 46, 47, 48, 49, 50, 62, 66, 80, 84, 99, 118, 119, 120], [84, 102, 82, 65, 66, 101, 64, 47, 48, 49, 50, 51, 63, 67, 81, 85, 100, 119, 120], [85, 83, 66, 67, 102, 65, 48, 49, 50, 51, 52, 64, 68, 82, 101, 120], [84, 67, 68, 66, 49, 50, 51, 52, 53, 65, 69, 83, 102], [87, 105, 106, 104, 88, 103, 107, 126, 127, 128, 129, 130], [88, 106, 86, 107, 105, 70, 89, 104, 108, 127, 128, 129, 130, 131], [89, 107, 87, 70, 108, 106, 71, 86, 90, 105, 109, 128, 129, 130, 131, 132], [90, 108, 88, 70, 71, 109, 107, 72, 87, 91, 106, 110, 129, 130, 131, 132, 133], [91, 109, 89, 71, 72, 110, 108, 70, 55, 73, 88, 92, 107, 111, 130, 131, 132, 133, 134], [92, 110, 90, 72, 73, 111, 109, 71, 55, 56, 70, 74, 89, 93, 108, 112, 131, 132, 133, 134, 135], [93, 111, 91, 73, 74, 112, 110, 72, 55, 56, 57, 71, 75, 90, 94, 109, 113, 132, 133, 134, 135, 136], [94, 112, 92, 74, 75, 113, 111, 73, 55, 56, 57, 58, 72, 76, 91, 95, 110, 114, 133, 134, 135, 136, 137], [95, 113, 93, 75, 76, 114, 112, 74, 55, 56, 57, 58, 59, 73, 77, 92, 96, 111, 115, 134, 135, 136, 137, 138], [96, 114, 94, 76, 77, 115, 113, 75, 56, 57, 58, 59, 60, 74, 78, 93, 97, 112, 116, 135, 136, 137, 138, 139], [97, 115, 95, 77, 78, 116, 114, 76, 57, 58, 59, 60, 61, 75, 79, 94, 98, 113, 117, 136, 137, 138, 139, 140], [98, 116, 96, 78, 79, 117, 115, 77, 58, 59, 60, 61, 62, 76, 80, 95, 99, 114, 118, 137, 138, 139, 140, 141], [99, 117, 97, 79, 80, 118, 116, 78, 59, 60, 61, 62, 63, 77, 81, 96, 100, 115, 119, 138, 139, 140, 141], [100, 118, 98, 80, 81, 119, 117, 79, 60, 61, 62, 63, 64, 78, 82, 97, 101, 116, 120, 139, 140, 141], [101, 119, 99, 81, 82, 120, 118, 80, 61, 62, 63, 64, 65, 79, 83, 98, 102, 117, 140, 141], [102, 120, 100, 82, 83, 119, 81, 62, 63, 64, 65, 66, 80, 84, 99, 118, 141], [101, 83, 84, 120, 82, 63, 64, 65, 66, 67, 81, 85, 100, 119], [104, 126, 127, 125, 86, 105, 124, 128, 149, 150, 151, 152, 153], [105, 127, 103, 86, 128, 126, 87, 106, 125, 129, 150, 151, 152, 153, 154], [106, 128, 104, 86, 87, 129, 127, 88, 103, 107, 126, 130, 151, 152, 153, 154, 155], [107, 129, 105, 87, 88, 130, 128, 86, 70, 89, 104, 108, 127, 131, 152, 153, 154, 155, 156], [108, 130, 106, 88, 89, 131, 129, 87, 70, 71, 86, 90, 105, 109, 128, 132, 153, 154, 155, 156, 157], [109, 131, 107, 89, 90, 132, 130, 88, 70, 71, 72, 87, 91, 106, 110, 129, 133, 154, 155, 156, 157, 158], [110, 132, 108, 90, 91, 133, 131, 89, 70, 71, 72, 73, 88, 92, 107, 111, 130, 134, 155, 156, 157, 158, 159], [111, 133, 109, 91, 92, 134, 132, 90, 70, 71, 72, 73, 74, 89, 93, 108, 112, 131, 135, 156, 157, 158, 159, 160], [112, 134, 110, 92, 93, 135, 133, 91, 71, 72, 73, 74, 75, 90, 94, 109, 113, 132, 136, 157, 158, 159, 160, 161], [113, 135, 111, 93, 94, 136, 134, 92, 72, 73, 74, 75, 76, 91, 95, 110, 114, 133, 137, 158, 159, 160, 161, 162], [114, 136, 112, 94, 95, 137, 135, 93, 73, 74, 75, 76, 77, 92, 96, 111, 115, 134, 138, 159, 160, 161, 162, 163], [115, 137, 113, 95, 96, 138, 136, 94, 74, 75, 76, 77, 78, 93, 97, 112, 116, 135, 139, 160, 161, 162, 163], [116, 138, 114, 96, 97, 139, 137, 95, 75, 76, 77, 78, 79, 94, 98, 113, 117, 136, 140, 161, 162, 163], [117, 139, 115, 97, 98, 140, 138, 96, 76, 77, 78, 79, 80, 95, 99, 114, 118, 137, 141, 162, 163], [118, 140, 116, 98, 99, 141, 139, 97, 77, 78, 79, 80, 81, 96, 100, 115, 119, 138, 163], [119, 141, 117, 99, 100, 140, 98, 78, 79, 80, 81, 82, 97, 101, 116, 120, 139], [120, 118, 100, 101, 141, 99, 79, 80, 81, 82, 83, 98, 102, 117, 140], [119, 101, 102, 100, 80, 81, 82, 83, 84, 99, 118, 141], [122, 146, 147, 145, 123, 144, 148, 169, 170, 171, 172, 173], [123, 147, 121, 148, 146, 124, 145, 149, 170, 171, 172, 173, 174], [124, 148, 122, 149, 147, 121, 125, 146, 150, 171, 172, 173, 174, 175], [125, 149, 123, 150, 148, 103, 122, 126, 147, 151, 172, 173, 174, 175, 176], [126, 150, 124, 103, 151, 149, 104, 123, 127, 148, 152, 173, 174, 175, 176, 177], [127, 151, 125, 103, 104, 152, 150, 86, 105, 124, 128, 149, 153, 174, 175, 176, 177, 178], [128, 152, 126, 104, 105, 153, 151, 103, 86, 87, 106, 125, 129, 150, 154, 175, 176, 177, 178, 179], [129, 153, 127, 105, 106, 154, 152, 104, 86, 87, 88, 103, 107, 126, 130, 151, 155, 176, 177, 178, 179, 180], [130, 154, 128, 106, 107, 155, 153, 105, 86, 87, 88, 89, 104, 108, 127, 131, 152, 156, 177, 178, 179, 180, 181], [131, 155, 129, 107, 108, 156, 154, 106, 86, 87, 88, 89, 90, 105, 109, 128, 132, 153, 157, 178, 179, 180, 181, 182], [132, 156, 130, 108, 109, 157, 155, 107, 87, 88, 89, 90, 91, 106, 110, 129, 133, 154, 158, 179, 180, 181, 182, 183], [133, 157, 131, 109, 110, 158, 156, 108, 88, 89, 90, 91, 92, 107, 111, 130, 134, 155, 159, 180, 181, 182, 183, 184], [134, 158, 132, 110, 111, 159, 157, 109, 89, 90, 91, 92, 93, 108, 112, 131, 135, 156, 160, 181, 182, 183, 184, 185], [135, 159, 133, 111, 112, 160, 158, 110, 90, 91, 92, 93, 94, 109, 113, 132, 136, 157, 161, 182, 183, 184, 185, 186], [136, 160, 134, 112, 113, 161, 159, 111, 91, 92, 93, 94, 95, 110, 114, 133, 137, 158, 162, 183, 184, 185, 186, 187], [137, 161, 135, 113, 114, 162, 160, 112, 92, 93, 94, 95, 96, 111, 115, 134, 138, 159, 163, 184, 185, 186, 187], [138, 162, 136, 114, 115, 163, 161, 113, 93, 94, 95, 96, 97, 112, 116, 135, 139, 160, 185, 186, 187], [139, 163, 137, 115, 116, 162, 114, 94, 95, 96, 97, 98, 113, 117, 136, 140, 161, 186, 187], [140, 138, 116, 117, 163, 115, 95, 96, 97, 98, 99, 114, 118, 137, 141, 162, 187], [141, 139, 117, 118, 116, 96, 97, 98, 99, 100, 115, 119, 138, 163], [140, 118, 119, 117, 97, 98, 99, 100, 101, 116, 120, 139], [143, 167, 168, 166, 144, 165, 169, 193, 194, 195, 196, 197], [144, 168, 142, 169, 167, 145, 166, 170, 194, 195, 196, 197, 198], [145, 169, 143, 170, 168, 121, 142, 146, 167, 171, 195, 196, 197, 198, 199], [146, 170, 144, 121, 171, 169, 122, 143, 147, 168, 172, 196, 197, 198, 199, 200], [147, 171, 145, 121, 122, 172, 170, 123, 144, 148, 169, 173, 197, 198, 199, 200, 201], [148, 172, 146, 122, 123, 173, 171, 121, 124, 145, 149, 170, 174, 198, 199, 200, 201, 202], [149, 173, 147, 123, 124, 174, 172, 122, 121, 125, 146, 150, 171, 175, 199, 200, 201, 202, 203], [150, 174, 148, 124, 125, 175, 173, 123, 103, 122, 126, 147, 151, 172, 176, 200, 201, 202, 203, 204], [151, 175, 149, 125, 126, 176, 174, 124, 103, 104, 123, 127, 148, 152, 173, 177, 201, 202, 203, 204, 205], [152, 176, 150, 126, 127, 177, 175, 125, 103, 104, 105, 124, 128, 149, 153, 174, 178, 202, 203, 204, 205, 206], [153, 177, 151, 127, 128, 178, 176, 126, 103, 104, 105, 106, 125, 129, 150, 154, 175, 179, 203, 204, 205, 206, 207], [154, 178, 152, 128, 129, 179, 177, 127, 103, 104, 105, 106, 107, 126, 130, 151, 155, 176, 180, 204, 205, 206, 207, 208], [155, 179, 153, 129, 130, 180, 178, 128, 104, 105, 106, 107, 108, 127, 131, 152, 156, 177, 181, 205, 206, 207, 208, 209], [156, 180, 154, 130, 131, 181, 179, 129, 105, 106, 107, 108, 109, 128, 132, 153, 157, 178, 182, 206, 207, 208, 209, 210], [157, 181, 155, 131, 132, 182, 180, 130, 106, 107, 108, 109, 110, 129, 133, 154, 158, 179, 183, 207, 208, 209, 210, 211], [158, 182, 156, 132, 133, 183, 181, 131, 107, 108, 109, 110, 111, 130, 134, 155, 159, 180, 184, 208, 209, 210, 211, 212], [159, 183, 157, 133, 134, 184, 182, 132, 108, 109, 110, 111, 112, 131, 135, 156, 160, 181, 185, 209, 210, 211, 212, 213], [160, 184, 158, 134, 135, 185, 183, 133, 109, 110, 111, 112, 113, 132, 136, 157, 161, 182, 186, 210, 211, 212, 213], [161, 185, 159, 135, 136, 186, 184, 134, 110, 111, 112, 113, 114, 133, 137, 158, 162, 183, 187, 211, 212, 213], [162, 186, 160, 136, 137, 187, 185, 135, 111, 112, 113, 114, 115, 134, 138, 159, 163, 184, 212, 213], [163, 187, 161, 137, 138, 186, 136, 112, 113, 114, 115, 116, 135, 139, 160, 185, 213], [162, 138, 139, 187, 137, 113, 114, 115, 116, 117, 136, 140, 161, 186], [165, 192, 193, 191, 166, 190, 194, 214, 215, 216, 217], [166, 193, 164, 194, 192, 142, 167, 191, 195, 214, 215, 216, 217, 218], [167, 194, 165, 142, 195, 193, 143, 164, 168, 192, 196, 215, 216, 217, 218, 219], [168, 195, 166, 142, 143, 196, 194, 144, 165, 169, 193, 197, 216, 217, 218, 219, 220], [169, 196, 167, 143, 144, 197, 195, 142, 145, 166, 170, 194, 198, 217, 218, 219, 220, 221], [170, 197, 168, 144, 145, 198, 196, 143, 121, 142, 146, 167, 171, 195, 199, 218, 219, 220, 221, 222], [171, 198, 169, 145, 146, 199, 197, 144, 121, 122, 143, 147, 168, 172, 196, 200, 219, 220, 221, 222, 223], [172, 199, 170, 146, 147, 200, 198, 145, 121, 122, 123, 144, 148, 169, 173, 197, 201, 220, 221, 222, 223, 224], [173, 200, 171, 147, 148, 201, 199, 146, 121, 122, 123, 124, 145, 149, 170, 174, 198, 202, 221, 222, 223, 224, 225], [174, 201, 172, 148, 149, 202, 200, 147, 121, 122, 123, 124, 125, 146, 150, 171, 175, 199, 203, 222, 223, 224, 225, 226], [175, 202, 173, 149, 150, 203, 201, 148, 122, 123, 124, 125, 126, 147, 151, 172, 176, 200, 204, 223, 224, 225, 226, 227], [176, 203, 174, 150, 151, 204, 202, 149, 123, 124, 125, 126, 127, 148, 152, 173, 177, 201, 205, 224, 225, 226, 227, 228], [177, 204, 175, 151, 152, 205, 203, 150, 124, 125, 126, 127, 128, 149, 153, 174, 178, 202, 206, 225, 226, 227, 228, 229], [178, 205, 176, 152, 153, 206, 204, 151, 125, 126, 127, 128, 129, 150, 154, 175, 179, 203, 207, 226, 227, 228, 229, 230], [179, 206, 177, 153, 154, 207, 205, 152, 126, 127, 128, 129, 130, 151, 155, 176, 180, 204, 208, 227, 228, 229, 230, 231], [180, 207, 178, 154, 155, 208, 206, 153, 127, 128, 129, 130, 131, 152, 156, 177, 181, 205, 209, 228, 229, 230, 231], [181, 208, 179, 155, 156, 209, 207, 154, 128, 129, 130, 131, 132, 153, 157, 178, 182, 206, 210, 229, 230, 231], [182, 209, 180, 156, 157, 210, 208, 155, 129, 130, 131, 132, 133, 154, 158, 179, 183, 207, 211, 230, 231], [183, 210, 181, 157, 158, 211, 209, 156, 130, 131, 132, 133, 134, 155, 159, 180, 184, 208, 212, 231], [184, 211, 182, 158, 159, 212, 210, 157, 131, 132, 133, 134, 135, 156, 160, 181, 185, 209, 213], [185, 212, 183, 159, 160, 213, 211, 158, 132, 133, 134, 135, 136, 157, 161, 182, 186, 210], [186, 213, 184, 160, 161, 212, 159, 133, 134, 135, 136, 137, 158, 162, 183, 187, 211], [187, 185, 161, 162, 213, 160, 134, 135, 136, 137, 138, 159, 163, 184, 212], [186, 162, 163, 161, 135, 136, 137, 138, 139, 160, 185, 213], [189, 190], [190, 188, 191, 214], [191, 189, 214, 164, 188, 192, 215, 232], [192, 214, 190, 164, 215, 165, 189, 193, 216, 232, 233], [193, 215, 191, 164, 165, 216, 214, 166, 190, 194, 217, 232, 233, 234], [194, 216, 192, 165, 166, 217, 215, 164, 142, 167, 191, 195, 214, 218, 232, 233, 234, 235], [195, 217, 193, 166, 167, 218, 216, 165, 142, 143, 164, 168, 192, 196, 215, 219, 232, 233, 234, 235, 236], [196, 218, 194, 167, 168, 219, 217, 166, 142, 143, 144, 165, 169, 193, 197, 216, 220, 233, 234, 235, 236, 237], [197, 219, 195, 168, 169, 220, 218, 167, 142, 143, 144, 145, 166, 170, 194, 198, 217, 221, 234, 235, 236, 237, 238], [198, 220, 196, 169, 170, 221, 219, 168, 142, 143, 144, 145, 146, 167, 171, 195, 199, 218, 222, 235, 236, 237, 238, 239], [199, 221, 197, 170, 171, 222, 220, 169, 143, 144, 145, 146, 147, 168, 172, 196, 200, 219, 223, 236, 237, 238, 239, 240], [200, 222, 198, 171, 172, 223, 221, 170, 144, 145, 146, 147, 148, 169, 173, 197, 201, 220, 224, 237, 238, 239, 240, 241], [201, 223, 199, 172, 173, 224, 222, 171, 145, 146, 147, 148, 149, 170, 174, 198, 202, 221, 225, 238, 239, 240, 241, 242], [202, 224, 200, 173, 174, 225, 223, 172, 146, 147, 148, 149, 150, 171, 175, 199, 203, 222, 226, 239, 240, 241, 242, 243], [203, 225, 201, 174, 175, 226, 224, 173, 147, 148, 149, 150, 151, 172, 176, 200, 204, 223, 227, 240, 241, 242, 243, 244], [204, 226, 202, 175, 176, 227, 225, 174, 148, 149, 150, 151, 152, 173, 177, 201, 205, 224, 228, 241, 242, 243, 244, 245], [205, 227, 203, 176, 177, 228, 226, 175, 149, 150, 151, 152, 153, 174, 178, 202, 206, 225, 229, 242, 243, 244, 245], [206, 228, 204, 177, 178, 229, 227, 176, 150, 151, 152, 153, 154, 175, 179, 203, 207, 226, 230, 243, 244, 245], [207, 229, 205, 178, 179, 230, 228, 177, 151, 152, 153, 154, 155, 176, 180, 204, 208, 227, 231, 244, 245], [208, 230, 206, 179, 180, 231, 229, 178, 152, 153, 154, 155, 156, 177, 181, 205, 209, 228, 245], [209, 231, 207, 180, 181, 230, 179, 153, 154, 155, 156, 157, 178, 182, 206, 210, 229], [210, 208, 181, 182, 231, 180, 154, 155, 156, 157, 158, 179, 183, 207, 211, 230], [211, 209, 182, 183, 181, 155, 156, 157, 158, 159, 180, 184, 208, 212, 231], [212, 210, 183, 184, 182, 156, 157, 158, 159, 160, 181, 185, 209, 213], [213, 211, 184, 185, 183, 157, 158, 159, 160, 161, 182, 186, 210], [212, 185, 186, 184, 158, 159, 160, 161, 162, 183, 187, 211], [215, 191, 192, 232, 190, 164, 165, 189, 193, 216, 233], [216, 232, 214, 192, 193, 233, 191, 164, 165, 166, 190, 194, 217, 234, 246], [217, 233, 215, 193, 194, 234, 232, 192, 164, 165, 166, 167, 191, 195, 214, 218, 235, 246, 247], [218, 234, 216, 194, 195, 235, 233, 193, 164, 165, 166, 167, 168, 192, 196, 215, 219, 232, 236, 246, 247, 248], [219, 235, 217, 195, 196, 236, 234, 194, 165, 166, 167, 168, 169, 193, 197, 216, 220, 233, 237, 246, 247, 248, 249], [220, 236, 218, 196, 197, 237, 235, 195, 166, 167, 168, 169, 170, 194, 198, 217, 221, 234, 238, 246, 247, 248, 249, 250], [221, 237, 219, 197, 198, 238, 236, 196, 167, 168, 169, 170, 171, 195, 199, 218, 222, 235, 239, 247, 248, 249, 250, 251], [222, 238, 220, 198, 199, 239, 237, 197, 168, 169, 170, 171, 172, 196, 200, 219, 223, 236, 240, 248, 249, 250, 251, 252], [223, 239, 221, 199, 200, 240, 238, 198, 169, 170, 171, 172, 173, 197, 201, 220, 224, 237, 241, 249, 250, 251, 252, 253], [224, 240, 222, 200, 201, 241, 239, 199, 170, 171, 172, 173, 174, 198, 202, 221, 225, 238, 242, 250, 251, 252, 253, 254], [225, 241, 223, 201, 202, 242, 240, 200, 171, 172, 173, 174, 175, 199, 203, 222, 226, 239, 243, 251, 252, 253, 254, 255], [226, 242, 224, 202, 203, 243, 241, 201, 172, 173, 174, 175, 176, 200, 204, 223, 227, 240, 244, 252, 253, 254, 255], [227, 243, 225, 203, 204, 244, 242, 202, 173, 174, 175, 176, 177, 201, 205, 224, 228, 241, 245, 253, 254, 255], [228, 244, 226, 204, 205, 245, 243, 203, 174, 175, 176, 177, 178, 202, 206, 225, 229, 242, 254, 255], [229, 245, 227, 205, 206, 244, 204, 175, 176, 177, 178, 179, 203, 207, 226, 230, 243, 255], [230, 228, 206, 207, 245, 205, 176, 177, 178, 179, 180, 204, 208, 227, 231, 244], [231, 229, 207, 208, 206, 177, 178, 179, 180, 181, 205, 209, 228, 245], [230, 208, 209, 207, 178, 179, 180, 181, 182, 206, 210, 229], [233, 215, 216, 214, 190, 191, 192, 193, 194, 217, 234, 246], [234, 232, 216, 217, 246, 215, 191, 192, 193, 194, 195, 214, 218, 235, 247, 256], [235, 246, 233, 217, 218, 247, 216, 192, 193, 194, 195, 196, 215, 219, 232, 236, 248, 256, 257], [236, 247, 234, 218, 219, 248, 246, 217, 193, 194, 195, 196, 197, 216, 220, 233, 237, 249, 256, 257, 258], [237, 248, 235, 219, 220, 249, 247, 218, 194, 195, 196, 197, 198, 217, 221, 234, 238, 246, 250, 256, 257, 258, 259], [238, 249, 236, 220, 221, 250, 248, 219, 195, 196, 197, 198, 199, 218, 222, 235, 239, 247, 251, 256, 257, 258, 259, 260], [239, 250, 237, 221, 222, 251, 249, 220, 196, 197, 198, 199, 200, 219, 223, 236, 240, 248, 252, 257, 258, 259, 260, 261], [240, 251, 238, 222, 223, 252, 250, 221, 197, 198, 199, 200, 201, 220, 224, 237, 241, 249, 253, 258, 259, 260, 261, 262], [241, 252, 239, 223, 224, 253, 251, 222, 198, 199, 200, 201, 202, 221, 225, 238, 242, 250, 254, 259, 260, 261, 262], [242, 253, 240, 224, 225, 254, 252, 223, 199, 200, 201, 202, 203, 222, 226, 239, 243, 251, 255, 260, 261, 262], [243, 254, 241, 225, 226, 255, 253, 224, 200, 201, 202, 203, 204, 223, 227, 240, 244, 252, 261, 262], [244, 255, 242, 226, 227, 254, 225, 201, 202, 203, 204, 205, 224, 228, 241, 245, 253, 262], [245, 243, 227, 228, 255, 226, 202, 203, 204, 205, 206, 225, 229, 242, 254], [244, 228, 229, 227, 203, 204, 205, 206, 207, 226, 230, 243, 255], [247, 234, 235, 256, 233, 215, 216, 217, 218, 219, 232, 236, 248, 257, 263], [248, 256, 246, 235, 236, 257, 234, 216, 217, 218, 219, 220, 233, 237, 249, 258, 263, 264], [249, 257, 247, 236, 237, 258, 256, 235, 217, 218, 219, 220, 221, 234, 238, 246, 250, 259, 263, 264, 265], [250, 258, 248, 237, 238, 259, 257, 236, 218, 219, 220, 221, 222, 235, 239, 247, 251, 256, 260, 263, 264, 265, 266], [251, 259, 249, 238, 239, 260, 258, 237, 219, 220, 221, 222, 223, 236, 240, 248, 252, 257, 261, 263, 264, 265, 266], [252, 260, 250, 239, 240, 261, 259, 238, 220, 221, 222, 223, 224, 237, 241, 249, 253, 258, 262, 264, 265, 266], [253, 261, 251, 240, 241, 262, 260, 239, 221, 222, 223, 224, 225, 238, 242, 250, 254, 259, 265, 266], [254, 262, 252, 241, 242, 261, 240, 222, 223, 224, 225, 226, 239, 243, 251, 255, 260, 266], [255, 253, 242, 243, 262, 241, 223, 224, 225, 226, 227, 240, 244, 252, 261], [254, 243, 244, 242, 224, 225, 226, 227, 228, 241, 245, 253, 262], [257, 247, 248, 263, 246, 233, 234, 235, 236, 237, 249, 258, 264], [258, 263, 256, 248, 249, 264, 247, 234, 235, 236, 237, 238, 246, 250, 259, 265], [259, 264, 257, 249, 250, 265, 263, 248, 235, 236, 237, 238, 239, 247, 251, 256, 260, 266], [260, 265, 258, 250, 251, 266, 264, 249, 236, 237, 238, 239, 240, 248, 252, 257, 261, 263], [261, 266, 259, 251, 252, 265, 250, 237, 238, 239, 240, 241, 249, 253, 258, 262, 264], [262, 260, 252, 253, 266, 251, 238, 239, 240, 241, 242, 250, 254, 259, 265], [261, 253, 254, 252, 239, 240, 241, 242, 243, 251, 255, 260, 266], [264, 257, 258, 256, 246, 247, 248, 249, 250, 259, 265], [265, 263, 258, 259, 257, 247, 248, 249, 250, 251, 256, 260, 266], [266, 264, 259, 260, 258, 248, 249, 250, 251, 252, 257, 261, 263], [265, 260, 261, 259, 249, 250, 251, 252, 253, 258, 262, 264]]
from random import shuffle
Column_Numbers2 = list(np.arange(1,TotalNumbcol+1,1))
Chosen_Columns2 = []
shuffle(Column_Numbers2)
rand = Column_Numbers2.pop()
Chosen_Columns2.append(rand)
while Column_Numbers2:
for i in range(rand-1,rand):
rand = NeighborsperColumn[i]
rand = [x for x in rand if x not in Chosen_Columns2]
shuffle(rand)
try:
rand = rand.pop()
Chosen_Columns2.append(rand)
Column_Numbers2.remove(rand)
except IndexError:
rand = Column_Numbers2.pop()
Chosen_Columns2.append(rand)
print Column_Numbers2
print Chosen_Columns2
END_CLOCK = datetime.now()
DELTA_TIME = END_CLOCK - START_CLOCK
print DELTA_TIME
Time measured is usually around 0.018 sec (on my computer that is).
NeighborsperColumn represents all neighbors that are allowed to be chosen next after a certain column. Their index corresponds to the number from Column_Numbers2 -1.
Now I wonder if there is a possibility to speed this up by doing some things in a different way. The results should be a sequence of all column numbers from Column_Numbers2 (numbers 1 to 266 in this case). This script does work, but I have to do many iterations with it so I'm wondering if there's a way to save some time.
Thanks
Thank you for the working example. This allowed my to help you. Here is some code. The basic idea is to replace:
shuffle(Column_Numbers2)
with
Column_Numbers2 = np.random.permutation(Column_Numbers2).tolist()
This makes your code about 3 times faster:
from datetime import datetime
import numpy as np
from random import shuffle
START_CLOCK = datetime.now()
TotalNumbcol = 266
NeighborsperColumn = [[3, 2, 5, 6, 7], [3, 6, 1, 7, 5, 4, 10, 11, 12, 13], [7, 2, 1, 6, 5, 11, 12, 13], [5, 10, 11, 9, 2, 6, 8, 12, 16, 17, 18, 19, 20], [6, 11, 4, 2, 12, 10, 1, 3, 7, 9, 13, 17, 18, 19, 20], [7, 12, 5, 2, 3, 13, 11, 1, 4, 10, 18, 19, 20], [13, 6, 3, 12, 2, 1, 5, 11, 19, 20], [9, 16, 17, 15, 4, 10, 14, 18, 24, 25, 26, 27, 28], [10, 17, 8, 4, 18, 16, 5, 11, 15, 19, 25, 26, 27, 28, 29], [11, 18, 9, 4, 5, 19, 17, 2, 6, 8, 12, 16, 20, 26, 27, 28, 29], [12, 19, 10, 5, 6, 20, 18, 4, 2, 3, 7, 9, 13, 17, 27, 28, 29], [13, 20, 11, 6, 7, 19, 5, 2, 3, 4, 10, 18, 28, 29], [12, 7, 20, 6, 2, 3, 5, 11, 19, 29], [15, 24, 25, 23, 8, 16, 22, 26, 34, 35, 36, 37, 38], [16, 25, 14, 8, 26, 24, 9, 17, 23, 27, 35, 36, 37, 38, 39], [17, 26, 15, 8, 9, 27, 25, 4, 10, 14, 18, 24, 28, 36, 37, 38, 39, 40], [18, 27, 16, 9, 10, 28, 26, 8, 4, 5, 11, 15, 19, 25, 29, 37, 38, 39, 40, 41], [19, 28, 17, 10, 11, 29, 27, 9, 4, 5, 6, 8, 12, 16, 20, 26, 38, 39, 40, 41], [20, 29, 18, 11, 12, 28, 10, 4, 5, 6, 7, 9, 13, 17, 27, 39, 40, 41], [19, 12, 13, 29, 11, 4, 5, 6, 7, 10, 18, 28, 40, 41], [22, 33, 34, 32, 23, 31, 35, 45, 46, 47, 48, 49], [23, 34, 21, 35, 33, 14, 24, 32, 36, 46, 47, 48, 49, 50], [24, 35, 22, 14, 36, 34, 15, 21, 25, 33, 37, 47, 48, 49, 50, 51], [25, 36, 23, 14, 15, 37, 35, 8, 16, 22, 26, 34, 38, 48, 49, 50, 51, 52], [26, 37, 24, 15, 16, 38, 36, 14, 8, 9, 17, 23, 27, 35, 39, 49, 50, 51, 52, 53], [27, 38, 25, 16, 17, 39, 37, 15, 8, 9, 10, 14, 18, 24, 28, 36, 40, 50, 51, 52, 53, 54], [28, 39, 26, 17, 18, 40, 38, 16, 8, 9, 10, 11, 15, 19, 25, 29, 37, 41, 51, 52, 53, 54], [29, 40, 27, 18, 19, 41, 39, 17, 8, 9, 10, 11, 12, 16, 20, 26, 38, 52, 53, 54], [41, 28, 19, 20, 40, 18, 9, 10, 11, 12, 13, 17, 27, 39, 53, 54], [31, 44, 45, 43, 32, 42, 46, 58, 59, 60, 61, 62], [32, 45, 30, 46, 44, 21, 33, 43, 47, 59, 60, 61, 62, 63], [33, 46, 31, 21, 47, 45, 22, 30, 34, 44, 48, 60, 61, 62, 63, 64], [34, 47, 32, 21, 22, 48, 46, 23, 31, 35, 45, 49, 61, 62, 63, 64, 65], [35, 48, 33, 22, 23, 49, 47, 21, 14, 24, 32, 36, 46, 50, 62, 63, 64, 65, 66], [36, 49, 34, 23, 24, 50, 48, 22, 14, 15, 21, 25, 33, 37, 47, 51, 63, 64, 65, 66, 67], [37, 50, 35, 24, 25, 51, 49, 23, 14, 15, 16, 22, 26, 34, 38, 48, 52, 64, 65, 66, 67, 68], [38, 51, 36, 25, 26, 52, 50, 24, 14, 15, 16, 17, 23, 27, 35, 39, 49, 53, 65, 66, 67, 68, 69], [39, 52, 37, 26, 27, 53, 51, 25, 14, 15, 16, 17, 18, 24, 28, 36, 40, 50, 54, 66, 67, 68, 69], [40, 53, 38, 27, 28, 54, 52, 26, 15, 16, 17, 18, 19, 25, 29, 37, 41, 51, 67, 68, 69], [41, 54, 39, 28, 29, 53, 27, 16, 17, 18, 19, 20, 26, 38, 52, 68, 69], [40, 29, 54, 28, 17, 18, 19, 20, 27, 39, 53, 69], [43, 58, 59, 57, 30, 44, 56, 60, 74, 75, 76, 77, 78], [44, 59, 42, 30, 60, 58, 31, 45, 57, 61, 75, 76, 77, 78, 79], [45, 60, 43, 30, 31, 61, 59, 32, 42, 46, 58, 62, 76, 77, 78, 79, 80], [46, 61, 44, 31, 32, 62, 60, 30, 21, 33, 43, 47, 59, 63, 77, 78, 79, 80, 81], [47, 62, 45, 32, 33, 63, 61, 31, 21, 22, 30, 34, 44, 48, 60, 64, 78, 79, 80, 81, 82], [48, 63, 46, 33, 34, 64, 62, 32, 21, 22, 23, 31, 35, 45, 49, 61, 65, 79, 80, 81, 82, 83], [49, 64, 47, 34, 35, 65, 63, 33, 21, 22, 23, 24, 32, 36, 46, 50, 62, 66, 80, 81, 82, 83, 84], [50, 65, 48, 35, 36, 66, 64, 34, 21, 22, 23, 24, 25, 33, 37, 47, 51, 63, 67, 81, 82, 83, 84, 85], [51, 66, 49, 36, 37, 67, 65, 35, 22, 23, 24, 25, 26, 34, 38, 48, 52, 64, 68, 82, 83, 84, 85], [52, 67, 50, 37, 38, 68, 66, 36, 23, 24, 25, 26, 27, 35, 39, 49, 53, 65, 69, 83, 84, 85], [53, 68, 51, 38, 39, 69, 67, 37, 24, 25, 26, 27, 28, 36, 40, 50, 54, 66, 84, 85], [54, 69, 52, 39, 40, 68, 38, 25, 26, 27, 28, 29, 37, 41, 51, 67, 85], [53, 40, 41, 69, 39, 26, 27, 28, 29, 38, 52, 68], [56, 73, 74, 72, 57, 71, 75, 90, 91, 92, 93, 94], [57, 74, 55, 75, 73, 42, 58, 72, 76, 91, 92, 93, 94, 95], [58, 75, 56, 42, 76, 74, 43, 55, 59, 73, 77, 92, 93, 94, 95, 96], [59, 76, 57, 42, 43, 77, 75, 30, 44, 56, 60, 74, 78, 93, 94, 95, 96, 97], [60, 77, 58, 43, 44, 78, 76, 42, 30, 31, 45, 57, 61, 75, 79, 94, 95, 96, 97, 98], [61, 78, 59, 44, 45, 79, 77, 43, 30, 31, 32, 42, 46, 58, 62, 76, 80, 95, 96, 97, 98, 99], [62, 79, 60, 45, 46, 80, 78, 44, 30, 31, 32, 33, 43, 47, 59, 63, 77, 81, 96, 97, 98, 99, 100], [63, 80, 61, 46, 47, 81, 79, 45, 30, 31, 32, 33, 34, 44, 48, 60, 64, 78, 82, 97, 98, 99, 100, 101], [64, 81, 62, 47, 48, 82, 80, 46, 31, 32, 33, 34, 35, 45, 49, 61, 65, 79, 83, 98, 99, 100, 101, 102], [65, 82, 63, 48, 49, 83, 81, 47, 32, 33, 34, 35, 36, 46, 50, 62, 66, 80, 84, 99, 100, 101, 102], [66, 83, 64, 49, 50, 84, 82, 48, 33, 34, 35, 36, 37, 47, 51, 63, 67, 81, 85, 100, 101, 102], [67, 84, 65, 50, 51, 85, 83, 49, 34, 35, 36, 37, 38, 48, 52, 64, 68, 82, 101, 102], [68, 85, 66, 51, 52, 84, 50, 35, 36, 37, 38, 39, 49, 53, 65, 69, 83, 102], [69, 67, 52, 53, 85, 51, 36, 37, 38, 39, 40, 50, 54, 66, 84], [68, 53, 54, 52, 37, 38, 39, 40, 41, 51, 67, 85], [71, 89, 90, 88, 72, 87, 91, 106, 107, 108, 109, 110], [72, 90, 70, 91, 89, 55, 73, 88, 92, 107, 108, 109, 110, 111], [73, 91, 71, 55, 92, 90, 56, 70, 74, 89, 93, 108, 109, 110, 111, 112], [74, 92, 72, 55, 56, 93, 91, 57, 71, 75, 90, 94, 109, 110, 111, 112, 113], [75, 93, 73, 56, 57, 94, 92, 55, 42, 58, 72, 76, 91, 95, 110, 111, 112, 113, 114], [76, 94, 74, 57, 58, 95, 93, 56, 42, 43, 55, 59, 73, 77, 92, 96, 111, 112, 113, 114, 115], [77, 95, 75, 58, 59, 96, 94, 57, 42, 43, 44, 56, 60, 74, 78, 93, 97, 112, 113, 114, 115, 116], [78, 96, 76, 59, 60, 97, 95, 58, 42, 43, 44, 45, 57, 61, 75, 79, 94, 98, 113, 114, 115, 116, 117], [79, 97, 77, 60, 61, 98, 96, 59, 42, 43, 44, 45, 46, 58, 62, 76, 80, 95, 99, 114, 115, 116, 117, 118], [80, 98, 78, 61, 62, 99, 97, 60, 43, 44, 45, 46, 47, 59, 63, 77, 81, 96, 100, 115, 116, 117, 118, 119], [81, 99, 79, 62, 63, 100, 98, 61, 44, 45, 46, 47, 48, 60, 64, 78, 82, 97, 101, 116, 117, 118, 119, 120], [82, 100, 80, 63, 64, 101, 99, 62, 45, 46, 47, 48, 49, 61, 65, 79, 83, 98, 102, 117, 118, 119, 120], [83, 101, 81, 64, 65, 102, 100, 63, 46, 47, 48, 49, 50, 62, 66, 80, 84, 99, 118, 119, 120], [84, 102, 82, 65, 66, 101, 64, 47, 48, 49, 50, 51, 63, 67, 81, 85, 100, 119, 120], [85, 83, 66, 67, 102, 65, 48, 49, 50, 51, 52, 64, 68, 82, 101, 120], [84, 67, 68, 66, 49, 50, 51, 52, 53, 65, 69, 83, 102], [87, 105, 106, 104, 88, 103, 107, 126, 127, 128, 129, 130], [88, 106, 86, 107, 105, 70, 89, 104, 108, 127, 128, 129, 130, 131], [89, 107, 87, 70, 108, 106, 71, 86, 90, 105, 109, 128, 129, 130, 131, 132], [90, 108, 88, 70, 71, 109, 107, 72, 87, 91, 106, 110, 129, 130, 131, 132, 133], [91, 109, 89, 71, 72, 110, 108, 70, 55, 73, 88, 92, 107, 111, 130, 131, 132, 133, 134], [92, 110, 90, 72, 73, 111, 109, 71, 55, 56, 70, 74, 89, 93, 108, 112, 131, 132, 133, 134, 135], [93, 111, 91, 73, 74, 112, 110, 72, 55, 56, 57, 71, 75, 90, 94, 109, 113, 132, 133, 134, 135, 136], [94, 112, 92, 74, 75, 113, 111, 73, 55, 56, 57, 58, 72, 76, 91, 95, 110, 114, 133, 134, 135, 136, 137], [95, 113, 93, 75, 76, 114, 112, 74, 55, 56, 57, 58, 59, 73, 77, 92, 96, 111, 115, 134, 135, 136, 137, 138], [96, 114, 94, 76, 77, 115, 113, 75, 56, 57, 58, 59, 60, 74, 78, 93, 97, 112, 116, 135, 136, 137, 138, 139], [97, 115, 95, 77, 78, 116, 114, 76, 57, 58, 59, 60, 61, 75, 79, 94, 98, 113, 117, 136, 137, 138, 139, 140], [98, 116, 96, 78, 79, 117, 115, 77, 58, 59, 60, 61, 62, 76, 80, 95, 99, 114, 118, 137, 138, 139, 140, 141], [99, 117, 97, 79, 80, 118, 116, 78, 59, 60, 61, 62, 63, 77, 81, 96, 100, 115, 119, 138, 139, 140, 141], [100, 118, 98, 80, 81, 119, 117, 79, 60, 61, 62, 63, 64, 78, 82, 97, 101, 116, 120, 139, 140, 141], [101, 119, 99, 81, 82, 120, 118, 80, 61, 62, 63, 64, 65, 79, 83, 98, 102, 117, 140, 141], [102, 120, 100, 82, 83, 119, 81, 62, 63, 64, 65, 66, 80, 84, 99, 118, 141], [101, 83, 84, 120, 82, 63, 64, 65, 66, 67, 81, 85, 100, 119], [104, 126, 127, 125, 86, 105, 124, 128, 149, 150, 151, 152, 153], [105, 127, 103, 86, 128, 126, 87, 106, 125, 129, 150, 151, 152, 153, 154], [106, 128, 104, 86, 87, 129, 127, 88, 103, 107, 126, 130, 151, 152, 153, 154, 155], [107, 129, 105, 87, 88, 130, 128, 86, 70, 89, 104, 108, 127, 131, 152, 153, 154, 155, 156], [108, 130, 106, 88, 89, 131, 129, 87, 70, 71, 86, 90, 105, 109, 128, 132, 153, 154, 155, 156, 157], [109, 131, 107, 89, 90, 132, 130, 88, 70, 71, 72, 87, 91, 106, 110, 129, 133, 154, 155, 156, 157, 158], [110, 132, 108, 90, 91, 133, 131, 89, 70, 71, 72, 73, 88, 92, 107, 111, 130, 134, 155, 156, 157, 158, 159], [111, 133, 109, 91, 92, 134, 132, 90, 70, 71, 72, 73, 74, 89, 93, 108, 112, 131, 135, 156, 157, 158, 159, 160], [112, 134, 110, 92, 93, 135, 133, 91, 71, 72, 73, 74, 75, 90, 94, 109, 113, 132, 136, 157, 158, 159, 160, 161], [113, 135, 111, 93, 94, 136, 134, 92, 72, 73, 74, 75, 76, 91, 95, 110, 114, 133, 137, 158, 159, 160, 161, 162], [114, 136, 112, 94, 95, 137, 135, 93, 73, 74, 75, 76, 77, 92, 96, 111, 115, 134, 138, 159, 160, 161, 162, 163], [115, 137, 113, 95, 96, 138, 136, 94, 74, 75, 76, 77, 78, 93, 97, 112, 116, 135, 139, 160, 161, 162, 163], [116, 138, 114, 96, 97, 139, 137, 95, 75, 76, 77, 78, 79, 94, 98, 113, 117, 136, 140, 161, 162, 163], [117, 139, 115, 97, 98, 140, 138, 96, 76, 77, 78, 79, 80, 95, 99, 114, 118, 137, 141, 162, 163], [118, 140, 116, 98, 99, 141, 139, 97, 77, 78, 79, 80, 81, 96, 100, 115, 119, 138, 163], [119, 141, 117, 99, 100, 140, 98, 78, 79, 80, 81, 82, 97, 101, 116, 120, 139], [120, 118, 100, 101, 141, 99, 79, 80, 81, 82, 83, 98, 102, 117, 140], [119, 101, 102, 100, 80, 81, 82, 83, 84, 99, 118, 141], [122, 146, 147, 145, 123, 144, 148, 169, 170, 171, 172, 173], [123, 147, 121, 148, 146, 124, 145, 149, 170, 171, 172, 173, 174], [124, 148, 122, 149, 147, 121, 125, 146, 150, 171, 172, 173, 174, 175], [125, 149, 123, 150, 148, 103, 122, 126, 147, 151, 172, 173, 174, 175, 176], [126, 150, 124, 103, 151, 149, 104, 123, 127, 148, 152, 173, 174, 175, 176, 177], [127, 151, 125, 103, 104, 152, 150, 86, 105, 124, 128, 149, 153, 174, 175, 176, 177, 178], [128, 152, 126, 104, 105, 153, 151, 103, 86, 87, 106, 125, 129, 150, 154, 175, 176, 177, 178, 179], [129, 153, 127, 105, 106, 154, 152, 104, 86, 87, 88, 103, 107, 126, 130, 151, 155, 176, 177, 178, 179, 180], [130, 154, 128, 106, 107, 155, 153, 105, 86, 87, 88, 89, 104, 108, 127, 131, 152, 156, 177, 178, 179, 180, 181], [131, 155, 129, 107, 108, 156, 154, 106, 86, 87, 88, 89, 90, 105, 109, 128, 132, 153, 157, 178, 179, 180, 181, 182], [132, 156, 130, 108, 109, 157, 155, 107, 87, 88, 89, 90, 91, 106, 110, 129, 133, 154, 158, 179, 180, 181, 182, 183], [133, 157, 131, 109, 110, 158, 156, 108, 88, 89, 90, 91, 92, 107, 111, 130, 134, 155, 159, 180, 181, 182, 183, 184], [134, 158, 132, 110, 111, 159, 157, 109, 89, 90, 91, 92, 93, 108, 112, 131, 135, 156, 160, 181, 182, 183, 184, 185], [135, 159, 133, 111, 112, 160, 158, 110, 90, 91, 92, 93, 94, 109, 113, 132, 136, 157, 161, 182, 183, 184, 185, 186], [136, 160, 134, 112, 113, 161, 159, 111, 91, 92, 93, 94, 95, 110, 114, 133, 137, 158, 162, 183, 184, 185, 186, 187], [137, 161, 135, 113, 114, 162, 160, 112, 92, 93, 94, 95, 96, 111, 115, 134, 138, 159, 163, 184, 185, 186, 187], [138, 162, 136, 114, 115, 163, 161, 113, 93, 94, 95, 96, 97, 112, 116, 135, 139, 160, 185, 186, 187], [139, 163, 137, 115, 116, 162, 114, 94, 95, 96, 97, 98, 113, 117, 136, 140, 161, 186, 187], [140, 138, 116, 117, 163, 115, 95, 96, 97, 98, 99, 114, 118, 137, 141, 162, 187], [141, 139, 117, 118, 116, 96, 97, 98, 99, 100, 115, 119, 138, 163], [140, 118, 119, 117, 97, 98, 99, 100, 101, 116, 120, 139], [143, 167, 168, 166, 144, 165, 169, 193, 194, 195, 196, 197], [144, 168, 142, 169, 167, 145, 166, 170, 194, 195, 196, 197, 198], [145, 169, 143, 170, 168, 121, 142, 146, 167, 171, 195, 196, 197, 198, 199], [146, 170, 144, 121, 171, 169, 122, 143, 147, 168, 172, 196, 197, 198, 199, 200], [147, 171, 145, 121, 122, 172, 170, 123, 144, 148, 169, 173, 197, 198, 199, 200, 201], [148, 172, 146, 122, 123, 173, 171, 121, 124, 145, 149, 170, 174, 198, 199, 200, 201, 202], [149, 173, 147, 123, 124, 174, 172, 122, 121, 125, 146, 150, 171, 175, 199, 200, 201, 202, 203], [150, 174, 148, 124, 125, 175, 173, 123, 103, 122, 126, 147, 151, 172, 176, 200, 201, 202, 203, 204], [151, 175, 149, 125, 126, 176, 174, 124, 103, 104, 123, 127, 148, 152, 173, 177, 201, 202, 203, 204, 205], [152, 176, 150, 126, 127, 177, 175, 125, 103, 104, 105, 124, 128, 149, 153, 174, 178, 202, 203, 204, 205, 206], [153, 177, 151, 127, 128, 178, 176, 126, 103, 104, 105, 106, 125, 129, 150, 154, 175, 179, 203, 204, 205, 206, 207], [154, 178, 152, 128, 129, 179, 177, 127, 103, 104, 105, 106, 107, 126, 130, 151, 155, 176, 180, 204, 205, 206, 207, 208], [155, 179, 153, 129, 130, 180, 178, 128, 104, 105, 106, 107, 108, 127, 131, 152, 156, 177, 181, 205, 206, 207, 208, 209], [156, 180, 154, 130, 131, 181, 179, 129, 105, 106, 107, 108, 109, 128, 132, 153, 157, 178, 182, 206, 207, 208, 209, 210], [157, 181, 155, 131, 132, 182, 180, 130, 106, 107, 108, 109, 110, 129, 133, 154, 158, 179, 183, 207, 208, 209, 210, 211], [158, 182, 156, 132, 133, 183, 181, 131, 107, 108, 109, 110, 111, 130, 134, 155, 159, 180, 184, 208, 209, 210, 211, 212], [159, 183, 157, 133, 134, 184, 182, 132, 108, 109, 110, 111, 112, 131, 135, 156, 160, 181, 185, 209, 210, 211, 212, 213], [160, 184, 158, 134, 135, 185, 183, 133, 109, 110, 111, 112, 113, 132, 136, 157, 161, 182, 186, 210, 211, 212, 213], [161, 185, 159, 135, 136, 186, 184, 134, 110, 111, 112, 113, 114, 133, 137, 158, 162, 183, 187, 211, 212, 213], [162, 186, 160, 136, 137, 187, 185, 135, 111, 112, 113, 114, 115, 134, 138, 159, 163, 184, 212, 213], [163, 187, 161, 137, 138, 186, 136, 112, 113, 114, 115, 116, 135, 139, 160, 185, 213], [162, 138, 139, 187, 137, 113, 114, 115, 116, 117, 136, 140, 161, 186], [165, 192, 193, 191, 166, 190, 194, 214, 215, 216, 217], [166, 193, 164, 194, 192, 142, 167, 191, 195, 214, 215, 216, 217, 218], [167, 194, 165, 142, 195, 193, 143, 164, 168, 192, 196, 215, 216, 217, 218, 219], [168, 195, 166, 142, 143, 196, 194, 144, 165, 169, 193, 197, 216, 217, 218, 219, 220], [169, 196, 167, 143, 144, 197, 195, 142, 145, 166, 170, 194, 198, 217, 218, 219, 220, 221], [170, 197, 168, 144, 145, 198, 196, 143, 121, 142, 146, 167, 171, 195, 199, 218, 219, 220, 221, 222], [171, 198, 169, 145, 146, 199, 197, 144, 121, 122, 143, 147, 168, 172, 196, 200, 219, 220, 221, 222, 223], [172, 199, 170, 146, 147, 200, 198, 145, 121, 122, 123, 144, 148, 169, 173, 197, 201, 220, 221, 222, 223, 224], [173, 200, 171, 147, 148, 201, 199, 146, 121, 122, 123, 124, 145, 149, 170, 174, 198, 202, 221, 222, 223, 224, 225], [174, 201, 172, 148, 149, 202, 200, 147, 121, 122, 123, 124, 125, 146, 150, 171, 175, 199, 203, 222, 223, 224, 225, 226], [175, 202, 173, 149, 150, 203, 201, 148, 122, 123, 124, 125, 126, 147, 151, 172, 176, 200, 204, 223, 224, 225, 226, 227], [176, 203, 174, 150, 151, 204, 202, 149, 123, 124, 125, 126, 127, 148, 152, 173, 177, 201, 205, 224, 225, 226, 227, 228], [177, 204, 175, 151, 152, 205, 203, 150, 124, 125, 126, 127, 128, 149, 153, 174, 178, 202, 206, 225, 226, 227, 228, 229], [178, 205, 176, 152, 153, 206, 204, 151, 125, 126, 127, 128, 129, 150, 154, 175, 179, 203, 207, 226, 227, 228, 229, 230], [179, 206, 177, 153, 154, 207, 205, 152, 126, 127, 128, 129, 130, 151, 155, 176, 180, 204, 208, 227, 228, 229, 230, 231], [180, 207, 178, 154, 155, 208, 206, 153, 127, 128, 129, 130, 131, 152, 156, 177, 181, 205, 209, 228, 229, 230, 231], [181, 208, 179, 155, 156, 209, 207, 154, 128, 129, 130, 131, 132, 153, 157, 178, 182, 206, 210, 229, 230, 231], [182, 209, 180, 156, 157, 210, 208, 155, 129, 130, 131, 132, 133, 154, 158, 179, 183, 207, 211, 230, 231], [183, 210, 181, 157, 158, 211, 209, 156, 130, 131, 132, 133, 134, 155, 159, 180, 184, 208, 212, 231], [184, 211, 182, 158, 159, 212, 210, 157, 131, 132, 133, 134, 135, 156, 160, 181, 185, 209, 213], [185, 212, 183, 159, 160, 213, 211, 158, 132, 133, 134, 135, 136, 157, 161, 182, 186, 210], [186, 213, 184, 160, 161, 212, 159, 133, 134, 135, 136, 137, 158, 162, 183, 187, 211], [187, 185, 161, 162, 213, 160, 134, 135, 136, 137, 138, 159, 163, 184, 212], [186, 162, 163, 161, 135, 136, 137, 138, 139, 160, 185, 213], [189, 190], [190, 188, 191, 214], [191, 189, 214, 164, 188, 192, 215, 232], [192, 214, 190, 164, 215, 165, 189, 193, 216, 232, 233], [193, 215, 191, 164, 165, 216, 214, 166, 190, 194, 217, 232, 233, 234], [194, 216, 192, 165, 166, 217, 215, 164, 142, 167, 191, 195, 214, 218, 232, 233, 234, 235], [195, 217, 193, 166, 167, 218, 216, 165, 142, 143, 164, 168, 192, 196, 215, 219, 232, 233, 234, 235, 236], [196, 218, 194, 167, 168, 219, 217, 166, 142, 143, 144, 165, 169, 193, 197, 216, 220, 233, 234, 235, 236, 237], [197, 219, 195, 168, 169, 220, 218, 167, 142, 143, 144, 145, 166, 170, 194, 198, 217, 221, 234, 235, 236, 237, 238], [198, 220, 196, 169, 170, 221, 219, 168, 142, 143, 144, 145, 146, 167, 171, 195, 199, 218, 222, 235, 236, 237, 238, 239], [199, 221, 197, 170, 171, 222, 220, 169, 143, 144, 145, 146, 147, 168, 172, 196, 200, 219, 223, 236, 237, 238, 239, 240], [200, 222, 198, 171, 172, 223, 221, 170, 144, 145, 146, 147, 148, 169, 173, 197, 201, 220, 224, 237, 238, 239, 240, 241], [201, 223, 199, 172, 173, 224, 222, 171, 145, 146, 147, 148, 149, 170, 174, 198, 202, 221, 225, 238, 239, 240, 241, 242], [202, 224, 200, 173, 174, 225, 223, 172, 146, 147, 148, 149, 150, 171, 175, 199, 203, 222, 226, 239, 240, 241, 242, 243], [203, 225, 201, 174, 175, 226, 224, 173, 147, 148, 149, 150, 151, 172, 176, 200, 204, 223, 227, 240, 241, 242, 243, 244], [204, 226, 202, 175, 176, 227, 225, 174, 148, 149, 150, 151, 152, 173, 177, 201, 205, 224, 228, 241, 242, 243, 244, 245], [205, 227, 203, 176, 177, 228, 226, 175, 149, 150, 151, 152, 153, 174, 178, 202, 206, 225, 229, 242, 243, 244, 245], [206, 228, 204, 177, 178, 229, 227, 176, 150, 151, 152, 153, 154, 175, 179, 203, 207, 226, 230, 243, 244, 245], [207, 229, 205, 178, 179, 230, 228, 177, 151, 152, 153, 154, 155, 176, 180, 204, 208, 227, 231, 244, 245], [208, 230, 206, 179, 180, 231, 229, 178, 152, 153, 154, 155, 156, 177, 181, 205, 209, 228, 245], [209, 231, 207, 180, 181, 230, 179, 153, 154, 155, 156, 157, 178, 182, 206, 210, 229], [210, 208, 181, 182, 231, 180, 154, 155, 156, 157, 158, 179, 183, 207, 211, 230], [211, 209, 182, 183, 181, 155, 156, 157, 158, 159, 180, 184, 208, 212, 231], [212, 210, 183, 184, 182, 156, 157, 158, 159, 160, 181, 185, 209, 213], [213, 211, 184, 185, 183, 157, 158, 159, 160, 161, 182, 186, 210], [212, 185, 186, 184, 158, 159, 160, 161, 162, 183, 187, 211], [215, 191, 192, 232, 190, 164, 165, 189, 193, 216, 233], [216, 232, 214, 192, 193, 233, 191, 164, 165, 166, 190, 194, 217, 234, 246], [217, 233, 215, 193, 194, 234, 232, 192, 164, 165, 166, 167, 191, 195, 214, 218, 235, 246, 247], [218, 234, 216, 194, 195, 235, 233, 193, 164, 165, 166, 167, 168, 192, 196, 215, 219, 232, 236, 246, 247, 248], [219, 235, 217, 195, 196, 236, 234, 194, 165, 166, 167, 168, 169, 193, 197, 216, 220, 233, 237, 246, 247, 248, 249], [220, 236, 218, 196, 197, 237, 235, 195, 166, 167, 168, 169, 170, 194, 198, 217, 221, 234, 238, 246, 247, 248, 249, 250], [221, 237, 219, 197, 198, 238, 236, 196, 167, 168, 169, 170, 171, 195, 199, 218, 222, 235, 239, 247, 248, 249, 250, 251], [222, 238, 220, 198, 199, 239, 237, 197, 168, 169, 170, 171, 172, 196, 200, 219, 223, 236, 240, 248, 249, 250, 251, 252], [223, 239, 221, 199, 200, 240, 238, 198, 169, 170, 171, 172, 173, 197, 201, 220, 224, 237, 241, 249, 250, 251, 252, 253], [224, 240, 222, 200, 201, 241, 239, 199, 170, 171, 172, 173, 174, 198, 202, 221, 225, 238, 242, 250, 251, 252, 253, 254], [225, 241, 223, 201, 202, 242, 240, 200, 171, 172, 173, 174, 175, 199, 203, 222, 226, 239, 243, 251, 252, 253, 254, 255], [226, 242, 224, 202, 203, 243, 241, 201, 172, 173, 174, 175, 176, 200, 204, 223, 227, 240, 244, 252, 253, 254, 255], [227, 243, 225, 203, 204, 244, 242, 202, 173, 174, 175, 176, 177, 201, 205, 224, 228, 241, 245, 253, 254, 255], [228, 244, 226, 204, 205, 245, 243, 203, 174, 175, 176, 177, 178, 202, 206, 225, 229, 242, 254, 255], [229, 245, 227, 205, 206, 244, 204, 175, 176, 177, 178, 179, 203, 207, 226, 230, 243, 255], [230, 228, 206, 207, 245, 205, 176, 177, 178, 179, 180, 204, 208, 227, 231, 244], [231, 229, 207, 208, 206, 177, 178, 179, 180, 181, 205, 209, 228, 245], [230, 208, 209, 207, 178, 179, 180, 181, 182, 206, 210, 229], [233, 215, 216, 214, 190, 191, 192, 193, 194, 217, 234, 246], [234, 232, 216, 217, 246, 215, 191, 192, 193, 194, 195, 214, 218, 235, 247, 256], [235, 246, 233, 217, 218, 247, 216, 192, 193, 194, 195, 196, 215, 219, 232, 236, 248, 256, 257], [236, 247, 234, 218, 219, 248, 246, 217, 193, 194, 195, 196, 197, 216, 220, 233, 237, 249, 256, 257, 258], [237, 248, 235, 219, 220, 249, 247, 218, 194, 195, 196, 197, 198, 217, 221, 234, 238, 246, 250, 256, 257, 258, 259], [238, 249, 236, 220, 221, 250, 248, 219, 195, 196, 197, 198, 199, 218, 222, 235, 239, 247, 251, 256, 257, 258, 259, 260], [239, 250, 237, 221, 222, 251, 249, 220, 196, 197, 198, 199, 200, 219, 223, 236, 240, 248, 252, 257, 258, 259, 260, 261], [240, 251, 238, 222, 223, 252, 250, 221, 197, 198, 199, 200, 201, 220, 224, 237, 241, 249, 253, 258, 259, 260, 261, 262], [241, 252, 239, 223, 224, 253, 251, 222, 198, 199, 200, 201, 202, 221, 225, 238, 242, 250, 254, 259, 260, 261, 262], [242, 253, 240, 224, 225, 254, 252, 223, 199, 200, 201, 202, 203, 222, 226, 239, 243, 251, 255, 260, 261, 262], [243, 254, 241, 225, 226, 255, 253, 224, 200, 201, 202, 203, 204, 223, 227, 240, 244, 252, 261, 262], [244, 255, 242, 226, 227, 254, 225, 201, 202, 203, 204, 205, 224, 228, 241, 245, 253, 262], [245, 243, 227, 228, 255, 226, 202, 203, 204, 205, 206, 225, 229, 242, 254], [244, 228, 229, 227, 203, 204, 205, 206, 207, 226, 230, 243, 255], [247, 234, 235, 256, 233, 215, 216, 217, 218, 219, 232, 236, 248, 257, 263], [248, 256, 246, 235, 236, 257, 234, 216, 217, 218, 219, 220, 233, 237, 249, 258, 263, 264], [249, 257, 247, 236, 237, 258, 256, 235, 217, 218, 219, 220, 221, 234, 238, 246, 250, 259, 263, 264, 265], [250, 258, 248, 237, 238, 259, 257, 236, 218, 219, 220, 221, 222, 235, 239, 247, 251, 256, 260, 263, 264, 265, 266], [251, 259, 249, 238, 239, 260, 258, 237, 219, 220, 221, 222, 223, 236, 240, 248, 252, 257, 261, 263, 264, 265, 266], [252, 260, 250, 239, 240, 261, 259, 238, 220, 221, 222, 223, 224, 237, 241, 249, 253, 258, 262, 264, 265, 266], [253, 261, 251, 240, 241, 262, 260, 239, 221, 222, 223, 224, 225, 238, 242, 250, 254, 259, 265, 266], [254, 262, 252, 241, 242, 261, 240, 222, 223, 224, 225, 226, 239, 243, 251, 255, 260, 266], [255, 253, 242, 243, 262, 241, 223, 224, 225, 226, 227, 240, 244, 252, 261], [254, 243, 244, 242, 224, 225, 226, 227, 228, 241, 245, 253, 262], [257, 247, 248, 263, 246, 233, 234, 235, 236, 237, 249, 258, 264], [258, 263, 256, 248, 249, 264, 247, 234, 235, 236, 237, 238, 246, 250, 259, 265], [259, 264, 257, 249, 250, 265, 263, 248, 235, 236, 237, 238, 239, 247, 251, 256, 260, 266], [260, 265, 258, 250, 251, 266, 264, 249, 236, 237, 238, 239, 240, 248, 252, 257, 261, 263], [261, 266, 259, 251, 252, 265, 250, 237, 238, 239, 240, 241, 249, 253, 258, 262, 264], [262, 260, 252, 253, 266, 251, 238, 239, 240, 241, 242, 250, 254, 259, 265], [261, 253, 254, 252, 239, 240, 241, 242, 243, 251, 255, 260, 266], [264, 257, 258, 256, 246, 247, 248, 249, 250, 259, 265], [265, 263, 258, 259, 257, 247, 248, 249, 250, 251, 256, 260, 266], [266, 264, 259, 260, 258, 248, 249, 250, 251, 252, 257, 261, 263], [265, 260, 261, 259, 249, 250, 251, 252, 253, 258, 262, 264]]
Column_Numbers2 = list(np.arange(1,TotalNumbcol+1,1))
Chosen_Columns2 = []
# shuffle(Column_Numbers2) <--- This line was very slow.
Column_Numbers2 = np.random.permutation(Column_Numbers2).tolist()
rand = Column_Numbers2.pop()
Chosen_Columns2.append(rand)
while Column_Numbers2:
for i in range(rand-1,rand):
rand = NeighborsperColumn[i]
rand = [x for x in rand if x not in Chosen_Columns2]
shuffle(rand)
try:
rand = rand.pop()
Chosen_Columns2.append(rand)
Column_Numbers2.remove(rand)
except IndexError:
rand = Column_Numbers2.pop()
Chosen_Columns2.append(rand)
END_CLOCK = datetime.now()
DELTA_TIME = END_CLOCK - START_CLOCK
print DELTA_TIME
In general you should use a profiler to find the lines in your code that are too slow.

image analysis : separating intersecting spaghettis

I've got an image which to the human eye clearly contains several (2 here) overlapping 'laces'.
This stems from a pretty lengthy image analysis of an experiment.
The red dots are all the points contained in two vectors, px and py, one with the x_position of the red pixels, the other one with the y positions.
px= array([ 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1,
2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3,
3, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5,
5, 5, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7,
7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9,
9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10,
11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12,
13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14,
15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16,
16, 16, 16, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18,
18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20,
20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 22, 22,
22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23,
24, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25,
25, 25, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27,
27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29,
29, 29, 29, 29, 30, 30, 30, 30, 30, 30, 30, 30, 31,
31, 31, 31, 31, 31, 31, 31, 32, 32, 32, 32, 32, 32,
32, 33, 33, 33, 33, 33, 33, 33, 34, 34, 34, 34, 34,
34, 34, 35, 35, 35, 35, 35, 35, 35, 36, 36, 36, 36,
36, 36, 37, 37, 37, 37, 37, 37, 37, 38, 38, 38, 38,
38, 38, 38, 39, 39, 39, 39, 39, 39, 39, 40, 40, 40,
40, 40, 40, 40, 41, 41, 41, 41, 41, 41, 41, 41, 42,
42, 42, 42, 42, 42, 42, 43, 43, 43, 43, 43, 43, 43,
44, 44, 44, 44, 44, 44, 44, 44, 45, 45, 45, 45, 45,
45, 45, 45, 45, 45, 45, 46, 46, 46, 46, 46, 46, 46,
46, 46, 46, 46, 46, 46, 46, 46, 47, 47, 47, 47, 47,
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 48, 48,
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
48, 48, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
49, 49, 49, 49, 49, 49, 49, 50, 50, 50, 50, 50, 50,
50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
50, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
51, 51, 51, 51, 51, 51, 51, 52, 52, 52, 52, 52, 52,
52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
52, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
53, 53, 53, 53, 53, 53, 53, 53, 54, 54, 54, 54, 54,
54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54,
54, 54, 54, 54, 55, 55, 55, 55, 55, 55, 55, 55, 55,
55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
55, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 58, 58, 58,
58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
58, 58, 58, 58, 58, 58, 59, 59, 59, 59, 59, 59, 59,
59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
59, 59, 59, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 62, 62, 62,
62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
62, 62, 62, 62, 62, 62, 62, 63, 63, 63, 63, 63, 63,
63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63,
63, 63, 63, 63, 63, 64, 64, 64, 64, 64, 64, 64, 64,
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
64, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 66, 66,
66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
66, 66, 66, 66, 66, 66, 66, 66, 67, 67, 67, 67, 67,
67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
67, 67, 67, 67, 67, 67, 68, 68, 68, 68, 68, 68, 68,
68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
68, 68, 68, 68, 68, 69, 69, 69, 69, 69, 69, 69, 69,
69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
69, 69, 69, 69, 70, 70, 70, 70, 70, 70, 70, 70, 70,
70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,
71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
71, 71, 71, 71, 71, 72, 72, 72, 72, 72, 72, 72, 72,
72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 73, 73, 73,
73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
73, 73, 73, 73, 74, 74, 74, 74, 74, 74, 74, 74, 74,
74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 75,
75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75,
75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 76, 76, 76,
76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76,
76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76,
77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
77, 77, 77, 77, 77, 77, 77, 77, 78, 78, 78, 78, 78,
78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
78, 78, 78, 78, 79, 79, 79, 79, 79, 79, 79, 79, 79,
79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79,
79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79,
79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79,
79, 79, 79, 79, 80, 80, 80, 80, 80, 80, 80, 80, 80,
80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
80, 80, 80, 80, 80, 80, 81, 81, 81, 81, 81, 81, 81,
81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
81, 81, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82,
82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82,
82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82,
82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82,
82, 82, 82, 82, 82, 82, 82, 82, 83, 83, 83, 83, 83,
83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83,
83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83,
83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83,
83, 83, 83, 83, 83, 83, 83, 83, 83, 84, 84, 84, 84,
84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
84, 84, 84, 84, 85, 85, 85, 85, 85, 85, 85, 85, 85,
85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
85, 85, 85, 85, 86, 86, 86, 86, 86, 86, 86, 86, 86,
86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 87, 87,
87, 87, 87, 87, 88, 88, 88, 88, 88, 88, 89, 89, 89,
89, 89, 89, 89, 90, 90, 90, 90, 90, 90, 91, 91, 91,
91, 91, 91, 91, 92, 92, 92, 92, 92, 92, 92, 93, 93,
93, 93, 93, 93, 93, 94, 94, 94, 94, 94, 94, 95, 95,
95, 95, 95, 95, 96, 96, 96, 96, 96, 96, 97, 97, 97,
97, 97, 97, 97, 98, 98, 98, 98, 98, 98, 99, 99, 99,
99, 99, 99, 100, 100, 100, 100, 100, 100, 101, 101, 101, 101,
101, 101, 102, 102, 102, 102, 102, 102, 103, 103, 103, 103, 103,
103, 104, 104, 104, 104, 104, 104, 105, 105, 105, 105, 105, 105,
106, 106, 106, 106, 106, 106, 106, 107, 107, 107, 107, 107, 107,
108, 108, 108, 108, 108, 108, 108, 109, 109, 109, 109, 109, 109,
110, 110, 110, 110, 110, 110, 110, 111, 111, 111, 111, 111, 111,
112, 112, 112, 112, 112, 112, 113, 113, 113, 113, 113, 113, 114,
114, 114, 114, 114, 114, 115, 115, 115, 115, 115, 115, 116, 116,
116, 116, 116, 116, 117, 117, 117, 117, 117, 117, 117, 118, 118,
118, 118, 118, 118, 119, 119, 119, 119, 119, 119, 119, 120, 120,
120, 120, 120, 120, 121, 121, 121, 121, 121, 121, 121, 122, 122,
122, 122, 122, 122, 123, 123, 123, 123, 123, 123, 123, 124, 124,
124, 124, 124, 124, 125, 125, 125, 125, 125, 125, 125, 126, 126,
126, 126, 126, 126, 127, 127, 127, 127, 127, 127, 128, 128, 128,
128, 128, 128, 129, 129, 129, 129, 129, 129, 129, 130, 130, 130,
130, 130, 130, 131, 131, 131, 131, 131, 131, 131, 132, 132, 132,
132, 132, 132, 133, 133, 133, 133, 133, 133, 133, 134, 134, 134,
134, 134, 134, 135, 135, 135, 135, 135, 135, 135, 136, 136, 136,
136, 136, 136, 137, 137, 137, 137, 137, 137, 138, 138, 138, 138,
138, 138, 139, 139, 139, 139, 139, 139, 140, 140, 140, 140, 140,
140, 141, 141, 141, 141, 141, 141, 141, 142, 142, 142, 142, 142,
142, 143, 143, 143, 143, 143, 143, 143, 144, 144, 144, 144, 144,
144, 145, 145, 145, 145, 145, 145, 145, 146, 146, 146, 146, 146,
146, 147, 147, 147, 147, 147, 147, 148, 148, 148, 148, 148, 148,
149, 149, 149, 149, 149, 149, 150, 150, 150, 150, 150, 150, 150,
151, 151, 151, 151, 151, 151, 152, 152, 152, 152, 152, 152, 153,
153, 153, 153, 153, 153, 153, 154, 154, 154, 154, 154, 154, 155,
155, 155, 155, 155, 155, 155, 156, 156, 156, 156, 156, 156, 157,
157, 157, 157, 157, 157, 158, 158, 158, 158, 158, 158, 158, 159,
159, 159, 159, 159, 159, 159, 160, 160, 160, 160, 160, 160, 160,
161, 161, 161, 161, 161, 161, 162, 162, 162, 162, 162, 162, 162,
163, 163, 163, 163, 163, 163, 163, 164, 164, 164, 164, 164, 164,
164, 165, 165, 165, 165, 165, 165, 165, 165, 166, 166, 166, 166,
166, 166, 166, 166, 167, 167, 167, 167, 167, 167, 167, 168, 168,
168, 168, 168, 168, 168, 169, 169, 169, 169, 169, 169, 169, 170,
170, 170, 170, 170, 170, 170, 171, 171, 171, 171, 171, 171, 171,
172, 172, 172, 172, 172, 172, 172, 173, 173, 173, 173])
and
py=array([189, 190, 191, 192, 193, 194, 189, 190, 191, 192, 193, 194, 195,
190, 191, 192, 193, 194, 195, 196, 190, 191, 192, 193, 194, 195,
196, 191, 192, 193, 194, 195, 196, 197, 192, 193, 194, 195, 196,
197, 198, 193, 194, 195, 196, 197, 198, 199, 194, 195, 196, 197,
198, 199, 200, 194, 195, 196, 197, 198, 199, 200, 201, 195, 196,
197, 198, 199, 200, 201, 202, 196, 197, 198, 199, 200, 201, 202,
197, 198, 199, 200, 201, 202, 203, 198, 199, 200, 201, 202, 203,
199, 200, 201, 202, 203, 204, 199, 200, 201, 202, 203, 204, 205,
199, 200, 201, 202, 203, 204, 205, 206, 200, 201, 202, 203, 204,
205, 206, 207, 202, 203, 204, 205, 206, 207, 202, 203, 204, 205,
206, 207, 208, 203, 204, 205, 206, 207, 208, 209, 204, 205, 206,
207, 208, 209, 210, 205, 206, 207, 208, 209, 210, 211, 206, 207,
208, 209, 210, 211, 212, 206, 207, 208, 209, 210, 211, 212, 213,
207, 208, 209, 210, 211, 212, 213, 214, 208, 209, 210, 211, 212,
213, 214, 209, 210, 211, 212, 213, 214, 215, 210, 211, 212, 213,
214, 215, 216, 211, 212, 213, 214, 215, 216, 217, 211, 212, 213,
214, 215, 216, 217, 212, 213, 214, 215, 216, 217, 218, 219, 213,
214, 215, 216, 217, 218, 219, 220, 214, 215, 216, 217, 218, 219,
220, 215, 216, 217, 218, 219, 220, 221, 216, 217, 218, 219, 220,
221, 222, 217, 218, 219, 220, 221, 222, 223, 218, 219, 220, 221,
222, 223, 218, 219, 220, 221, 222, 223, 224, 219, 220, 221, 222,
223, 224, 225, 220, 221, 222, 223, 224, 225, 226, 221, 222, 223,
224, 225, 226, 227, 221, 222, 223, 224, 225, 226, 227, 228, 222,
223, 224, 225, 226, 227, 228, 223, 224, 225, 226, 227, 228, 229,
224, 225, 226, 227, 228, 229, 230, 311, 225, 226, 227, 228, 229,
230, 309, 310, 311, 312, 313, 225, 226, 227, 228, 229, 230, 231,
307, 308, 309, 310, 311, 312, 313, 314, 226, 227, 228, 229, 230,
231, 232, 306, 307, 308, 309, 310, 311, 312, 313, 314, 227, 228,
229, 230, 231, 232, 304, 305, 306, 307, 308, 309, 310, 311, 312,
313, 314, 228, 229, 230, 231, 232, 233, 302, 303, 304, 305, 306,
307, 308, 309, 310, 311, 312, 313, 228, 229, 230, 231, 232, 233,
234, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311,
312, 229, 230, 231, 232, 233, 234, 298, 299, 300, 301, 302, 303,
304, 305, 306, 307, 308, 309, 310, 230, 231, 232, 233, 234, 235,
296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308,
309, 230, 231, 232, 233, 234, 235, 236, 294, 295, 296, 297, 298,
299, 300, 301, 302, 303, 304, 305, 306, 231, 232, 233, 234, 235,
236, 237, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301,
302, 303, 304, 305, 232, 233, 234, 235, 236, 237, 238, 239, 288,
289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301,
302, 233, 234, 235, 236, 237, 238, 239, 240, 285, 286, 287, 288,
289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301,
234, 235, 236, 237, 238, 239, 240, 283, 284, 285, 286, 287, 288,
289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 235, 236, 237,
238, 239, 240, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290,
291, 292, 293, 294, 295, 296, 235, 236, 237, 238, 239, 240, 241,
278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290,
291, 292, 293, 236, 237, 238, 239, 240, 241, 242, 276, 277, 278,
279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291,
237, 238, 239, 240, 241, 242, 243, 273, 274, 275, 276, 277, 278,
279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 238, 239, 240,
241, 242, 243, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278,
279, 280, 281, 282, 283, 284, 285, 238, 239, 240, 241, 242, 243,
244, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278,
279, 280, 281, 282, 283, 239, 240, 241, 242, 243, 244, 265, 266,
267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279,
280, 240, 241, 242, 243, 244, 245, 261, 262, 263, 264, 265, 266,
267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 240, 241,
242, 243, 244, 245, 258, 259, 260, 261, 262, 263, 264, 265, 266,
267, 268, 269, 270, 271, 272, 273, 274, 241, 242, 243, 244, 245,
246, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266,
267, 268, 269, 270, 271, 272, 241, 242, 243, 244, 245, 246, 247,
252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264,
265, 266, 267, 268, 269, 242, 243, 244, 245, 246, 247, 249, 250,
251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263,
264, 265, 266, 267, 242, 243, 244, 245, 246, 247, 248, 249, 250,
251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263,
243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255,
256, 257, 258, 259, 260, 240, 241, 242, 243, 244, 245, 246, 247,
248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 235, 236, 237,
238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250,
251, 252, 253, 254, 231, 232, 233, 234, 235, 236, 237, 238, 239,
240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 227,
228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240,
241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 223, 224, 225,
226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238,
239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251,
215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227,
228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240,
241, 242, 246, 247, 248, 249, 250, 251, 210, 211, 212, 213, 214,
215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227,
228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 246, 247,
248, 249, 250, 251, 189, 190, 191, 192, 193, 194, 195, 196, 197,
198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210,
211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223,
224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 247, 248,
249, 250, 251, 252, 183, 184, 185, 186, 187, 188, 189, 190, 191,
192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204,
205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217,
218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230,
247, 248, 249, 250, 251, 252, 172, 173, 174, 175, 176, 177, 178,
179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204,
205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217,
218, 219, 220, 221, 222, 223, 224, 225, 226, 248, 249, 250, 251,
252, 253, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178,
179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204,
205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217,
218, 219, 249, 250, 251, 252, 253, 254, 167, 168, 169, 170, 171,
172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184,
185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197,
198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210,
211, 212, 213, 249, 250, 251, 252, 253, 254, 167, 168, 169, 170,
171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183,
184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196,
197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 250, 251,
252, 253, 254, 255, 167, 168, 169, 170, 171, 172, 173, 174, 175,
176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 250, 251,
252, 253, 254, 255, 168, 169, 170, 171, 172, 173, 174, 175, 176,
177, 178, 179, 180, 250, 251, 252, 253, 254, 255, 256, 251, 252,
253, 254, 255, 256, 252, 253, 254, 255, 256, 257, 252, 253, 254,
255, 256, 257, 258, 253, 254, 255, 256, 257, 258, 253, 254, 255,
256, 257, 258, 259, 254, 255, 256, 257, 258, 259, 260, 254, 255,
256, 257, 258, 259, 260, 255, 256, 257, 258, 259, 260, 256, 257,
258, 259, 260, 261, 256, 257, 258, 259, 260, 261, 256, 257, 258,
259, 260, 261, 262, 257, 258, 259, 260, 261, 262, 258, 259, 260,
261, 262, 263, 258, 259, 260, 261, 262, 263, 259, 260, 261, 262,
263, 264, 259, 260, 261, 262, 263, 264, 260, 261, 262, 263, 264,
265, 260, 261, 262, 263, 264, 265, 261, 262, 263, 264, 265, 266,
261, 262, 263, 264, 265, 266, 267, 262, 263, 264, 265, 266, 267,
262, 263, 264, 265, 266, 267, 268, 263, 264, 265, 266, 267, 268,
263, 264, 265, 266, 267, 268, 269, 264, 265, 266, 267, 268, 269,
265, 266, 267, 268, 269, 270, 265, 266, 267, 268, 269, 270, 266,
267, 268, 269, 270, 271, 266, 267, 268, 269, 270, 271, 267, 268,
269, 270, 271, 272, 267, 268, 269, 270, 271, 272, 273, 268, 269,
270, 271, 272, 273, 268, 269, 270, 271, 272, 273, 274, 269, 270,
271, 272, 273, 274, 269, 270, 271, 272, 273, 274, 275, 270, 271,
272, 273, 274, 275, 270, 271, 272, 273, 274, 275, 276, 271, 272,
273, 274, 275, 276, 271, 272, 273, 274, 275, 276, 277, 272, 273,
274, 275, 276, 277, 273, 274, 275, 276, 277, 278, 273, 274, 275,
276, 277, 278, 273, 274, 275, 276, 277, 278, 279, 274, 275, 276,
277, 278, 279, 274, 275, 276, 277, 278, 279, 280, 275, 276, 277,
278, 279, 280, 275, 276, 277, 278, 279, 280, 281, 276, 277, 278,
279, 280, 281, 276, 277, 278, 279, 280, 281, 282, 277, 278, 279,
280, 281, 282, 278, 279, 280, 281, 282, 283, 278, 279, 280, 281,
282, 283, 279, 280, 281, 282, 283, 284, 279, 280, 281, 282, 283,
284, 279, 280, 281, 282, 283, 284, 285, 280, 281, 282, 283, 284,
285, 280, 281, 282, 283, 284, 285, 286, 281, 282, 283, 284, 285,
286, 281, 282, 283, 284, 285, 286, 287, 282, 283, 284, 285, 286,
287, 283, 284, 285, 286, 287, 288, 283, 284, 285, 286, 287, 288,
284, 285, 286, 287, 288, 289, 284, 285, 286, 287, 288, 289, 290,
285, 286, 287, 288, 289, 290, 286, 287, 288, 289, 290, 291, 286,
287, 288, 289, 290, 291, 292, 287, 288, 289, 290, 291, 292, 287,
288, 289, 290, 291, 292, 293, 288, 289, 290, 291, 292, 293, 289,
290, 291, 292, 293, 294, 289, 290, 291, 292, 293, 294, 295, 290,
291, 292, 293, 294, 295, 296, 291, 292, 293, 294, 295, 296, 297,
292, 293, 294, 295, 296, 297, 292, 293, 294, 295, 296, 297, 298,
293, 294, 295, 296, 297, 298, 299, 294, 295, 296, 297, 298, 299,
300, 294, 295, 296, 297, 298, 299, 300, 301, 295, 296, 297, 298,
299, 300, 301, 302, 296, 297, 298, 299, 300, 301, 302, 297, 298,
299, 300, 301, 302, 303, 298, 299, 300, 301, 302, 303, 304, 299,
300, 301, 302, 303, 304, 305, 300, 301, 302, 303, 304, 305, 306,
301, 302, 303, 304, 305, 306, 307, 302, 303, 304, 305])
To reproduce the image, this MWE should be enough, once you copy-paste the arrays as px and py into your editor
import numpy as np
plot_mtx = np.zeros( (5120,5120) )
px=...
py=...
window_size = max(px[-1]-px[0],[py[-1]-py[0]])
imshow(plot_mtx[min(px):min(px)+window_size,min(py):min(py)+window_size])
Essentially, these are two lines that each have a width of about 6 pixels. I would like to separate them into two distinct lines, so that I would have px_1,py_1 for the one running from top to down, and px_2,py_2 for the one running from left to right.
I've failed so far to find the right keywords to find such algorithms. What I would have in mind is a for loop, that starts at one extremity, to complete a list with pixel positions in such a way, that the direction in which the loop is progressing never exceeds a certain angle with respect to several previous steps. This way, the algorithm would always take the set of pixels that cross smoothly through the intersection. Then it's just a matter of removing the new found line from the data and starting again.
Would you have any better input ?
Any feedback appreciated
Skeletonize the image.
Split by the crossing point(it has more than 2 neighbours) - that gives you 4 segments.
Join similarly directed pairs together - you get 2 skeleton lines.
Assign original pixels to each of those lines by proximity threshold.

Categories