পূর্ববর্তী শূন্যের দূরত্ব নির্ধারণ করতে আপনি প্রতিটি পজিশনের সূচক এবং শূন্য পজিশনের ক্রমবর্ধমান সর্বোচ্চের মধ্যে পার্থক্যটি ব্যবহার করতে পারেন। এটি এগিয়ে এবং পিছনে করা যেতে পারে। পূর্ববর্তী (বা পরবর্তী) শূন্যের অগ্রগামী এবং পিছনের দূরত্বের মধ্যে ন্যূনতমটি নিকটতম হবে:
import numpy as np
indices = np.arange(x.size)
zeroes = x==0
forward = indices - np.maximum.accumulate(indices*zeroes) # forward distance
forward[np.cumsum(zeroes)==0] = x.size-1 # handle absence of zero from edge
forward = forward * (x!=0) # set zero positions to zero
zeroes = zeroes[::-1]
backward = indices - np.maximum.accumulate(indices*zeroes) # backward distance
backward[np.cumsum(zeroes)==0] = x.size-1 # handle absence of zero from edge
backward = backward[::-1] * (x!=0) # set zero positions to zero
distZero = np.minimum(forward,backward) # closest distance (minimum)
ফলাফল:
distZero
# [0, 1, 1, 0, 1, 2, 2, 1, 0, 0]
forward
# [0, 1, 2, 0, 1, 2, 3, 4, 0, 0]
backward
# [0, 2, 1, 0, 4, 3, 2, 1, 0, 0]
বাইরের প্রান্তগুলিতে কোনও শূন্য উপস্থিত না থাকায় বিশেষ ক্ষেত্রে:
x = np.array([3, 1, 2, 0, 4, 5, 6, 0,8,8])
forward: [9 9 9 0 1 2 3 0 1 2]
backward: [3 2 1 0 3 2 1 0 9 9]
distZero: [3 2 1 0 1 2 1 0 1 2]
কোনও শূন্যের সাথেও কাজ করে না
[সম্পাদনা] নন-অলস সমাধান ...
যদি আপনি কোনও ও (এন) সমাধানের সন্ধান করেন যা নিম্পের প্রয়োজন হয় না, তবে আপনি এই কৌশলটি ইতরলগুলি থেকে জমা হওয়া ফাংশনটি ব্যবহার করে প্রয়োগ করতে পারেন:
x = [0, 1, 2, 0, 4, 5, 6, 7, 0, 0]
from itertools import accumulate
maxDist = len(x) - 1
zeroes = [maxDist*(v!=0) for v in x]
forward = [*accumulate(zeroes,lambda d,v:min(maxDist,(d+1)*(v!=0)))]
backward = accumulate(zeroes[::-1],lambda d,v:min(maxDist,(d+1)*(v!=0)))
backward = [*backward][::-1]
distZero = [min(f,b) for f,b in zip(forward,backward)]
print("x",x)
print("f",forward)
print("b",backward)
print("d",distZero)
আউটপুট:
x [0, 1, 2, 0, 4, 5, 6, 7, 0, 0]
f [0, 1, 2, 0, 1, 2, 3, 4, 0, 0]
b [0, 2, 1, 0, 4, 3, 2, 1, 0, 0]
d [0, 1, 1, 0, 1, 2, 2, 1, 0, 0]
আপনি যদি কোনও লাইব্রেরি ব্যবহার করতে না চান তবে আপনি একটি লুপে ম্যানুয়ালি দূরত্বগুলি সংগ্রহ করতে পারেন:
x = [0, 1, 2, 0, 4, 5, 6, 7, 0, 0]
forward,backward = [],[]
fDist = bDist = maxDist = len(x)-1
for f,b in zip(x,reversed(x)):
fDist = min(maxDist,(fDist+1)*(f!=0))
forward.append(fDist)
bDist = min(maxDist,(bDist+1)*(b!=0))
backward.append(bDist)
backward = backward[::-1]
distZero = [min(f,b) for f,b in zip(forward,backward)]
print("x",x)
print("f",forward)
print("b",backward)
print("d",distZero)
আউটপুট:
x [0, 1, 2, 0, 4, 5, 6, 7, 0, 0]
f [0, 1, 2, 0, 1, 2, 3, 4, 0, 0]
b [0, 2, 1, 0, 4, 3, 2, 1, 0, 0]
d [0, 1, 1, 0, 1, 2, 2, 1, 0, 0]