Skip to content

Instantly share code, notes, and snippets.

@mcg1969
Last active August 11, 2016 16:11
Show Gist options
  • Save mcg1969/16956553810ca0151d9b504ebdd436d8 to your computer and use it in GitHub Desktop.
Save mcg1969/16956553810ca0151d9b504ebdd436d8 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"{'divide': 'ignore', 'invalid': 'ignore', 'over': 'ignore', 'under': 'ignore'}"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from __future__ import print_function\n",
"import numba as nb\n",
"import numpy as np\n",
"import math\n",
"from dask import delayed\n",
"np.seterr(invalid='warn')"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"def test(x, y):\n",
" if math.isnan(x):\n",
" return 0 if math.isnan(y) else 1\n",
" elif math.isnan(y):\n",
" return 2\n",
" elif x <= 0:\n",
" return 0 if y <= 0 else 1\n",
" elif y <= 0:\n",
" return 2\n",
" elif x == y:\n",
" return 3\n",
" else:\n",
" return 4\n",
"\n",
"test_jit = nb.njit(test)\n",
"test_vec = np.vectorize(test)\n",
"test_jit_vec = np.vectorize(test_jit)\n",
" \n",
"@nb.vectorize('i8(f8, f8)')\n",
"def test_nbvec(x, y):\n",
" return test_jit(x, y)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"x = np.array([2, 1, 0, np.nan])\n",
"y = x[:,None]\n",
"x = x[None,:]\n",
"z = np.nan"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Scalar case: all forms of the function behave identically"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"0"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"test(z, z)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"0"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"test_jit(z, z)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array(0)"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"test_vec(z, z)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array(0)"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"test_jit_vec(z, z)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"0"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"test_nbvec(z, z)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Vectorized: numba behaves differently"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([[3, 4, 1, 1],\n",
" [4, 3, 1, 1],\n",
" [2, 2, 0, 1],\n",
" [2, 2, 2, 0]])"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"test_vec(x, y)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([[3, 4, 1, 1],\n",
" [4, 3, 1, 1],\n",
" [2, 2, 0, 1],\n",
" [2, 2, 2, 0]])"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"test_jit_vec(x, y)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/Users/mgrant/miniconda2/lib/python2.7/site-packages/ipykernel/__main__.py:1: RuntimeWarning: invalid value encountered in test_nbvec\n",
" if __name__ == '__main__':\n"
]
},
{
"data": {
"text/plain": [
"array([[3, 4, 1, 1],\n",
" [4, 3, 1, 1],\n",
" [2, 2, 0, 1],\n",
" [2, 2, 2, 0]])"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"test_nbvec(x, y)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Scalar with dask: same behavior"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"0"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"delayed(test)(z, z).compute()"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"0"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"delayed(test_jit)(z, z).compute()"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array(0)"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"delayed(test_vec)(z, z).compute()"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array(0)"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"delayed(test_jit_vec)(z, z).compute()"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"0"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"delayed(test_nbvec)(z, z).compute()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Vectorized with Dask: different behavior; dask is calling `np.seterr()`"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([[3, 4, 1, 1],\n",
" [4, 3, 1, 1],\n",
" [2, 2, 0, 1],\n",
" [2, 2, 2, 0]])"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"delayed(test_vec)(x, y).compute()"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([[3, 4, 1, 1],\n",
" [4, 3, 1, 1],\n",
" [2, 2, 0, 1],\n",
" [2, 2, 2, 0]])"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"delayed(test_jit_vec)(x, y).compute()"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/Users/mgrant/miniconda2/lib/python2.7/site-packages/dask/async.py:249: RuntimeWarning: invalid value encountered in test_nbvec\n",
" return func(*args2)\n"
]
},
{
"data": {
"text/plain": [
"array([[3, 4, 1, 1],\n",
" [4, 3, 1, 1],\n",
" [2, 2, 0, 1],\n",
" [2, 2, 2, 0]])"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"delayed(test_nbvec)(x, y).compute()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Introducing the `@quiet_nan` decorator"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def quiet_nan(func):\n",
" def call_(*args, **kwargs):\n",
" with np.errstate(invalid='ignore'):\n",
" return func(*args, **kwargs)\n",
" return call_\n",
"\n",
"@quiet_nan\n",
"@nb.vectorize('i8(f8, f8)')\n",
"def test_quiet(x, y):\n",
" return test_jit(x, y)"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"0"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"test_quiet(z, z)"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"0"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"delayed(test_quiet)(z, z).compute()"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([[3, 4, 1, 1],\n",
" [4, 3, 1, 1],\n",
" [2, 2, 0, 1],\n",
" [2, 2, 2, 0]])"
]
},
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"test_quiet(x, y)"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([[3, 4, 1, 1],\n",
" [4, 3, 1, 1],\n",
" [2, 2, 0, 1],\n",
" [2, 2, 2, 0]])"
]
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"delayed(test_quiet)(x, y).compute()"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 2",
"language": "python",
"name": "python2"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.12"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment