আমি কীভাবে স্কিপি ব্যবহার করে দ্বিমাত্রিক ইন্টারপোলেশন সম্পাদন করতে পারি?


105

এই প্রশ্নোত্তরটি স্কিপি ব্যবহার করে দ্বি-মাত্রিক (এবং বহু-মাত্রিক) দ্বিখণ্ডিত সম্পর্কিত একটি ক্যানোনিকাল (-ish) হিসাবে উদ্দিষ্ট। বিভিন্ন বহুমাত্রিক ইন্টারপোলেশন পদ্ধতির বেসিক সিনট্যাক্স সম্পর্কে প্রায়শই প্রশ্ন থাকে, আমি এগুলিও সরাসরি সেট করার আশা করি।

আমি বিক্ষিপ্ত দ্বি-মাত্রিক ডাটা পয়েন্টের একটি সেট আছে, এবং আমি, একটা চমৎকার পৃষ্ঠ হিসাবে তাদের চক্রান্ত বাঞ্ছনীয় ভালো কিছু ব্যবহার চাই contourfবা plot_surfaceমধ্যে matplotlib.pyplot। আমি কীভাবে স্কিপি ব্যবহার করে আমার দ্বিমাত্রিক বা বহুমাত্রিক ডেটা একটি জালকে সংযুক্ত করতে পারি?

আমি পেয়েছি scipy.interpolateউপ-প্যাকেজ, কিন্তু আমি যখন ব্যবহার ত্রুটি পাওয়া চালিয়ে interp2dবা bisplrepবা griddataবা rbf। এই পদ্ধতির সঠিক বাক্য গঠন কী?

উত্তর:


163

দাবি অস্বীকার: আমি বেশিরভাগ ক্ষেত্রে এই পোস্টটি সিন্টেক্সটিকাল বিবেচনার সাথে এবং সাধারণ আচরণের কথা মাথায় রেখে লিখছি। আমি বর্ণিত পদ্ধতিগুলির মেমরি এবং সিপিইউ দিকটির সাথে পরিচিত নই এবং আমি এই উত্তরটি তাদের কাছে লক্ষ্য রেখেছি যার কাছে যুক্তিসঙ্গতভাবে ছোট ছোট ডেটা রয়েছে, যেমন ইন্টারপোলেশনের গুণটি বিবেচনা করার মূল দিক হতে পারে। আমি সচেতন যে খুব বড় ডেটা সেটগুলির সাথে কাজ করার সময়, আরও ভাল-সম্পাদন করার পদ্ধতিগুলি (যথা griddataএবং Rbf) সম্ভবত ব্যবহার্য হবে না।

আমি তিন ধরণের বহু-মাত্রিক ইন্টারপোলেশন পদ্ধতিগুলির তুলনা করতে যাচ্ছি (interp2d / স্প্লিংস griddataএবং Rbf) । আমি এগুলিকে দুই ধরণের ইন্টারপোলেশন টাস্ক এবং দুই ধরণের অন্তর্নিহিত ফাংশন (পয়েন্টগুলি যা থেকে ইন্টারপোল্ট করতে হবে) এর অধীন করব। সুনির্দিষ্ট উদাহরণগুলি দ্বি-মাত্রিক ইন্টারপোলেশন প্রদর্শন করবে, তবে কার্যকর পদ্ধতিগুলি স্বেচ্ছাচারী মাত্রায় প্রযোজ্য। প্রতিটি পদ্ধতি বিভিন্ন ধরণের বিরক্তি সরবরাহ করে; সব ক্ষেত্রেই আমি ঘনক্ষেত্রবৃত্ত (বা 1 এর কাছাকাছি কিছু ) ব্যবহার করব। এটি লক্ষণীয় গুরুত্বপূর্ণ যে আপনি যখনই প্রক্ষিপ্ত ব্যবহার করেন তখন আপনি আপনার কাঁচা ডেটার তুলনায় পক্ষপাত প্রবর্তন করেন এবং ব্যবহৃত নির্দিষ্ট পদ্ধতিগুলি আপনি যে শিল্পকর্মগুলি দিয়ে শেষ করবেন তা প্রভাবিত করে। সর্বদা এটি সম্পর্কে সচেতন থাকুন, এবং দায়িত্ববহুলভাবে বিযুক্ত করুন।

