Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import numpy as np
- # --- version 1 ---
- def np_min_distance(data, val1, val2):
- pos1 = np.where(data == val1)
- pos2 = np.where(data == val2)
- dist = 0
- for x in pos1[0]:
- for y in pos2[0]:
- d = abs(x-y)
- if dist == 0 or d < dist:
- dist = d
- return dist
- data = np.array([1, 5, 3, 7, 2, 8, 3, 4, 5, 9, 9, 3, 1, 3, 2, 9])
- print( '4, 7 -> 4', np_min_distance(data, 4, 7) == 4 )
- print('---')
- print( '9, 3 -> 1', np_min_distance(data, 9, 3) == 1 )
- print('---')
- data = np.array([4, 4, 4, 4, 7, 7, 7, 7, 4, 4])
- print( '4, 7 -> 1', np_min_distance(data, 4, 7) == 1 )
- print('---')
- print('------------------------------------------------')
- # --- version 2 ---
- def min_distance(data, val1, val2):
- pos1 = None
- pos2 = None
- dist = 0 # or some big value
- previous = None
- for pos, item in enumerate(data):
- if item == val1:
- pos1 = pos
- if pos1 and pos2 and previous != val1: # if `pos1` and `post2` is not `None` then `previous` can't be `None` so I don't have to check if `previous is not None`
- d = abs(pos1 - pos2)
- print('pos:', pos1, pos2, '->', d)
- if dist == 0 or d < dist:
- dist = d
- #if dist == 1:
- # return 1
- previous = val1
- elif item == val2:
- pos2 = pos
- if pos1 and pos2 and previous != val2:
- d = abs(pos1 - pos2)
- print('pos:', pos1, pos2, '->', d)
- if dist == 0 or d < dist:
- dist = d
- #if dist == 1:
- # return 1
- previous = val2
- #print('result:', dist)
- return dist # zero means no found
- data = [1, 5, 3, 7, 2, 8, 3, 4, 5, 9, 9, 3, 1, 3, 2, 9]
- print( '4, 7 -> 4', min_distance(data, 4, 7) == 4 )
- print('---')
- print( '9, 3 -> 1', min_distance(data, 9, 3) == 1 )
- print('---')
- data = [4, 4, 4, 4, 7, 7, 7, 7, 4, 4]
- print( '4, 7 -> 1', min_distance(data, 4, 7) == 1 )
- print('---')
- print( '9, 3 -> 0', min_distance(data, 9, 3) == 0 )
- print('---')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement