
SciPy (рд╕реНрдкрд╖реНрдЯ рд╕рд╛рдИ рдкрд╛рдИ) рдПрдХ рдЧрдгрд┐рддреАрдп рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдкреИрдХреЗрдЬ рд╣реИ рдЬреЛ рдирдореНрдкреА рдкрд╛рдпрдерди рд╡рд┐рд╕реНрддрд╛рд░ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдбреЗрдЯрд╛ рдХреЗ рдкреНрд░рдмрдВрдзрди рдФрд░ рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рд▓рд┐рдП рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рдХрдорд╛рдВрдб рдФрд░ рдХрдХреНрд╖рд╛рдПрдВ рдкреНрд░рджрд╛рди рдХрд░рдХреЗ рдкрд╛рдпрдерди рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддрд╛ рд╣реИред SciPy рдХреЗ рд╕рд╛рде, рдПрдХ рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ рдкрд╛рдпрдерди рд╕рддреНрд░ MATLAB, IDL, рдСрдХреНрдЯреЗрд╡, рдЖрд░-рд▓реИрдм рдФрд░ SciLab рдЬреИрд╕реА рдЬрдЯрд┐рд▓ рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рд╕рдВрдкреВрд░реНрдг рдбреЗрдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдФрд░ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдкрд┐рдВрдЧ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИред
рдкрд░рд┐рдЪрдп
SciPy рдкреИрдХреЗрдЬ рдХреЛ рдПрдирд╛рдХреЛрдВрдбрд╛ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЧрдИ рд╣реИред рдЕрдЬрдЧрд░ рдХреА рдореВрд▓ рдмрд╛рддреЗрдВ рдФрд░ рд╣рд╛рде рдкрд░ Numpy рдкреНрд░рд▓реЗрдЦрди рдХреЗ рд╕рд╛рде рдкрд░рд┐рдЪрд┐рдд рднреА рдЙрдЪрд┐рдд рд╣реИред рд╕рдВрдХреНрд╖рд┐рдкреНрддрддрд╛ рдФрд░ рдЖрдЧреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрд╕ рдмрд╛рдд рд╕реЗ рд╕рд╣рдордд рд╣реИрдВ рдХрд┐ рдореБрдЦреНрдп рдкреИрдХреЗрдЬ (numpy, scipy рдФрд░ matplotlib) рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдЖрдпрд╛рдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ:
import numpy as np import matplotlib as mpl import matplotlib.pyplot as plt
рдпрд╣ NumPy, SciPy рд╕реНрд░реЛрдд рдХреЛрдб рдФрд░ рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдЖрдпрд╛рдд рдЕрдиреБрдмрдВрдз рд╣реИред рдЖрдкрдХреЗ рдХреЛрдб рдореЗрдВ рдЗрди рд╕рдореНрдореЗрд▓рдиреЛрдВ рдХрд╛ рдЕрдиреБрдкрд╛рд▓рди рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрддреНрдпрдзрд┐рдХ рдЕрдиреБрд╢рдВрд╕рд┐рдд рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдкреИрдХреЗрдЬ рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдЕрд▓рдЧ рд╕реЗ рдЖрдпрд╛рдд рдХрд░рдирд╛ рдЙрдЪрд┐рдд рд╣реИ:
from scipy import linalg, optimize
SciPy рдФрд░ NumPy рдХреЗ рдкрд╛рд╕ рдкреНрд░рд▓реЗрдЦрди рдХреЗ рдкреВрд░реНрдг рд╕рдВрд╕реНрдХрд░рдг рд╣реИрдВ рдЬреЛ рдЙрдирдХреЗ рд▓рдЧрднрдЧ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░рддреЗ рд╣реИрдВред рд╡реЗ HTML рдФрд░ рдкреАрдбреАрдПрдл рдкреНрд░рд╛рд░реВрдк рдореЗрдВ https://docs.scipy.org/ рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИрдВред рдХреБрдЫ рд╣рд┐рд╕реНрд╕реЗ рдЕрдзреВрд░реЗ рдпрд╛ рдкреБрд░рд╛рдиреЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдкреНрд░рд▓реЗрдЦрди рд▓рдЧрд╛рддрд╛рд░ рд╡рд┐рдХрд╛рд╕ рдХреЗ рдЕрдзреАрди рд╣реИред рдЪреВрдВрдХрд┐ SciPy рдПрдХ рд╕реНрд╡рдпрдВрд╕реЗрд╡реА рд╕рдВрдЧрдарди рд╣реИ рдФрд░ рд╕рдореБрджрд╛рдп рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкреНрд░рд▓реЗрдЦрди рдФрд░ рдХреЛрдб рдореЗрдВ рд╕реБрдзрд╛рд░ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рд╕реЗ рд▓реЗрдХрд░ рдЖрдкрдХреА рднрд╛рдЧреАрджрд╛рд░реА рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ рдФрд░ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╡рд┐рд░рд▓ рдЧреНрд░рд╛рдлрд╝ рдПрд▓реНрдЧреЛрд░рд┐рджрдо (scipy.csgraph)