দুটি অন্তরোলনের কাজ হবে

  1. আপসাম্পলিং (ইনপুট ডেটা একটি আয়তক্ষেত্রাকার গ্রিডে রয়েছে, আউটপুট ডেটা একটি ঘনক গ্রিডে থাকে)
  2. নিয়মিত গ্রিডে ছড়িয়ে ছিটিয়ে থাকা ডেটার বিভাজন

দুটি ফাংশন (ডোমেনের ওপরে [x,y] in [-1,1]x[-1,1] ) হবে

  1. একটি মসৃণ এবং বন্ধুত্বপূর্ণ ফাংশন: cos(pi*x)*sin(pi*y) ; পরিসীমা মধ্যে[-1, 1]
  2. একটি মন্দ (এবং বিশেষত, অ-অবিচ্ছিন্ন) ফাংশন: x*y/(x^2+y^2) মূলটির কাছাকাছি 0.5 মান সহ; পরিসীমা মধ্যে[-0.5, 0.5]

তারা দেখতে কেমন তা এখানে:

চিত্র 1: পরীক্ষা ফাংশন

এই চারটি পরীক্ষার অধীনে তিনটি পদ্ধতি কীভাবে আচরণ করে তা আমি প্রথমে প্রদর্শন করব, তারপরে আমি তিনটিটির বাক্য গঠনটি বিশদ করব। কোনও পদ্ধতি থেকে আপনার কী আশা করা উচিত তা যদি আপনি জানেন তবে আপনি এটির বাক্য গঠন (আপনার দিকে তাকিয়ে interp2d) শিখতে আপনার সময় নষ্ট করতে নাও চান ।

পরীক্ষার ডেটা

বর্ণনাকারীর স্বার্থে, এখানে কোডটি দিয়েছি যা দিয়ে আমি ইনপুট ডেটা তৈরি করেছি। যদিও এই নির্দিষ্ট ক্ষেত্রে আমি ডেটা অন্তর্নিহিত ফাংশন সম্পর্কে স্পষ্টভাবে অবগত, আমি কেবল এটি ঘূর্ণন পদ্ধতির জন্য ইনপুট উত্পন্ন করতে ব্যবহার করব। আমি সুবিধার্থে (এবং বেশিরভাগই ডেটা উত্পন্ন করার জন্য) অদ্ভুত ব্যবহার করি, তবে একা স্কিপিও যথেষ্ট।

import numpy as np
import scipy.interpolate as interp

# auxiliary function for mesh generation
def gimme_mesh(n):
    minval = -1
    maxval =  1
    # produce an asymmetric shape in order to catch issues with transpositions
    return np.meshgrid(np.linspace(minval,maxval,n), np.linspace(minval,maxval,n+1))

# set up underlying test functions, vectorized
def fun_smooth(x, y):
    return np.cos(np.pi*x)*np.sin(np.pi*y)

def fun_evil(x, y):
    # watch out for singular origin; function has no unique limit there
    return np.where(x**2+y**2>1e-10, x*y/(x**2+y**2), 0.5)

# sparse input mesh, 6x7 in shape
N_sparse = 6
x_sparse,y_sparse = gimme_mesh(N_sparse)
z_sparse_smooth = fun_smooth(x_sparse, y_sparse)
z_sparse_evil = fun_evil(x_sparse, y_sparse)

# scattered input points, 10^2 altogether (shape (100,))
N_scattered = 10
x_scattered,y_scattered = np.random.rand(2,N_scattered**2)*2 - 1
z_scattered_smooth = fun_smooth(x_scattered, y_scattered)
z_scattered_evil = fun_evil(x_scattered, y_scattered)

# dense output mesh, 20x21 in shape
N_dense = 20
x_dense,y_dense = gimme_mesh(N_dense)

মসৃণ ফাংশন এবং upsampling

আসুন সহজতম কাজটি দিয়ে শুরু করি। এখানে কিভাবে আকৃতি একটি জাল থেকে একটি upsampling [6,7]এক [20,21]মসৃণ পরীক্ষা ফাংশন জন্য কাজ:

ডুমুর 2: মসৃণ upsampling

যদিও এটি একটি সহজ কাজ, ইতিমধ্যে আউটপুটগুলির মধ্যে সূক্ষ্ম পার্থক্য রয়েছে। প্রথম নজরে তিনটি ফলাফলই যুক্তিসঙ্গত। অন্তর্নিহিত ফাংশন সম্পর্কে আমাদের পূর্ব জ্ঞানের উপর ভিত্তি করে দুটি বৈশিষ্ট্য লক্ষণীয় রয়েছে: মধ্যম ক্ষেত্রেটি griddataডেটাটিকে সবচেয়ে বেশি বিকৃত করে। y==-1প্লটের সীমানা নোট করুন ( xলেবেলের নিকটতম ): ফাংশনটি কঠোরভাবে শূন্য হওয়া উচিত (যেহেতু y==-1মসৃণ ফাংশনের জন্য নোডাল লাইন), তবে এটি ক্ষেত্রে এটি নয় griddatax==-1প্লটের সীমানাটিও লক্ষ্য করুন (পিছনে, বাম দিকে): অন্তর্নিহিত ফাংশনটিতে একটি স্থানীয় সর্বাধিক (সীমানার কাছে শূন্য গ্রেডিয়েন্ট বোঝানো হয়) রয়েছে [-1, -0.5], তবুও griddataআউটপুটটি এই অঞ্চলে স্পষ্টতই শূন্য-বিন্দুতে দেখায়। প্রভাবটি সূক্ষ্ম, তবে এটি কোনও পক্ষপাতিত্ব কম নয়। (এর বিশ্বস্ততাRbfডাবডড রেডিয়াল ফাংশনগুলির ডিফল্ট পছন্দের সাথে আরও ভাল multiquadratic)

অশুভ ফাংশন এবং upsampling

আমাদের দুষ্ট কাজটি সম্পর্কে নমুনা প্রদর্শন করা কিছুটা কঠিন কাজ:

fig3: মন্দ উত্সাহ

তিনটি পদ্ধতির মধ্যে স্পষ্ট পার্থক্য দেখাতে শুরু করেছে। পৃষ্ঠের প্লটগুলির দিকে তাকালে, আউটপুট থেকে স্পষ্ট উদ্দীপনা অতিরিক্ত দেখা যাচ্ছে interp2d(প্লট করা পৃষ্ঠের ডানদিকে দুটি হ্যাম্প নোট করুন)। যদিও griddataএবং Rbfএক নজরে অনুরূপ ফল বলে মনে হচ্ছে, পরেরটির একটি গভীর ন্যূনতম উত্পাদন করতে কাছাকাছি বলে মনে হয় [0.4, -0.4]যে অন্তর্নিহিত ফাংশন থেকে অনুপস্থিত।

তবে এর মধ্যে একটি গুরুত্বপূর্ণ দিক রয়েছে যার Rbfমধ্যে অনেক বেশি উন্নত: এটি অন্তর্নিহিত ফাংশনের প্রতিসাম্যকে সম্মান করে (এটি অবশ্যই নমুনা জালের প্রতিসারণ দ্বারা সম্ভব হয়েছিল)। থেকে প্রাপ্ত আউটপুট griddataনমুনা পয়েন্টগুলির প্রতিসাম্যতা ভেঙে দেয়, যা ইতিমধ্যে মসৃণ ক্ষেত্রে দুর্বলভাবে দৃশ্যমান।

মসৃণ ফাংশন এবং বিক্ষিপ্ত ডেটা

প্রায়শই একজন ছড়িয়ে ছিটিয়ে থাকা ডেটাতে ইন্টারপোলেশন করতে চায়। এই কারণে আমি আশা করি এই পরীক্ষাগুলি আরও গুরুত্বপূর্ণ হবে। উপরে প্রদর্শিত হিসাবে, নমুনা পয়েন্টগুলি আগ্রহের ডোমেনে সিউডো-অভিন্নভাবে বেছে নেওয়া হয়েছিল। বাস্তব পরিস্থিতির মধ্যে আপনার প্রতিটি পরিমাপের সাথে অতিরিক্ত শব্দ হতে পারে এবং আপনার কাঁচা ডেটা শুরু হওয়ার সাথে সাথে এটি বিভক্ত করা কোনও অর্থবোধ করে কিনা তা আপনার বিবেচনা করা উচিত।

