{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 13. 넘파이 고급 사용법"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 13.1\t numpy의 고급 수학 연산"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
""
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([0.00000000e+00, 3.42020143e-01, 6.42787610e-01, 8.66025404e-01,\n",
" 9.84807753e-01, 9.84807753e-01, 8.66025404e-01, 6.42787610e-01,\n",
" 3.42020143e-01, 1.22464680e-16])"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import numpy as np\n",
"A = np.linspace(start=0, stop=np.pi, num=10)\n",
"B = np.empty(10)\n",
"np.sin(A, out=B)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([0.00000000e+00, 3.42020143e-01, 6.42787610e-01, 8.66025404e-01,\n",
" 9.84807753e-01, 9.84807753e-01, 8.66025404e-01, 6.42787610e-01,\n",
" 3.42020143e-01, 1.22464680e-16])"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"B"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([0.00000000e+00, 3.42020143e-01, 6.42787610e-01, 8.66025404e-01,\n",
" 9.84807753e-01, 9.84807753e-01, 8.66025404e-01, 6.42787610e-01,\n",
" 3.42020143e-01, 1.22464680e-16])"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import numpy as np\n",
"A = np.linspace(0, np.pi, 10)\n",
"B = np.sin(A)\n",
"B"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"sin(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature, extobj])\n",
"\n",
"Trigonometric sine, element-wise.\n",
"\n",
"Parameters\n",
"----------\n",
"x : array_like\n",
" Angle, in radians (:math:`2 \\pi` rad equals 360 degrees).\n",
"out : ndarray, None, or tuple of ndarray and None, optional\n",
" A location into which the result is stored. If provided, it must have\n",
" a shape that the inputs broadcast to. If not provided or None,\n",
" a freshly-allocated array is returned. A tuple (possible only as a\n",
" keyword argument) must have length equal to the number of outputs.\n",
"where : array_like, optional\n",
" This condition is broadcast over the input. At locations where the\n",
" condition is True, the `out` array will be set to the ufunc result.\n",
" Elsewhere, the `out` array will retain its original value.\n",
" Note that if an uninitialized `out` array is created via the default\n",
" ``out=None``, locations within it where the condition is False will\n",
" remain uninitialized.\n",
"**kwargs\n",
" For other keyword-only arguments, see the\n",
" :ref:`ufunc docs `.\n",
"\n",
"Returns\n",
"-------\n",
"y : array_like\n",
" The sine of each element of x.\n",
" This is a scalar if `x` is a scalar.\n",
"\n",
"See Also\n",
"--------\n",
"arcsin, sinh, cos\n",
"\n",
"Notes\n",
"-----\n",
"The sine is one of the fundamental functions of trigonometry (the\n",
"mathematical study of triangles). Consider a circle of radius 1\n",
"centered on the origin. A ray comes in from the :math:`+x` axis, makes\n",
"an angle at the origin (measured counter-clockwise from that axis), and\n",
"departs from the origin. The :math:`y` coordinate of the outgoing\n",
"ray's intersection with the unit circle is the sine of that angle. It\n",
"ranges from -1 for :math:`x=3\\pi / 2` to +1 for :math:`\\pi / 2.` The\n",
"function has zeroes where the angle is a multiple of :math:`\\pi`.\n",
"Sines of angles between :math:`\\pi` and :math:`2\\pi` are negative.\n",
"The numerous properties of the sine and related functions are included\n",
"in any standard trigonometry text.\n",
"\n",
"Examples\n",
"--------\n",
"Print sine of one angle:\n",
"\n",
">>> np.sin(np.pi/2.)\n",
"1.0\n",
"\n",
"Print sines of an array of angles given in degrees:\n",
"\n",
">>> np.sin(np.array((0., 30., 45., 60., 90.)) * np.pi / 180. )\n",
"array([ 0. , 0.5 , 0.70710678, 0.8660254 , 1. ])\n",
"\n",
"Plot the sine function:\n",
"\n",
">>> import matplotlib.pylab as plt\n",
">>> x = np.linspace(-np.pi, np.pi, 201)\n",
">>> plt.plot(x, np.sin(x))\n",
">>> plt.xlabel('Angle [rad]')\n",
">>> plt.ylabel('sin(x)')\n",
">>> plt.axis('tight')\n",
">>> plt.show()\n"
]
}
],
"source": [
"import numpy as np\n",
"np.info(np.sin)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[0 1 2 3 4 5]\n",
"[ 0 1 4 9 16 25]\n"
]
}
],
"source": [
"import numpy as np\n",
"A = np.arange(6)\n",
"print(A)\n",
"print(np.power(A, 2))"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[ 0.000 0.342 0.643 0.866 0.985 0.985 0.866 0.643 0.342 0.001]\n"
]
}
],
"source": [
"A = np.linspace(0, np.pi, 10)\n",
"B = np.sin(A, dtype='float16')\n",
"print(B)"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.000 0.342 0.643 0.866 0.985 0.985 0.866 0.643 0.342 0.000\n"
]
}
],
"source": [
"B = np.sin(A)\n",
"print(' '.join(format(x, '5.3f') for x in B))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"- 발생자는 곧 반복자이다!!!\n",
" - 즉, 발생자에게 next() 호출이 가능하다."
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"['0.000', '0.342', '0.643', '0.866', '0.985', '0.985', '0.866', '0.643', '0.342', '0.000']\n"
]
}
],
"source": [
"B = np.sin(A)\n",
"C = (format(x, '5.3f') for x in B)\n",
"print(list(C))"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [],
"source": [
"np.set_printoptions(formatter={'float': '{: 0.3f}'.format})"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[ 0.000 0.342 0.643 0.866 0.985 0.985 0.866 0.643 0.342 0.001]\n"
]
}
],
"source": [
"A = np.linspace(0, np.pi, 10)\n",
"B = np.sin(A, dtype='float16')\n",
"print(B)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 13.2 matplotlib 내려받기"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"`pip install matplotlib`"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 13.3 numpy와 matplotlib으로 그래프 선 그리기"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"50\n"
]
}
],
"source": [
"A = np.linspace(0, 2 * np.pi)\n",
"print(len(A))"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"