рд▓реБрдИрд╕ рдХреИрд░реЛрд▓, рдореЗрд░реА рдХреНрд░рд┐рд╕рдорд╕ 1877
рдХреНрд░рд┐рд╕рдорд╕ рджрд┐рд╡рд╕ 1877 рдкрд░ рд▓реБрдИрд╕ рдХреИрд░реЛрд▓ рджреНрд╡рд╛рд░рд╛ рдмрдЪреНрдЪреЛрдВ рдХреЗ рдЦреЗрд▓ " рд▓реИрдбрд░реНрд╕ рдСрдл рд╡рд░реНрдбреНрд╕ " рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ scipy.csgraph рдкреИрдХреЗрдЬ рдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдЗрд╕ рдЦреЗрд▓ рдореЗрдВ, рдЖрдкрдХреЛ рдПрдХ рдмрд╛рд░ рдореЗрдВ рдПрдХ рдЕрдХреНрд╖рд░ рдХреА рдЬрдЧрд╣, рд╢рдмреНрджреЛрдВ рдХреЗ рдмреАрдЪ рдХрд╛ рд░рд╛рд╕реНрддрд╛ рдЦреЛрдЬрдирд╛ рд╣реЛрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк "рдмрдВрджрд░" рдФрд░ "рдЖрджрдореА" рд╢рдмреНрджреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдХрд░ рдПрдХ рдмрдВрджрд░ рд╕реЗ рдПрдХ рд╡реНрдпрдХреНрддрд┐ рддрдХ рдХрд╛ рд░рд╛рд╕реНрддрд╛ рдЦреЛрдЬ рд╕рдХрддреЗ рд╣реИрдВ:
rmape apt ait ait рдХрд░рдиреЗрдХреЗрд▓рд┐рдПрдмрд┐рдЯ рдХрд░рдиреЗрдХреЗрд▓рд┐рдПрдмрдбрд╝рд╛ рдХрд░рдиреЗрдХреЗрд▓рд┐рдП "рдЖрджрдореА\"рдХрд░рдиреЗрдХреЗрд▓рд┐рдПрдмреИ
рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рдг рдореЗрдВ рд╢рдмреНрдж рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рдЕрдХреНрд╖рд░ рдмрджрд▓рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИред рдпрд╣ рдПрдХ рдмрдВрджрд░ рд╕реЗ рдПрдХ рдЖрджрдореА рдХреЗ рд▓рд┐рдП рд╕рд┐рд░реНрдл рдПрдХ рд╕рдВрднрд╡ рд░рд╛рд╕реНрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдпрд╣ рд╕рдмрд╕реЗ рдЫреЛрдЯрд╛ рд░рд╛рд╕реНрддрд╛ рд╣реИ? рдЗрд╕ рдкреНрд░рдХрд╛рд░, рджреЛ рджрд┐рдП рдЧрдП рд╢рдмреНрджреЛрдВ рдХреЗ рдмреАрдЪ рд╕рдмрд╕реЗ рдЫреЛрдЯрд╛ рд░рд╛рд╕реНрддрд╛ (рд╕реАрдврд╝реА) рдЦреЛрдЬрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдпрд╣ рд╕рдорд╕реНрдпрд╛ scipy.sparse.csgraph рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рд▓ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред
рдкрд╣рд▓реЗ рд╣рдореЗрдВ рдорд╛рдиреНрдп рд╢рдмреНрджреЛрдВ рдХреА рд╕реВрдЪреА рдЪрд╛рд╣рд┐рдПред рдХрдИ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдРрд╕реА рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕реВрдЪреА рд╣реЛрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд▓рд┐рдирдХреНрд╕ рдореЗрдВ, рд╢рдмреНрджреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рдорд┐рд▓ рд╕рдХрддреА рд╣реИ:
/usr/share/dict /var/lib/dict
рд╢рдмреНрджреЛрдВ рдХрд╛ рдПрдХ рдЕрдиреНрдп рд╕реНрд░реЛрдд рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рд╡рд┐рднрд┐рдиреНрди рд╕рд╛рдЗрдЯреЛрдВ рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИ (рдЕрдкрдиреЗ рдкрд╕рдВрджреАрджрд╛ рдЦреЛрдЬ рдЗрдВрдЬрди рдореЗрдВ рджреЗрдЦреЗрдВ)ред рд╕рд┐рд╕реНрдЯрдо рд╢рдмреНрдж рд╕реВрдЪреА рдкреНрд░рддрд┐ рдкрдВрдХреНрддрд┐ рдПрдХ рд╢рдмреНрдж рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝рд╛рдЗрд▓ рд╣реИред рд╕рд┐рд╕реНрдЯрдо рд╢рдмреНрдж рд╕реВрдЪреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕реЗ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдкрдврд╝рдирд╛ рд╣реЛрдЧрд╛:
word_list = open('/usr/share/dict/words').readlines() word_list = map(str.strip, word_list)
рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рддреАрди рдЕрдХреНрд╖рд░реЛрдВ рдХреЗ рд╢рдмреНрджреЛрдВ рдХреА рддрд▓рд╛рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдлрд┐рд░ рд╣рдо рд╕рд╛рдорд╛рдиреНрдп рд╕реВрдЪреА рд╕реЗ рдХреЗрд╡рд▓ рдЖрд╡рд╢реНрдпрдХ рд╢рдмреНрджреЛрдВ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВрдЧреЗред рд╣рдо рдЙрди рд╢рдмреНрджреЛрдВ рдХреЛ рднреА рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВ, рдЬреЛ рдЕрдкрд░рдХреЗрд╕ (рдЙрдЪрд┐рдд рд╕рдВрдЬреНрдЮрд╛) рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреЗ рд╣реИрдВ рдпрд╛ рдЗрд╕рдореЗрдВ рдЧреИрд░-рдЕрдХреНрд╖рд░ рд╡рд░реНрдг рд╣реЛрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдПрдкреЛрд╕реНрдЯреНрд░реЛрдл рдФрд░ рд╣рд╛рдЗрдлрд╝рдиред рдЕрдВрдд рдореЗрдВ, рд╢рдмреНрджреЛрдВ рдХреА рдкрд░рд┐рдгрд╛рдореА рд╕реВрдЪреА рдХреЗ рдЖрдХрд╛рд░ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВред
word_list = [word for word in word_list if len(word) == 3] word_list = [word for word in word_list if word[0].islower()] word_list = [word for word in word_list if word.isalpha()] word_list = list (map (str.lower, word_list)) len (word_list)
591
рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ 591 рддреАрди-рдЕрдХреНрд╖рд░ рд╢рдмреНрджреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИ (рд╕рдЯреАрдХ рд╕рдВрдЦреНрдпрд╛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкреНрд░рдпреБрдХреНрдд рд╢рдмреНрджрдХреЛрд╢ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддреА рд╣реИ)ред рдЗрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рд╢рдмреНрдж рдЧреНрд░рд╛рдл рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд╣реИред рдХрд┐рдирд╛рд░реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рдирд╛рд░реЛрдВ рдХреЛ рдмрдирд╛рдПрдВ (рд╢рдмреНрджреЛрдВ рдХреЗ рдЬреЛрдбрд╝реЗ) рдЬреЛ рдХреЗрд╡рд▓ рдПрдХ рдЕрдХреНрд╖рд░ рд╕реЗ рднрд┐рдиреНрди рд╣реЛрддреЗ рд╣реИрдВред
рд╣рдо рдПрдХ рдХрд╛рдлреА рдХреБрд╢рд▓ рддрд░реАрдХреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдЦрд╛рдВрдЪреЗ рдХреЗ рдХреБрдЫ рд╣реЗрд░рдлреЗрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:
word_list = np.asarray(word_list) word_list.sort()
dtype('<U3')
рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕рд░рдгреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдореЗрдВ рддреАрди рдпреВрдирд┐рдХреЛрдб рд╡рд░реНрдг рд╣реИрдВред рд╣рдо рдЙрди рд╕рднреА рдЬреЛрдбрд╝рд┐рдпреЛрдВ рдХреЛ рдЦреЛрдЬрдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рдПрдХ рд╣реА рдЪрд░рд┐рддреНрд░ рд╣реЛред рдЖрдЗрдП рдкреНрд░рддреНрдпреЗрдХ рд╢рдмреНрдж рдХреЛ рддреНрд░рд┐-рдЖрдпрд╛рдореА рд╡реЗрдХреНрдЯрд░ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд░реЗрдВ:
word_bytes = np.ndarray((word_list.size, word_list.itemsize), dtype='uint8', buffer=word_list.data)
(591, 3)
рд╣рдореЗрдВ рдпрд╛рдж рд╣реИ рдХрд┐ рд╣реИрдорд┐рдВрдЧ рджреВрд░реА рдПрдХ рд╣реА рд▓рдВрдмрд╛рдИ рдХреЗ рджреЛ рд╡реИрдХреНрдЯрд░ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдкрд╛рддреНрд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИред рд╣рдорд┐рдВрдЧ рджреВрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рд╢рдмреНрджреЛрдВ рдХреЗ рдЬреЛрдбрд╝реЗ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рдирд╛рд░реЛрдВ рдХреА рд▓рдВрдмрд╛рдИ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд╣рд░ рджреЛ рд╢рдмреНрдж рд╕рдорд╛рди рджреВрд░реА рдХреЗ рд╕рд╛рде рд╢рдмреНрджреЛрдВ рдХреА рд╕реАрдврд╝реА рд╕реЗ рдЬреБрдбрд╝реЗ рд╣реЛрддреЗ рд╣реИрдВ frac1N рдЬрд╣рд╛рдБ рдПрди=3 - рдПрдХ рд╢рдмреНрдж рдореЗрдВ рдЕрдХреНрд╖рд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛:
from scipy.spatial.distance import pdist, squareform from scipy.sparse import csr_matrix hamming_dist = pdist (word_bytes, metric = 'hamming') graph = csr_matrix (squareform (hamming_dist < 1.5 / 3))
рджреВрд░реА рдХреА рддреБрд▓рдирд╛ рдХрд░рддреЗ рд╕рдордп, рдЧреИрд░-рд╕рдЦреНрдд рд╕рдорд╛рдирддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдиреНрдпрдерд╛ рдкрд░рд┐рдгрд╛рдо рдЕрд╕реНрдерд╛рдпреА рдмрд┐рдВрджреБ рдорд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд╕реНрдерд┐рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рд╢рдмреНрдж рдореЗрдВ рджреЛ рдЕрдХреНрд╖рд░ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддреЗ рд╣реИрдВ, рддреЛ рдЕрд╕рдорд╛рдирддрд╛ рд╡рд╛рдВрдЫрд┐рдд рдкрд░рд┐рдгрд╛рдо рджреЗрддреА рд╣реИред рдЕрдм рдЬрдм рдЧреНрд░рд╛рдл рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рд╣рдо рдЧреНрд░рд╛рдлрд╝ рдкрд░ рдХрд┐рд╕реА рднреА рджреЛ рд╢рдмреНрджреЛрдВ рдХреЗ рдмреАрдЪ рд╕рдмрд╕реЗ рдЫреЛрдЯреА рдкрде рдЦреЛрдЬ рдХрд░реЗрдВрдЧреЗ:
i1 = word_list.searchsorted ('ape') i2 = word_list.searchsorted ('man')
рдЕрдм рдЖрдкрдХреЛ рдЧреНрд░рд╛рдлрд╝ рдкрд░ рдЗрди рджреЛ рдХреЛрдиреЗ рдХреЗ рдмреАрдЪ рд╕рдмрд╕реЗ рдЫреЛрдЯрд╛ рд░рд╛рд╕реНрддрд╛ рдЦреЛрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рджрд┐рдХреНрдЬрд╕реНрдЯреНрд░рд╛ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдЖрдкрдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╢реАрд░реНрд╖ рдХреЗ рд▓рд┐рдП рд╕рднреА рд╕рдВрднрд╡ рджреВрд░реА рдЦреЛрдЬрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:
from scipy.sparse.csgraph import dijkstra distances, predecessors = dijkstra(graph, indices=i1, return_predecessors=True) print(distances[i2])
5.0
рдЗрд╕рд▓рд┐рдП, рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рдмрдВрджрд░ рдФрд░ рдЖрджрдореА рдХреЗ рдмреАрдЪ рдХрд╛ рд╕рдмрд╕реЗ рдЫреЛрдЯрд╛ рд░рд╛рд╕реНрддрд╛ рдХреЗрд╡рд▓ рдкрд╛рдБрдЪ рдЪрд░рдгреЛрдВ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рдкрде рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо рдПрд▓реНрдЧреЛрд░рд┐рдердо рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рдкреВрд░реНрд╡рд╡рд░реНрддрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
path = [] i = i2 while i != i1: path.append(word_list[i]) i = predecessors[i] path.append(word_list[i1]) print(path[::-1])
['ape', 'apt', 'opt', 'oat', 'mat', 'man']
рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЙрджрд╛рд╣рд░рдг рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕реАрдврд╝рд┐рдпреЛрдВ рдХреА рд▓рдВрдмрд╛рдИ рддреАрди рдХрджрдо рдХрдо рд╣реИред рдореЙрдбреНрдпреВрд▓ рдХреЗ рдЕрдиреНрдп рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдЕрдиреНрдп рд╕рд╡рд╛рд▓реЛрдВ рдХреЗ рдЬрд╡рд╛рдм рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреНрдпрд╛ рддреАрди рдЕрдХреНрд╖рд░ рд╡рд╛рд▓реЗ рд╢рдмреНрдж рд╣реИрдВ рдЬреЛ рд╢рдмреНрджреЛрдВ рдХреА рд╕реАрдврд╝реА рд╕реЗ рдЬреБрдбрд╝реЗ рдирд╣реАрдВ рд╣реИрдВ? рдпрд╣ рдПрдХ рдЧреНрд░рд╛рдл рдХреА рдХрдиреЗрдХреНрдЯрд┐рд╡рд┐рдЯреА рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рд╣реИ:
from scipy.sparse.csgraph import connected_components N_components, component_list = connected_components(graph) print(N_components)
15
рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рддреАрди-рдЕрдХреНрд╖рд░ рдХреЗ рд╢рдмреНрджреЛрдВ рдХреЗ рд▓рд┐рдП, 15 рд╕рдВрдмрдВрдзрд┐рдд рдШрдЯрдХ рд╣реИрдВ: рдЕрд░реНрдерд╛рдд, 15 рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╢рдмреНрдж рдЬрд┐рдирдХреЗ рдмреАрдЪ рдХреЛрдИ рдкрде рдирд╣реАрдВ рд╣реИред рдЗрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрдЯ рдореЗрдВ рдХрд┐рддрдиреЗ рд╢рдмреНрдж рд╣реИрдВ? рд╣рдо рдШрдЯрдХреЛрдВ рдХреА рд╕реВрдЪреА рд╕реЗ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ:
[np.sum(component_list == i) for i in range(N_components)]
[577, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
рд╣рдореЗрдВ рдПрдХ рдмрдбрд╝рд╛ рдЧреНрд░рд╛рдл рдорд┐рд▓рд╛, рдЬрд┐рд╕рдореЗрдВ 577 рдХреЛрдиреЗ рдФрд░ рд╕рд╛рде рд╣реА 14 рдЕрд▓рдЧ-рдЕрд▓рдЧ рд░реЗрдЦрд╛рдВрдХрди рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЖрдЗрдП рдЗрди рд╢рдмреНрджреЛрдВ рдХреЛ рджреЗрдЦреЗрдВ:
[list(word_list[np.where(component_list == i)]) for i in range(1, N_components)]
[['aha'], ['chi'], ['ebb'], ['gnu'], ['ism'], ['khz'], ['nth'], ['n├йe'], ['ova'], ['qua'], ['ugh'], ['ups'], ['urn'], ['use']]
рдЖрдк рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рди рд╢рдмреНрджреЛрдВ рдХреЗ рдмреАрдЪ рдЕрдзрд┐рдХрддрдо рд▓рдВрдмрд╛рдИ рдХреА рд╕реАрдврд╝реА рд╣реИред рдпрд╣ рдЖрд╕рдиреНрди рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреА рдЧрдгрдирд╛ рдХрд░рдХреЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рджреЛ рдЕрд╕рдВрдмрджреНрдз рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдмреАрдЪ рдХреА рджреВрд░реА рдХреЛ рдЕрдирдВрдд рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдмрд╛рд╣рд░ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:
distances, predecessors = dijkstra(graph, return_predecessors=True) max_distance = np.max(distances[~np.isinf(distances)]) print(max_distance)
13.0
рддреЛ, рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╢рдмреНрджреЛрдВ рдХреЗ рдРрд╕реЗ рдЬреЛрдбрд╝реЗ рд╣реИрдВ, рдЬрд┐рдирдХреЗ рдмреАрдЪ рд╕рдмрд╕реЗ рдЫреЛрдЯреА рд╕реАрдврд╝реА рдореЗрдВ 13 рдЪрд░рдг рд╣реИрдВ! рдЖрдЗрдП рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ рдХрд┐ рдпреЗ рдЬреЛрдбрд╝реЗ рдХреНрдпрд╛ рд╣реИрдВ:
i1, i2 = np.where(distances == max_distance) list(zip(word_list[i1], word_list[i2]))
[('imp', 'ohm'), ('imp', 'ohs'), ('ohm', 'imp'), ('ohm', 'ump'), ('ohs', 'imp'), ('ohs', 'ump'), ('ump', 'ohm'), ('ump', 'ohs')]
рд╣рдордиреЗ рд╢рдмреНрджреЛрдВ рдХреЗ рдЬреЛрдбрд╝реЗ рдХреЗ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдВрдпреЛрдЬрдиреЛрдВ рдХреЛ рджреЗрдЦрд╛, рдЬрд┐рдирдХреЗ рдмреАрдЪ рдХреА рджреВрд░реА 13 рд╣реИ (рдЕрдзрд┐рдХрддрдо рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рдЕрд▓рдЧ)ред рдпрджрд┐ рдЖрдк рдмрд╛рд░реАрдХреА рд╕реЗ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рд╕реАрдврд╝рд┐рдпреЛрдВ рдХреЗ рдПрдХ рддрд░рдл "рдЫреЛрдЯрд╛" рдФрд░ "рдЕрдВрдк" рд╢рдмреНрдж рд╣реИрдВ, рдЬреЛ рдХреЗрд╡рд▓ рдПрдХ рдЕрдХреНрд╖рд░ рдХреЗ рд╕рд╛рде рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рднрд┐рдиреНрди рд╣реЛрддреЗ рд╣реИрдВред рд╕реАрдврд╝рд┐рдпреЛрдВ рдХреЗ рджреВрд╕рд░реА рддрд░рдл "рдУрдо" рдФрд░ "рдУрд╣реНрд╕" рд╢рдмреНрдж рд╣реИрдВ, рдЬреЛ рдХрд┐ рдХреЗрд╡рд▓ рдПрдХ рдЕрдХреНрд╖рд░ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╖реНрдард┐рдд рд╣реИрдВред рдЗрди рд╢рдмреНрджреЛрдВ рдХреЗ рдмреАрдЪ рдЪрд░рдгреЛрдВ рдХреА рд╕реВрдЪреА рд▓рдЧрднрдЧ рд╕рдорд╛рди рд╣реЛрдЧреАред рдпрд╣ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
path = [] i = i2[0] while i != i1[0]: path.append(word_list[i]) i = predecessors[i1[0], i] path.append(word_list[i1[0]]) print(path[::-1])
['imp', 'amp', 'asp', 'ass', 'ads', 'ids', 'ins', 'inn', 'ion', 'won', 'woo', 'who', 'oho', 'ohm']
рд╕реНрдХреИрдкреА рдореЗрдВ рд╡рд┐рд░рд▓ рдЧреНрд░рд╛рдлрд╝ рдкрд░ рд╢рдмреНрдж рд╕реАрдврд╝рд┐рдпрд╛рдБ рддреЗрдЬрд╝ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рдЙрдкрдпреЛрдЧреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИрдВред рдЧреНрд░рд╛рдл рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдЧрдгрд┐рдд, рдбреЗрдЯрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдФрд░ рдорд╢реАрди рд╕реАрдЦрдиреЗ рдХреЗ рдХрдИ рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХрд╛рд░реНрдпреЛрдВ рдХреА рдПрдХ рд╡рд┐рд╕реНрддреГрдд рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдХреИрдкреА рд╡рд┐рд░рд▓ рдЧреНрд░рд╛рдл рдЙрдкрдХрд░рдг рдХрд╛рдлреА рд▓рдЪреАрд▓реЗ рд╣реЛрддреЗ рд╣реИрдВред
рдореБрдЭреЗ рдЦреБрд╢реА рд╣реЛрдЧреА рдпрджрд┐ рдЖрдк рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдХрд┐ рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдбрд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреМрди рд╕рд╛ рдЦрдВрдб рдкрдврд╝рдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛ред