{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "774cc021",
   "metadata": {},
   "source": [
    "# Is it a view or a copy?\n",
    "\n",
    "- For every operations on the array `x`, decide whether it returns a view of `x`, or a copy\n",
    "- If it's a view, derive the new values for the metadata (ndim, shape, strides)\n",
    "- You can verify your answers with the function `print_info` defined below"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "4ccf18f3",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 0  1  2  3]\n",
      " [ 4  5  6  7]\n",
      " [ 8  9 10 11]]\n",
      "\n",
      "Is it a view? False\n",
      "\n",
      "dtype\tint64\n",
      "ndim\t2\n",
      "shape\t(3, 4)\n",
      "strides\t(32, 8)\n",
      "    \n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "\n",
    "\n",
    "def is_view(a, x):\n",
    "    \"\"\" Is `a` a view of `x`? \"\"\"\n",
    "    return a.base is x\n",
    "\n",
    "\n",
    "def print_info(a, x):\n",
    "    txt = f\"\"\"\n",
    "Is it a view? {is_view(a, x)}\n",
    "\n",
    "dtype\\t{a.dtype}\n",
    "ndim\\t{a.ndim}\n",
    "shape\\t{a.shape}\n",
    "strides\\t{a.strides}\n",
    "    \"\"\"\n",
    "    print(a)\n",
    "    print(txt)\n",
    "\n",
    "\n",
    "x = np.arange(12).reshape(3, 4).copy()\n",
    "print_info(x, x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "b68308e8",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 0  1  2  3]\n",
      " [ 8  9 10 11]]\n",
      "\n",
      "Is it a view? True\n",
      "\n",
      "dtype\tint64\n",
      "ndim\t2\n",
      "shape\t(2, 4)\n",
      "strides\t(64, 8)\n",
      "    \n"
     ]
    }
   ],
   "source": [
    "y = x[::2, :]\n",
    "print_info(y, x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "85feedb0",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[4 5 6 7]\n",
      "\n",
      "Is it a view? True\n",
      "\n",
      "dtype\tint64\n",
      "ndim\t1\n",
      "shape\t(4,)\n",
      "strides\t(8,)\n",
      "    \n"
     ]
    }
   ],
   "source": [
    "y = x[1, :]\n",
    "print_info(y, x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "dbbb9a7f",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[4 5 6 7]\n",
      "\n",
      "Is it a view? True\n",
      "\n",
      "dtype\tint64\n",
      "ndim\t1\n",
      "shape\t(4,)\n",
      "strides\t(8,)\n",
      "    \n"
     ]
    }
   ],
   "source": [
    "y = x[1]\n",
    "print_info(y, x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "4957469c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[5 9 2]\n",
      "\n",
      "Is it a view? False\n",
      "\n",
      "dtype\tint64\n",
      "ndim\t1\n",
      "shape\t(3,)\n",
      "strides\t(8,)\n",
      "    \n"
     ]
    }
   ],
   "source": [
    "y = x[[1, 2, 0], [1, 1, 2]]\n",
    "print_info(y, x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "aa8effeb",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 0  1  2  3]\n",
      " [ 8  9 10 11]]\n",
      "\n",
      "Is it a view? False\n",
      "\n",
      "dtype\tint64\n",
      "ndim\t2\n",
      "shape\t(2, 4)\n",
      "strides\t(32, 8)\n",
      "    \n"
     ]
    }
   ],
   "source": [
    "# Get the first and third row\n",
    "y = x[[0, 2], :]\n",
    "print_info(y, x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "id": "d1649515",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 0  1]\n",
      " [ 2  3]\n",
      " [ 4  5]\n",
      " [ 6  7]\n",
      " [ 8  9]\n",
      " [10 11]]\n",
      "\n",
      "Is it a view? True\n",
      "\n",
      "dtype\tint64\n",
      "ndim\t2\n",
      "shape\t(6, 2)\n",
      "strides\t(16, 8)\n",
      "    \n"
     ]
    }
   ],
   "source": [
    "y = x.reshape((6, 2))\n",
    "print_info(y, x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "id": "15b0d7ad",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[ 0  1  2  3  4  5  6  7  8  9 10 11]\n",
      "\n",
      "Is it a view? True\n",
      "\n",
      "dtype\tint64\n",
      "ndim\t1\n",
      "shape\t(12,)\n",
      "strides\t(8,)\n",
      "    \n"
     ]
    }
   ],
   "source": [
    "y = x.ravel()\n",
    "print_info(y, x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "id": "38cc1ef3",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[ 0  4  8  1  5  9  2  6 10  3  7 11]\n",
      "\n",
      "Is it a view? False\n",
      "\n",
      "dtype\tint64\n",
      "ndim\t1\n",
      "shape\t(12,)\n",
      "strides\t(8,)\n",
      "    \n"
     ]
    }
   ],
   "source": [
    "y = x.T.ravel()\n",
    "print_info(y, x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "id": "b7d0cc63",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[ 1  3  5  7  9 11]\n",
      "\n",
      "Is it a view? False\n",
      "\n",
      "dtype\tint64\n",
      "ndim\t1\n",
      "shape\t(6,)\n",
      "strides\t(8,)\n",
      "    \n"
     ]
    }
   ],
   "source": [
    "# Get all the odd elements\n",
    "y = x[(x % 2) == 1]\n",
    "print_info(y, x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "id": "4474f8cf",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 2  3  4  5]\n",
      " [ 6  7  8  9]\n",
      " [10 11 12 13]]\n",
      "\n",
      "Is it a view? False\n",
      "\n",
      "dtype\tint64\n",
      "ndim\t2\n",
      "shape\t(3, 4)\n",
      "strides\t(32, 8)\n",
      "    \n"
     ]
    }
   ],
   "source": [
    "y = x + 2\n",
    "print_info(y, x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "id": "866e842a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 0  1  2  3]\n",
      " [ 4  5  6  7]\n",
      " [ 8  9 10 11]]\n",
      "\n",
      "Is it a view? False\n",
      "\n",
      "dtype\tint64\n",
      "ndim\t2\n",
      "shape\t(3, 4)\n",
      "strides\t(32, 8)\n",
      "    \n"
     ]
    }
   ],
   "source": [
    "y = np.sort(x, axis=1)\n",
    "print_info(y ,x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a074c89b",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "320cfb50",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "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.11.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