মসৃণ ফাংশনের জন্য আউটপুট:

ডুমুর 4: মসৃণ ছড়িয়ে ছিটিয়ে থাকা

ইতিমধ্যে সেখানে ইতিমধ্যে কিছুটা হরর শো চলছে। আমি প্লট করার জন্য একচেটিয়াভাবে interp2dমধ্যে থেকে আউটপুটটি ক্লিপ করেছিলাম [-1, 1], যাতে কমপক্ষে ন্যূনতম পরিমাণে তথ্য সংরক্ষণ করা যায়। এটি পরিষ্কার যে অন্তর্নিহিত কিছু আকৃতি উপস্থিত থাকাকালীন এমন বিশাল শোরগোল অঞ্চল রয়েছে যেখানে পদ্ধতিটি সম্পূর্ণভাবে ভেঙে যায়। দ্বিতীয় griddataকেসটি আকারটি মোটামুটি সুন্দরভাবে প্রজনন করে তবে কনট্যুর প্লটের সীমান্তে সাদা অঞ্চলগুলি লক্ষ্য করুন। এটি griddataকেবলমাত্র ইনপুট ডেটার পয়েন্টগুলির উত্তল হলের অভ্যন্তরে কাজ করার কারণে ঘটে (অন্য কথায়, এটি কোনও এক্সট্রোপোলেশন সম্পাদন করে না )। উত্তল হলের বাইরে থাকা আউটপুট পয়েন্টগুলির জন্য আমি ডিফল্ট ন্যান মান রেখেছি। 2 এই বৈশিষ্ট্যগুলি বিবেচনা করে, Rbfসেরা অভিনয় করা বলে মনে হচ্ছে।

দুষ্ট কাজ এবং বিক্ষিপ্ত ডেটা

এবং আমরা সকলেই যে মুহূর্তটির জন্য অপেক্ষা করছিলাম:

ডুমুর 5: দুষ্ট ছড়িয়ে ছিটিয়ে থাকা

এটা কোন বিশাল বিস্ময় যে interp2dমানেনা। প্রকৃতপক্ষে, কল করার সময় আপনার কাছে interp2dআশা করা উচিত যে কিছু বন্ধুত্বপূর্ণ RuntimeWarningস্প্লাইনটির নির্মাণের অসম্ভবতা সম্পর্কে অভিযোগ করবে s অন্য দুটি পদ্ধতির হিসাবে, Rbfফলাফলটি বহির্মুখী যেখানে ডোমেনের সীমানার কাছাকাছি এমনকি সেরা ফলাফল উত্পাদন করে বলে মনে হচ্ছে produce


তাই আমি পছন্দসই ক্রমহ্রাসমান ক্রমে তিনটি পদ্ধতি সম্পর্কে কয়েকটি শব্দ বলি (যাতে সবচেয়ে খারাপটি যে কারও দ্বারা পড়ার সম্ভাবনা কমপক্ষে থাকে)।

scipy.interpolate.Rbf

Rbfশ্রেণী "রশ্মীয় ভিত্তিতে ফাংশন" জন্য দাঁড়িয়েছে। সত্যি কথা বলতে আমি এই পোস্টটির জন্য গবেষণা শুরু না করা পর্যন্ত আমি কখনও এই পদ্ধতির বিষয়টি বিবেচনা করি নি, তবে আমি নিশ্চিত যে ভবিষ্যতে আমি এগুলি ব্যবহার করব।

স্প্লাইন-ভিত্তিক পদ্ধতিগুলির মতো (পরে দেখুন), ব্যবহার দুটি ধাপে আসে: প্রথমে একটি Rbfইনপুট ডেটার উপর ভিত্তি করে কলযোগ্য শ্রেণীর উদাহরণ তৈরি করে এবং তারপরে আন্তঃবিবাহিত ফলাফল পাওয়ার জন্য প্রদত্ত আউটপুট জালির জন্য এই অবজেক্টটিকে কল করে। মসৃণ আপসাম্পলিং পরীক্ষার উদাহরণ:

import scipy.interpolate as interp
zfun_smooth_rbf = interp.Rbf(x_sparse, y_sparse, z_sparse_smooth, function='cubic', smooth=0)  # default smooth=0 for interpolation
z_dense_smooth_rbf = zfun_smooth_rbf(x_dense, y_dense)  # not really a function, but a callable class instance

নোট করুন যে ইনপুট এবং আউটপুট উভয় ক্ষেত্রেই এই ক্ষেত্রে 2 ডি অ্যারে ছিল এবং আউটপুটটি কোনও z_dense_smooth_rbfআকৃতি ছাড়াই x_denseএবং একই আকারে রয়েছে y_dense। এছাড়াও লক্ষ করুন যে Rbfপ্রবিচ্ছেদের জন্য স্বেচ্ছাসেবী মাত্রা সমর্থন করে।

সুতরাং, scipy.interpolate.Rbf

  • এমনকি ক্রেজি ইনপুট ডেটার জন্য ভাল আচরণযুক্ত আউটপুট উত্পাদন করে
  • উচ্চ মাত্রায় বিরতি সমর্থন করে
  • ইনপুট পয়েন্টগুলির উত্তল হাল এর বাইরে এক্সট্রাপোলেট
  • প্রথম পদক্ষেপ হিসাবে একটি ইন্টারপোলটর তৈরি করে, তাই বিভিন্ন আউটপুট পয়েন্টগুলিতে এটি মূল্যায়ন কম অতিরিক্ত প্রচেষ্টা কম is
  • স্বেচ্ছাসেবীর আকারের আউটপুট পয়েন্ট থাকতে পারে (আয়তক্ষেত্রাকার জাল বাঁধার বিপরীতে, পরে দেখুন)
  • ইনপুট ডেটার প্রতিসাম্যতা সংরক্ষণ করার ঝুঁকিপূর্ণ
  • শব্দ রশ্মীয় ফাংশন একাধিক ধরণের সমর্থন function: multiquadric, inverse, gaussian, linear, cubic, quintic, thin_plateএবং ব্যবহারকারী-সংজ্ঞায়িত অবাধ

scipy.interpolate.griddata

আমার প্রাক্তন প্রিয়,, griddataস্বেচ্ছাসেবী দিকগুলির মধ্যে বিভাজনের জন্য একটি সাধারণ ওয়ার্কসওয়ার্স। এটি নোডাল পয়েন্টগুলির উত্তল হাল এর বাইরে পয়েন্টগুলির জন্য একক প্রিসেট মান নির্ধারণের বাইরে এক্সট্রাপোলেশন সম্পাদন করে না, তবে যেহেতু এক্সট্রাপোলেশন একটি খুব চঞ্চল এবং বিপজ্জনক জিনিস, এটি অগত্যা কোনও শঙ্কা নয়। ব্যবহারের উদাহরণ:

z_dense_smooth_griddata = interp.griddata(np.array([x_sparse.ravel(),y_sparse.ravel()]).T,
                                          z_sparse_smooth.ravel(),
                                          (x_dense,y_dense), method='cubic')   # default method is linear

সামান্য ক্লডজি সিনট্যাক্স নোট করুন। ইনপুট পয়েন্ট আকৃতি একটি অ্যারের নির্দিষ্ট করা আছে [N, D]যে Dমাত্রা। এর জন্য আমাদের প্রথমে আমাদের 2 তম স্থানাঙ্ক অ্যারে (ব্যবহার করে ravel) সমতল করতে হবে , তারপরে অ্যারেগুলি সংযুক্ত করে ফলাফলটি স্থানান্তর করতে হবে। এটি করার একাধিক উপায় রয়েছে তবে এগুলির সবগুলিই ভারী বলে মনে হচ্ছে। ইনপুট zডেটাও সমতল করতে হবে। আউটপুট পয়েন্টগুলির ক্ষেত্রে আমাদের আরও কিছুটা স্বাধীনতা আছে: কিছু কারণে এগুলি বহুমাত্রিক অ্যারেগুলির একটি টিপল হিসাবেও নির্দিষ্ট করা যেতে পারে। লক্ষ্য করুন helpএর griddata, বিভ্রান্তিকর এটা প্রস্তাব দেওয়া যেমন যে একই জন্য সত্য ইনপুট পয়েন্ট (অন্তত সংস্করণ 0.17.0 জন্য):

