मैं एक नहीं बल्कि सुरुचिपूर्ण समाधान (IMHO) सोचा, तो मैं यह पोस्टिंग का विरोध नहीं कर सकते हैं:
from bisect import bisect_left
class Interpolate(object):
def __init__(self, x_list, y_list):
if any(y - x <= 0 for x, y in zip(x_list, x_list[1:])):
raise ValueError("x_list must be in strictly ascending order!")
x_list = self.x_list = map(float, x_list)
y_list = self.y_list = map(float, y_list)
intervals = zip(x_list, x_list[1:], y_list, y_list[1:])
self.slopes = [(y2 - y1)/(x2 - x1) for x1, x2, y1, y2 in intervals]
def __getitem__(self, x):
i = bisect_left(self.x_list, x) - 1
return self.y_list[i] + self.slopes[i] * (x - self.x_list[i])
मैं float
ताकि पूर्णांक प्रभाग (अजगर < = 2.7) के लिए नक्शे में लात नहीं होगा और अगर x1
, x2
, y1
और y2
कुछ इटर्वल के लिए सभी पूर्णांक हैं तो चीजें बर्बाद करें।
__getitem__
में मैं तथ्य यह है कि self.x_list को bisect_left
का उपयोग करके आरोही क्रम में सॉर्ट है का लाभ ले रहा हूँ (बहुत) जल्दी से सबसे बड़ा तत्व self.x_list
से छोटा x
के सूचकांक पाते हैं।
इस तरह वर्ग का उपयोग करें:
i = Interpolate([1, 2.5, 3.4, 5.8, 6], [2, 4, 5.8, 4.3, 4])
# Get the interpolated value at x = 4:
y = i[4]
मैं यहाँ सीमा की स्थिति से नहीं निपटा गया है, सादगी के लिए। जैसा कि है, i[x]
x < 1
के लिए काम करेगा जैसे कि (2.5, 4) से (1, 2) की रेखा को शून्य से अनंत तक बढ़ा दिया गया है, जबकि i[x]
x == 1
या x > 6
IndexError
बढ़ाएगा। सभी मामलों में इंडेक्स एरर बढ़ाने के लिए बेहतर होगा, लेकिन यह पाठक के लिए एक अभ्यास के रूप में छोड़ दिया गया है।:)
यह ... आसान नहीं है। आपने क्या प्रयास किया है – zellio
-1 बहुत सामान्य तरीके से। आप समझ नहीं पाते कि प्रोग्राम कैसे करें, या अजगर में एल्गोरिदम कैसे करें ?? – steabert
अच्छी तरह से एक नया शिक्षार्थी होने के नाते मैंने खुद को गहरे छोर में फेंक दिया है ताकि बोल सकें। मैं एल्गोरिदम में 'for' या 'if' कथन का उपयोग करने के बारे में सोच रहा था। तो एक्स की कई श्रेणियों के बीच। – Helpless