Source code for pygeopressure.velocity.interpolation
# -*- coding: utf-8 -*-
"""
2-d interpolation routines
"""
from __future__ import (absolute_import, division, print_function,
unicode_literals)
from builtins import range
__author__ = "yuhao"
from scipy import interpolate
import numpy as np
[docs]def interp_DW(array2d):
"""2-D distance-weighted interpolation
Parameters
----------
array2d : ndarray
2-D ndarray void values being singaled by np.nan
Examples
--------
>>> a = np.array([[2, 2, 2], [2, np.nan, 2], [2, 2, 2]])
>>> b = interp_DW(a)
"""
m = array2d.shape[0]
n = array2d.shape[1]
for i in range(m):
for j in range(n):
if np.isnan(array2d[i][j]):
i_min = np.nan
i_max = np.nan
j_min = np.nan
j_max = np.nan
for p in range(i, -1, -1):
if not np.isnan(array2d[p][j]):
i_min = p
break
for p in range(i, m, 1):
if not np.isnan(array2d[p][j]):
i_max = p
break
for p in range(j, -1, -1):
if not np.isnan(array2d[i][p]):
j_min = p
break
for p in range(j, n, 1):
if not np.isnan(array2d[i][p]):
j_max = p
break
if np.isnan(i_min):
i_min = 0
if np.isnan(i_max):
i_max = m - 1
if np.isnan(j_min):
j_min = 0
if np.isnan(j_max):
j_max = n - 1
dis = list()
value = list()
for p in range(i_min, i_max + 1, 1):
for q in range(j_min, j_max + 1, 1):
if not np.isnan(array2d[p][q]):
dis.append(
1.0 / (np.abs(p - i)**2 + np.abs(q - j)**2))
value.append(array2d[p][q])
interp = 0
# for r in range(len(dis)):
for r, _ in enumerate(dis):
interp = interp + dis[r] * value[r]
try:
interp = interp / np.sum(dis)
except Exception as e:
print(e)
break
array2d[i][j] = float("%.2f" % interp)
[docs]def spline_1d(twt, vel, step, startTwt=None, endTwt=None, method='cubic'):
startTwt = twt[0] if startTwt is None else startTwt
endTwt = twt[-1] if endTwt is None else endTwt
newTwt = np.arange(startTwt, endTwt, step)
f = interpolate.interp1d(twt, vel, kind=method)
newVel = f(newTwt)
return (list(newTwt), list(newVel))