griddata(points, values, xi, method='linear', fill_value=nan, rescale=False)
    Interpolate unstructured D-dimensional data.

    Parameters
    ----------
    points : ndarray of floats, shape (n, D)
        Data point coordinates. Can either be an array of
        shape (n, D), or a tuple of `ndim` arrays.
    values : ndarray of float or complex, shape (n,)
        Data values.
    xi : ndarray of float, shape (M, D)
        Points at which to interpolate data.

সংক্ষেপে, scipy.interpolate.griddata

  • এমনকি ক্রেজি ইনপুট ডেটার জন্য ভাল আচরণযুক্ত আউটপুট উত্পাদন করে
  • উচ্চ মাত্রায় বিরতি সমর্থন করে
  • এক্সট্রা পোলেশন সঞ্চালন করে না, ইনপুট পয়েন্টগুলির উত্তল হাল এর বাইরে আউটপুট জন্য একটি মান সেট করা যেতে পারে (দেখুন fill_value)
  • একক কলে আন্তঃবিবাহিত মানগুলি গণনা করে, তাই একাধিক সেট আউটপুট পয়েন্টগুলি পরীক্ষা করা শুরু থেকে শুরু হয়
  • যথেচ্ছ আকারের আউটপুট পয়েন্ট থাকতে পারে
  • 1 ডি এবং 2 ডি-তে ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন, 1 ডি এবং 2 ডি-তে ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন, 1 ডি এবং 2 ডি-তে ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন 1 নিকটতম-প্রতিবেশী এবং লিনিয়ার ইন্টারপোলেশন ব্যবহার করুন NearestNDInterpolatorএবং LinearNDInterpolatorযথাক্রমে হুডের নীচে। 1 ডি কিউবিক ইন্টারপোলেশন একটি স্প্লিন ব্যবহার করে, 2 ডি ঘন ইন্টারপোলেশন CloughTocher2DInterpolatorএকটি অবিচ্ছিন্নভাবে পার্থক্যযোগ্য পিসওয়ালা-কিউবিক ইন্টারপোলটার তৈরি করতে ব্যবহার করে।
  • ইনপুট ডেটার প্রতিসাম্যতা লঙ্ঘন করতে পারে

scipy.interpolate.interp2d/scipy.interpolate.bisplrep

আমি আলোচনা করছি interp2dএবং এর আত্মীয়দের একমাত্র কারণ হ'ল এর একটি প্রতারণামূলক নাম রয়েছে এবং লোকেরা এটি ব্যবহার করার চেষ্টা করতে পারে। স্পোলার সতর্কতা: এটি ব্যবহার করবেন না (স্কিপি সংস্করণ 0.17.0 হিসাবে)। এটি পূর্ববর্তী বিষয়গুলির তুলনায় এটি ইতিমধ্যে আরও বিশেষ যে এটি বিশেষত দ্বি-মাত্রিক অন্তরঙ্গকরণের জন্য ব্যবহৃত হয়েছিল, তবে আমার সন্দেহ হয় যে এটি মাল্টিভারিয়েট ইন্টারপোলেশনটির পক্ষে এখন পর্যন্ত সবচেয়ে সাধারণ ঘটনা।

সিনট্যাক্স যতদূর যায়, interp2dতার Rbfপ্রথমটির মতো এটি প্রথমে একটি ইন্টারপোলেশন উদাহরণ নির্মাণ করা প্রয়োজন, যা প্রকৃত আন্তঃবিবাহিত মান সরবরাহ করতে বলা যেতে পারে। একটি ধরা আছে, তবে: আউটপুট পয়েন্টগুলি একটি আয়তক্ষেত্রাকার জালের উপর অবস্থিত থাকতে হবে, সুতরাং ইন্টারপোলটারে কলটিতে প্রবেশ করা ইনপুটগুলিকে 1 ডি ভেক্টর হতে হবে যা আউটপুট গ্রিডকে ছড়িয়ে দেয়, যেমন numpy.meshgrid:

