{ "cells": [ { "cell_type": "markdown", "id": "097e66cb", "metadata": {}, "source": [ "# Log interpolation between wells" ] }, { "cell_type": "markdown", "id": "magnetic-plate", "metadata": {}, "source": [ "## Implementation in bruges" ] }, { "cell_type": "code", "execution_count": 3, "id": "adolescent-speed", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAWoAAACPCAYAAADTJpFmAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKUklEQVR4nO3db6ie9X3H8ffHc05MEy22i64uCdMNcQuy1ZLZbsIeaMvSrugeVtYiTPDJ3OzoWCOFwWCMwkbXgWVDWqcwsRTrmIx2bdoppdB/MfNvo9PVrsa6xq51UduaRL97cN+xZ8k5OdfR87uv31neLzjk/seXD3fu8znXuc51Xb9UFZKkfp02dgBJ0slZ1JLUOYtakjpnUUtS5yxqSeqcRS1JnZtvMXRDTq+NbF77wVn7ka+MTqOfWa0yp+mb4dxZzG6hYd5q9v/XZmzLvmjxXvzkJz/kyOEXlhzcpKg3spm35vI1n5v5JnEnszdsaDO3VeYNC23mAlloNLvVe7HQ7nNRrWbPzzUZWwtt5rac/fJ8m42kajQX4OWFtZ+99+s3Lvucuz4kqXMWtSR1zqKWpM5Z1JLUOYtakjo3qKiT7EryaJLHk+xuHUqS9FMrFnWSOeBjwDuBHcBVSXa0DiZJmhiyRX0J8HhVfauqDgOfBK5sG0uSdMyQot4KPLno/oHpY5KkGRhy2tVSpzSesCxMkmuBawE2suk1xpIkHTNki/oAsH3R/W3Ad49/UVXdVFU7q2rnAqevVT5JOuUNKepvABckOT/JBuA9wF1tY0mSjllx10dVHU1yHfA5YA64uaoebp5MkgQMvHpeVX0G+EzjLJKkJXhmoiR1zqKWpM5Z1JLUOYtakjpnUUtS5yxqSepck5U7N+8ofu32l9Z87qbTfrzmM1+ZPfdik7kbc6TJ3E2ntckLsPm0w03mbmw0d3PazIV27/PGrP33B8DmHG0yF2BTo1W9z50/o83gdeaS3/r+ss+5RS1JnbOoJalzFrUkdc6ilqTOWdSS1DmLWpI6Z1FLUueGrEJ+c5KDSR6aRSBJ0v81ZIv6FmBX4xySpGWsWNRV9SXgBzPIIklagvuoJalza1bUSa5NsjfJ3h/9sN11KCTpVLNmRV1VN1XVzqrauekNp6/VWEk65bnrQ5I6N+TwvNuBrwAXJjmQ5Jr2sSRJx6x4PeqqumoWQSRJS3PXhyR1zqKWpM5Z1JLUOYtakjpnUUtS5yxqSerciofnvRpb53/Mn5/zYIvRmrruqbc2m/3tF97YZO73nj+zydxnD21qMhfg6KENTebOPTfXZO6GQ2kyF2DhuTZztzzgJScAHn3ixmWfc4takjpnUUtS5yxqSeqcRS1JnbOoJalzFrUkdW7IZU63J7k7yf4kDye5fhbBJEkTQ46jPgp8oKr2JTkTuDfJnqr6ZuNskiSGrUL+dFXtm95+DtgPbG0dTJI0sap91EnOAy4GvtYkjSTpBIOLOskZwKeB91fVoSWef2UV8mf++6W1zChJp7RBRZ1kgUlJ31ZVdy71msWrkJ/9M22uYyBJp6IhR30E+ASwv6o+0j6SJGmxIVvUlwLvAy5Lct/0612Nc0mSpoasQv5loN21EyVJJ+WZiZLUOYtakjpnUUtS5yxqSeqcRS1JnbOoJalzTVYhb+U/jjzfbPYjR7Y0mfvYi29qMnf/By9qMrel16+zuROtLofgZRaOufsLu8eO0IXkhnuXe84taknqnEUtSZ2zqCWpcxa1JHXOopakzlnUktS5Idej3pjk60nun65C/mezCCZJmhhyHPWLwGVV9fx0pZcvJ/lsVX21cTZJEsOuR13AsTNNFqZf1TKUJOmnhq6ZOJfkPuAgsKeqXIVckmZkUFFX1UtV9WZgG3BJkhPOX3YVcklqY1VHfVTVs8A9wK4lnnMVcklqYMhRH2cnOWt6+3XA24FHGueSJE0NOerjXODWJHNMiv1TVfXPbWNJko4ZctTHA8DFM8giSVqCZyZKUucsaknqnEUtSZ2zqCWpcxa1JHXOopakzlnUktS5ISe8rNqjT2zh8vde02K0pu7+wu6xI0iaEbeoJalzFrUkdc6ilqTOWdSS1DmLWpI6Z1FLUucGF/V03cR/S+K1qCVphlazRX09sL9VEEnS0oauQr4N+G3g423jSJKON3SL+qPAnwAvt4siSVrKkMVt3w0crKp7V3jdtUn2Jtl75MgLaxZQkk51Q7aoLwWuSPJt4JPAZUn+4fgXVdVNVbWzqnYuLGxe45iSdOpasair6oaq2lZV5wHvAf61qt7bPJkkCfA4aknq3qouc1pV9wD3NEkiSVqSW9SS1DmLWpI6Z1FLUucsaknqnEUtSZ2zqCWpc6mqtR+aPAP858CXbwG+v+Yh2llvecHMs7De8oKZZ2E1eX++qs5e6okmRb0aSfZW1c5RQ6zCessLZp6F9ZYXzDwLa5XXXR+S1DmLWpI610NR3zR2gFVab3nBzLOw3vKCmWdhTfKOvo9aknRyPWxRS5JOYrSiTrIryaNJHk+ye6wcQyXZnuTuJPuTPJzk+rEzDbHeVo9PclaSO5I8Mn2vf33sTCtJ8kfTz8RDSW5PsnHsTMdLcnOSg0keWvTYG5PsSfLY9N83jJlxsWXy/uX0c/FAkn9MctaIEU+wVOZFz/1xkkqy5dXMHqWok8wBHwPeCewArkqyY4wsq3AU+EBV/TLwNuD310FmWH+rx/8N8C9V9UvAr9J59iRbgT8EdlbVRcAckwU2enMLsOu4x3YDX6yqC4AvTu/34hZOzLsHuKiqfgX4d+CGWYdawS2cmJkk24F3AN95tYPH2qK+BHi8qr5VVYeZLPF15UhZBqmqp6tq3/T2c0wKZOu4qU5uva0en+T1wG8CnwCoqsNV9eyooYaZB16XZB7YBHx35DwnqKovAT847uErgVunt28FfmeWmU5mqbxV9fmqOjq9+1Vg28yDncQy7zHAXzNZHPxV/0FwrKLeCjy56P4BOi+9xZKcB1wMfG3kKCv5KOtr9fhfAJ4B/n66u+bjSbpegLOqngL+isnW0tPA/1TV58dNNdjPVtXTMNkQAc4ZOc9q/B7w2bFDrCTJFcBTVXX/a5kzVlFnicfWxeEnSc4APg28v6oOjZ1nOUNXj+/MPPAW4G+r6mLgBfr6dfwE0/26VwLnAz8HbE7imqINJfkQk12Rt42d5WSSbAI+BPzpa501VlEfALYvur+NDn9dPF6SBSYlfVtV3Tl2nhUMWj2+MweAA1V17DeVO5gUd8/eDjxRVc9U1RHgTuA3Rs401PeSnAsw/ffgyHlWlORq4N3A71b/xxb/IpMf4PdPvw+3AfuSvGm1g8Yq6m8AFyQ5P8kGJn98uWukLIMkCZN9p/ur6iNj51nJelw9vqr+C3gyyYXThy4HvjlipCG+A7wtyabpZ+RyOv8D6CJ3AVdPb18N/NOIWVaUZBfwQeCKqvrR2HlWUlUPVtU5VXXe9PvwAPCW6ed8VUYp6ukfBK4DPsfkQ/2pqnp4jCyrcCnwPiZbpvdNv941dqj/h/4AuC3JA8Cbgb8YN87JTbf+7wD2AQ8y+Z7q7uy5JLcDXwEuTHIgyTXAh4F3JHmMyVEJHx4z42LL5L0ROBPYM/3++7tRQx5nmcxrM7v/3x4k6dTmmYmS1DmLWpI6Z1FLUucsaknqnEUtSZ2zqCWpcxa1JHXOopakzv0v3rmv0jUt1pgAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "import numpy as np\n", "import bruges as bg\n", "\n", "a = np.array([2,6,7,7,3])\n", "b = np.array([3,7,3])\n", "dists = (10,)\n", "panel = bg.models.panel(a, b, num=15, dists=dists)\n", "\n", "plt.imshow(panel)" ] }, { "cell_type": "markdown", "id": "appropriate-wagner", "metadata": {}, "source": [ "---\n", "\n", "## Development" ] }, { "cell_type": "markdown", "id": "8816fe69", "metadata": {}, "source": [ "Make two 1D arrays of made-up data." ] }, { "cell_type": "code", "execution_count": 27, "id": "945c7a1d", "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "a = np.array([3,6,7,8,5,4,5,4,5,4,5,6,6,6,6,6,6,3,2,3])\n", "b = np.array([6,7,8,5,2,3,2,3,3,3,1,1,1,3,])\n", "c = np.array([9,8,7,5,5,6,5,6,6,6,1,2,3,3,5,6,6,6,3,2,1])\n", "d = np.array([6,7,8,5,2,3,2,3,3,3,1,1,1,3,])[::-1]\n", "\n", "a = np.array([3,6,7,7,3])\n", "b = np.array([3,4,5,5,2])\n", "\n", "# ALL SAME LENGTH\n", "# a = np.array([3,6,7,8,5,4,5,4,5,4,5,6,6,6,])\n", "# b = np.array([6,7,8,5,2,3,2,3,3,3,1,1,1,3,])\n", "# c = np.array([9,8,7,5,5,6,5,6,6,6,1,2,3,3,])\n", "\n", "plt.plot(a, np.arange(a.size))\n", "plt.plot(b + 10, np.arange(b.size))\n", "plt.plot(c + 20, np.arange(c.size))\n", "plt.plot(d + 30, np.arange(d.size))\n", "plt.gca().invert_yaxis()" ] }, { "cell_type": "markdown", "id": "766bfead", "metadata": {}, "source": [ "## Interpolate alike\n", "\n", "That is, interpolate between two 1D arrays **of equal length**. The `interpolate_alike` function is the fundamental bit, in terms of the interpolation. The rest of the code deals with the lengths of things." ] }, { "cell_type": "code", "execution_count": 28, "id": "3b5cd456", "metadata": {}, "outputs": [], "source": [ "from scipy.ndimage import zoom\n", "\n", "def reconcile(*arrays, order=0):\n", " \"\"\"\n", " Make sure 1D arrays are the same length.\n", " If not, stretch them to match the longest.\n", " \"\"\"\n", " maxl = max(len(arr) for arr in arrays)\n", " out = []\n", " for arr in arrays:\n", " if len(arr) < maxl:\n", " out.append(zoom(arr, zoom=maxl/len(arr), order=order))\n", " else:\n", " out.append(arr)\n", " return tuple(out)" ] }, { "cell_type": "code", "execution_count": 63, "id": "3cca506e", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 63, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "from scipy.interpolate import interp1d\n", "\n", "def interpolate_alike(*arrays, num=50, dists=None, kind='linear'):\n", " \"\"\"\n", " Linear interpolation between 1D arrays of the\n", " same length.\n", "\n", " Args:\n", " num (int): The number of steps to take, so will be\n", " the width (number of cols) of the output\n", " array.\n", " dists (array-like): A list or tuple or array of the\n", " distances (any units) between the arrays in\n", " the real world.\n", " kind (str): Will be passed to scipy.interpolate.interp1d,\n", " which does the lateral interpolation between samples.\n", "\n", " Returns:\n", " ndarray. The result, with `num` columns. The number\n", " of rows is the same as the longest input.\n", " \"\"\"\n", " intervals = len(arrays) - 1\n", " if dists is None:\n", " dists = intervals * [num / intervals]\n", " x = np.hstack([[0], np.cumsum(dists)])\n", " f = interp1d(x, np.stack(arrays), axis=0, kind=kind)\n", " return f(np.linspace(x[0], x[-1], num=num)).T\n", "\n", "\n", "a = np.array([2,6,7,7,3])\n", "b = np.array([3,7,3])\n", "\n", "rec = reconcile(a, b, order=0)\n", "sizes = (1, 0.5)\n", "dists = (10,)\n", "interp = interpolate_alike(*rec, dists=dists, num=15)\n", "\n", "plt.imshow(interp)" ] }, { "cell_type": "markdown", "id": "0347324a", "metadata": {}, "source": [ "## Stretch to any proportions" ] }, { "cell_type": "code", "execution_count": 65, "id": "7ebe8553", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 65, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "def unreconcile(arr, sizes, dists=None, order=0):\n", " \"\"\"\n", " Opposite of reconcile.\n", " \n", " sizes (int): The relative lengths of the profiles\n", " in the array. Default returns the input array.\n", " dists (array-like): The relative distances between\n", " the profiles in the array. Sum used to calculate\n", " the output width in pixels if the width argument\n", " is None. If not given, the distances are assumed\n", " to be equal.\n", " order (int): The order of the spline interpolation,\n", " from 0 to 3. The default is 0, which gives\n", " nearest neighbour interpolation. 1 gives linear\n", " interpolation, etc. Use 0 for ints and 1-3 for\n", " floats.\n", " \"\"\"\n", " if np.all(sizes[0] == np.array(sizes)):\n", " # Nothing to do.\n", " return arr\n", "\n", " intervals = len(sizes) - 1\n", "\n", " if dists is None:\n", " eq = arr.shape[-1] // intervals\n", " dists = [eq] * intervals\n", " assert len(dists) == intervals\n", " \n", " maxlen = int(np.ceil(max(sizes) * arr.shape[0]))\n", " \n", " dist_ = np.cumsum(dists)\n", " idx = arr.shape[-1] * dist_ / max(dist_)\n", " chunks = np.split(arr, idx[:-1].astype(int), axis=-1)\n", "\n", " zoomed = []\n", " for left, right, chunk in zip(sizes[:-1], sizes[1:], chunks):\n", " zooms = np.linspace(left, right, chunk.shape[-1]+1)\n", " for z, col in zip(zooms, chunk.T):\n", " new_ = zoom(col, zoom=z, order=order, mode='nearest')\n", " pad_width = maxlen - new_.size\n", " new = np.pad(new_, pad_width=(0, pad_width), mode='constant', constant_values=np.nan)\n", " zoomed.append(new)\n", "\n", " return np.array(zoomed).T\n", "\n", "panel = unreconcile(interp, sizes=sizes, dists=dists, order=0)\n", "\n", "plt.imshow(panel, aspect='auto', interpolation='none')" ] }, { "cell_type": "code", "execution_count": 57, "id": "private-guide", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[5, 3]" ] }, "execution_count": 57, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sizes" ] }, { "cell_type": "markdown", "id": "176dd4f4", "metadata": {}, "source": [ "## Generate panel for arbitrary inputs\n", "\n", "Bring it all together..." ] }, { "cell_type": "code", "execution_count": 67, "id": "6f92c5ff", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(5, 15)" ] }, "execution_count": 67, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def interpolate(*arrays, num=50, dists=None, order=0, kind='linear'):\n", " \"\"\"\n", " Interpolate an arbitrary collection of 1D arrays.\n", " \"\"\"\n", " sizes = np.array([len(x) for x in arrays])\n", " sizes = sizes / np.max(sizes)\n", " rec = reconcile(*arrays)\n", " interp = interpolate_alike(*rec, num=num, dists=dists, kind=kind)\n", " panel = unreconcile(interp, sizes=sizes, dists=dists, order=order)\n", " return panel\n", "\n", "a = np.array([2,6,7,7,3])\n", "b = np.array([3,7,3])\n", "rec = reconcile(a, b, order=0)\n", "dists = (10,)\n", "panel = interpolate(a, b, num=15, dists=dists)\n", "panel.shape\n", "# plt.imshow(panel, aspect='auto', interpolation='none')" ] }, { "cell_type": "code", "execution_count": 70, "id": "bd56d2e4", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([2.5, 6.5, 5. , 3. , nan])" ] }, "execution_count": 70, "metadata": {}, "output_type": "execute_result" } ], "source": [ "panel[:, 7]" ] }, { "cell_type": "code", "execution_count": 69, "id": "processed-helping", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 69, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.imshow(panel)" ] }, { "cell_type": "code", "execution_count": null, "id": "informed-april", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "py39", "language": "python", "name": "py39" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.7" } }, "nbformat": 4, "nbformat_minor": 5 }