# reminder: x_sparse and y_sparse are of shape [6, 7] from numpy.meshgrid
zfun_smooth_interp2d = interp.interp2d(x_sparse, y_sparse, z_sparse_smooth, kind='cubic')   # default kind is 'linear'
# reminder: x_dense and y_dense are of shape [20, 21] from numpy.meshgrid
xvec = x_dense[0,:] # 1d array of unique x values, 20 elements
yvec = y_dense[:,0] # 1d array of unique y values, 21 elements
z_dense_smooth_interp2d = zfun_smooth_interp2d(xvec,yvec)   # output is [20, 21]-shaped array

ব্যবহার করার সময় সর্বাধিক সাধারণ ভুলগুলির মধ্যে একটি interp2dহ'ল আপনার সম্পূর্ণ 2 ডি মেসকে আন্তঃবিশ্লেষণ কলটিতে স্থাপন করা, যা বিস্ফোরক মেমরি গ্রহণের দিকে পরিচালিত করে এবং আশা করি তাড়াহুড়ো করে MemoryError

এখন, সবচেয়ে বড় সমস্যাটি interp2dহ'ল এটি প্রায়শই কাজ করে না। এটি বোঝার জন্য, আমাদের হুডের নীচে দেখতে হবে। এটা পরিনত হয় যে interp2dনিম্ন-স্তরের কাজগুলির জন্য একটি লেফাফা হয় bisplrep+ + bisplev, যা FITPACK রুটিন জন্য পালা চাদরে (ফোরট্রান লেখা) রয়েছে। আগের উদাহরণটির সমতুল কল হবে

kind = 'cubic'
if kind=='linear':
    kx=ky=1
elif kind=='cubic':
    kx=ky=3
elif kind=='quintic':
    kx=ky=5
# bisplrep constructs a spline representation, bisplev evaluates the spline at given points
bisp_smooth = interp.bisplrep(x_sparse.ravel(),y_sparse.ravel(),z_sparse_smooth.ravel(),kx=kx,ky=ky,s=0)
z_dense_smooth_bisplrep = interp.bisplev(xvec,yvec,bisp_smooth).T  # note the transpose

এখন, এখানে জিনিস interp2d(scipy সংস্করণ 0.17.0 মধ্যে) সেখানে একটা চমৎকার হল: মন্তব্যinterpolate/interpolate.py জন্য interp2d:

if not rectangular_grid:
    # TODO: surfit is really not meant for interpolation!
    self.tck = fitpack.bisplrep(x, y, z, kx=kx, ky=ky, s=0.0)

এবং প্রকৃতপক্ষে interpolate/fitpack.py, bisplrepকিছু সেটআপ আছে এবং শেষ পর্যন্ত

tx, ty, c, o = _fitpack._surfit(x, y, z, w, xb, xe, yb, ye, kx, ky,
                                task, s, eps, tx, ty, nxest, nyest,
                                wrk, lwrk1, lwrk2)                 

এবং এটাই. অন্তর্নিহিত রুটিনগুলি interp2dপ্রকৃতপক্ষে বিরক্তি সম্পাদন করে বোঝানো হয় না। তারা যথেষ্ট পরিমাণে আচরণের জন্য যথেষ্ট হতে পারে তবে বাস্তব পরিস্থিতিতে আপনি সম্ভবত অন্য কিছু ব্যবহার করতে চাইবেন।

শুধু উপসংহারে, interpolate.interp2d

  • এমনকি ভাল-মেজাজযুক্ত ডেটা সহ শিল্পকর্মগুলিতে নেতৃত্ব দিতে পারে
  • বিশেষত দ্বিখণ্ডিত সমস্যার জন্য (যদিও interpnগ্রিডে সংজ্ঞায়িত ইনপুট পয়েন্টের সীমাবদ্ধ রয়েছে )
  • এক্সট্রাপোলেশন সম্পাদন করে
  • প্রথম পদক্ষেপ হিসাবে একটি ইন্টারপোলটর তৈরি করে, তাই বিভিন্ন আউটপুট পয়েন্টগুলিতে এটি মূল্যায়ন কম অতিরিক্ত প্রচেষ্টা কম is
  • কেবল একটি আয়তক্ষেত্রাকার গ্রিডের উপর আউটপুট উত্পাদন করতে পারে, বিক্ষিপ্ত আউটপুট জন্য আপনাকে একটি লুপে ইন্টারপোলটার কল করতে হবে
  • লিনিয়ার, কিউবিক এবং কুইন্টিক ইন্টারপোলেশন সমর্থন করে
  • ইনপুট ডেটার প্রতিসাম্যতা লঙ্ঘন করতে পারে

1 আমি মোটামুটি নিশ্চিত যে এর cubicএবং linearভিত্তি ভিত্তিক কার্যাবলী Rbfএকই নামের অন্যান্য ইন্টারপোলটারগুলির সাথে হুবহু মিলে না।
2 এই এনএএনগুলি পৃষ্ঠতল প্লটটিকে কেন এত অদ্ভুত বলে মনে হচ্ছে তার কারণ: ম্যাটপ্লটলিব historতিহাসিকভাবে সঠিক 3 ডি অবজেক্টের যথাযথ গভীরতার তথ্য নিয়ে প্লট করতে সমস্যা হয়। উপাত্তগুলিতে NaN মানগুলি রেন্ডারকে বিভ্রান্ত করে, তাই পৃষ্ঠের অংশগুলি যা পিছনে থাকা উচিত তা সামনের দিকে ষড়যন্ত্র করা হয়। এটি ভিজ্যুয়ালাইজেশনের একটি সমস্যা, এবং অন্তরঙ্গকরণ নয়।


2
আরবিএফ ডাটা পয়েন্ট এবং মাত্রার সংখ্যার উপর নির্ভর করে গ্রিডাটার চেয়ে বেশি মেমরি গ্রাস করতে পারে। এছাড়াও গ্রিডটাতে অন্তর্নিহিত অবজেক্ট লিনিয়ারডইন্টারপোলটর রয়েছে যা 2 টি পদক্ষেপে আরবিএফ এর মতো ব্যবহার করা যেতে পারে।
denfromufa

1
গ্রিডাতার ঘনক্ষেত্র 2 টি (?) মাত্রায় সীমাবদ্ধ। উচ্চ মাত্রার জন্য শেবফুনের উপর ভিত্তি করে স্মোলিয়াক স্পার্স গ্রিডগুলি বিবেচনা করার মতো।
denfromufa

1
আমাকে এই লিঙ্কটি দিয়ে আমার মন্তব্যগুলি শেষ করতে দিন, যেখানে আমি সমস্ত ছড়িয়ে ছিটিয়ে থাকা ইন্টারপোলেশন বিকল্পগুলি নিয়ে গবেষণা করেছি: scicomp.stackexchange.com/questions/19137/…
denfromufa

4
গ্রিডটা লিনিয়ার ইন্টারপোলেশন স্থানীয়, গ্রিডটা কিউবিক ইন্টারপোলেশন বিশ্বব্যাপী। এক্সট্রোপোলেশন সমর্থনযোগ্য নয়, কারণ কীভাবে ধারাবাহিকতা / পার্থক্যটি সংরক্ষণ করা যায় তা নির্ধারণ করার আমার কাছে সময় ছিল না। ছোট ডাটা সেটগুলির জন্য আরবিএফ ঠিক আছে, তবে এন ডাটা পয়েন্টগুলিকে আলাদা করতে এনএক্সএন ম্যাট্রিক্সটি উল্টাতে হবে যা শেষ পর্যন্ত এন> 5000 এর পরে অসম্ভব হয়ে ওঠে। আরবিএফ ডেটা বিতরণের ক্ষেত্রেও সংবেদনশীল হতে পারে এবং আপনার হাতে প্যারামিটারগুলি সূক্ষ্ম সুর করতে হবে। বড় ডেটাসেটের জন্য আরবিএফ করা সম্ভব, তবে এটি স্কিপি প্রয়োগ করা হয় না।
পিভি।

1
বড় ডেটাসেটের জন্য এখানে আরবিএফ রয়েছে: github.com/scipy/scipy/issues/5180
denfromufa
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.