diff --git a/examples/workbook.ipynb b/examples/workbook.ipynb index 430fc49..45d5e42 100644 --- a/examples/workbook.ipynb +++ b/examples/workbook.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "id": "c1efd290", "metadata": {}, "outputs": [], @@ -19,7 +19,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "id": "9bc83088", "metadata": {}, "outputs": [], @@ -29,7 +29,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "id": "e352f315", "metadata": {}, "outputs": [], @@ -45,61 +45,20 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "id": "e1b5e68d", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'model': HuberRegressor(),\n", - " 'counts': array([605, 679, 675, ..., 27, 20, 26]),\n", - " 'min_intensity': 90,\n", - " 'max_intensity': 3016,\n", - " 'variance': array([ 5706.29669421, 5897.68851252, 5368.22962963, ...,\n", - " 250302.94444444, 566103.325 , 584751.57692308]),\n", - " 'sensitivity': 96.99485239520567,\n", - " 'zero_level': 86.30213578612849}" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "qs" ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "id": "50f3d031", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Text(0, 0.5, 'variance')" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "intensity = np.r_[qs['min_intensity']:qs['max_intensity']]\n", "sensitivity = qs['sensitivity']\n", @@ -113,7 +72,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "id": "2e6efa14", "metadata": {}, "outputs": [], @@ -126,18 +85,10 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "id": "a6d75d83", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Compression ratio: 3.79\n" - ] - } - ], + "outputs": [], "source": [ "# save compressed video as .gif\n", "compressed = estimate.lookup(data - zero, LUT1)\n", @@ -149,7 +100,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "id": "6645b70f", "metadata": {}, "outputs": [], @@ -160,7 +111,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "id": "560e02fa", "metadata": {}, "outputs": [], @@ -171,31 +122,10 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": null, "id": "7f3535d2", "metadata": {}, - "outputs": [ - { - "ename": "UFuncTypeError", - "evalue": "ufunc 'minimum' did not contain a loop with signature matching types (dtype('S375000'), dtype('int64')) -> None", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mUFuncTypeError\u001b[0m Traceback (most recent call last)", - "Input \u001b[0;32mIn [14]\u001b[0m, in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0m data_read \u001b[38;5;241m=\u001b[39m \u001b[43mphoton_data\u001b[49m\u001b[43m[\u001b[49m\u001b[43m:\u001b[49m\u001b[43m]\u001b[49m\n", - "File \u001b[0;32m~/opt/miniconda3/envs/benv/lib/python3.10/site-packages/zarr/core.py:844\u001b[0m, in \u001b[0;36mArray.__getitem__\u001b[0;34m(self, selection)\u001b[0m\n\u001b[1;32m 842\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mget_orthogonal_selection(pure_selection, fields\u001b[38;5;241m=\u001b[39mfields)\n\u001b[1;32m 843\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m--> 844\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_basic_selection\u001b[49m\u001b[43m(\u001b[49m\u001b[43mpure_selection\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfields\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mfields\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 845\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m result\n", - "File \u001b[0;32m~/opt/miniconda3/envs/benv/lib/python3.10/site-packages/zarr/core.py:970\u001b[0m, in \u001b[0;36mArray.get_basic_selection\u001b[0;34m(self, selection, out, fields)\u001b[0m\n\u001b[1;32m 968\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_get_basic_selection_zd(selection\u001b[38;5;241m=\u001b[39mselection, out\u001b[38;5;241m=\u001b[39mout, fields\u001b[38;5;241m=\u001b[39mfields)\n\u001b[1;32m 969\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m--> 970\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_get_basic_selection_nd\u001b[49m\u001b[43m(\u001b[49m\u001b[43mselection\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mselection\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mout\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mout\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfields\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mfields\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/opt/miniconda3/envs/benv/lib/python3.10/site-packages/zarr/core.py:1012\u001b[0m, in \u001b[0;36mArray._get_basic_selection_nd\u001b[0;34m(self, selection, out, fields)\u001b[0m\n\u001b[1;32m 1006\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_get_basic_selection_nd\u001b[39m(\u001b[38;5;28mself\u001b[39m, selection, out\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m, fields\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m):\n\u001b[1;32m 1007\u001b[0m \u001b[38;5;66;03m# implementation of basic selection for array with at least one dimension\u001b[39;00m\n\u001b[1;32m 1008\u001b[0m \n\u001b[1;32m 1009\u001b[0m \u001b[38;5;66;03m# setup indexer\u001b[39;00m\n\u001b[1;32m 1010\u001b[0m indexer \u001b[38;5;241m=\u001b[39m BasicIndexer(selection, \u001b[38;5;28mself\u001b[39m)\n\u001b[0;32m-> 1012\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_get_selection\u001b[49m\u001b[43m(\u001b[49m\u001b[43mindexer\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mindexer\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mout\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mout\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfields\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mfields\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/opt/miniconda3/envs/benv/lib/python3.10/site-packages/zarr/core.py:1388\u001b[0m, in \u001b[0;36mArray._get_selection\u001b[0;34m(self, indexer, out, fields)\u001b[0m\n\u001b[1;32m 1385\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m math\u001b[38;5;241m.\u001b[39mprod(out_shape) \u001b[38;5;241m>\u001b[39m \u001b[38;5;241m0\u001b[39m:\n\u001b[1;32m 1386\u001b[0m \u001b[38;5;66;03m# allow storage to get multiple items at once\u001b[39;00m\n\u001b[1;32m 1387\u001b[0m lchunk_coords, lchunk_selection, lout_selection \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mzip\u001b[39m(\u001b[38;5;241m*\u001b[39mindexer)\n\u001b[0;32m-> 1388\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_chunk_getitems\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 1389\u001b[0m \u001b[43m \u001b[49m\u001b[43mlchunk_coords\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1390\u001b[0m \u001b[43m \u001b[49m\u001b[43mlchunk_selection\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1391\u001b[0m \u001b[43m \u001b[49m\u001b[43mout\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1392\u001b[0m \u001b[43m \u001b[49m\u001b[43mlout_selection\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1393\u001b[0m \u001b[43m \u001b[49m\u001b[43mdrop_axes\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mindexer\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdrop_axes\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1394\u001b[0m \u001b[43m \u001b[49m\u001b[43mfields\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mfields\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1395\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1396\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m out\u001b[38;5;241m.\u001b[39mshape:\n\u001b[1;32m 1397\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m out\n", - "File \u001b[0;32m~/opt/miniconda3/envs/benv/lib/python3.10/site-packages/zarr/core.py:2228\u001b[0m, in \u001b[0;36mArray._chunk_getitems\u001b[0;34m(self, lchunk_coords, lchunk_selection, out, lout_selection, drop_axes, fields)\u001b[0m\n\u001b[1;32m 2226\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m ckey, chunk_select, out_select \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mzip\u001b[39m(ckeys, lchunk_selection, lout_selection):\n\u001b[1;32m 2227\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m ckey \u001b[38;5;129;01min\u001b[39;00m cdatas:\n\u001b[0;32m-> 2228\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_process_chunk\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 2229\u001b[0m \u001b[43m \u001b[49m\u001b[43mout\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 2230\u001b[0m \u001b[43m \u001b[49m\u001b[43mcdatas\u001b[49m\u001b[43m[\u001b[49m\u001b[43mckey\u001b[49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 2231\u001b[0m \u001b[43m \u001b[49m\u001b[43mchunk_select\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 2232\u001b[0m \u001b[43m \u001b[49m\u001b[43mdrop_axes\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 2233\u001b[0m \u001b[43m \u001b[49m\u001b[43mout_is_ndarray\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 2234\u001b[0m \u001b[43m \u001b[49m\u001b[43mfields\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 2235\u001b[0m \u001b[43m \u001b[49m\u001b[43mout_select\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 2236\u001b[0m \u001b[43m \u001b[49m\u001b[43mpartial_read_decode\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mpartial_read_decode\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 2237\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 2238\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 2239\u001b[0m \u001b[38;5;66;03m# check exception type\u001b[39;00m\n\u001b[1;32m 2240\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_fill_value \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n", - "File \u001b[0;32m~/opt/miniconda3/envs/benv/lib/python3.10/site-packages/zarr/core.py:2141\u001b[0m, in \u001b[0;36mArray._process_chunk\u001b[0;34m(self, out, cdata, chunk_selection, drop_axes, out_is_ndarray, fields, out_selection, partial_read_decode)\u001b[0m\n\u001b[1;32m 2139\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m ArrayIndexError:\n\u001b[1;32m 2140\u001b[0m cdata \u001b[38;5;241m=\u001b[39m cdata\u001b[38;5;241m.\u001b[39mread_full()\n\u001b[0;32m-> 2141\u001b[0m chunk \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_decode_chunk\u001b[49m\u001b[43m(\u001b[49m\u001b[43mcdata\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 2143\u001b[0m \u001b[38;5;66;03m# select data from chunk\u001b[39;00m\n\u001b[1;32m 2144\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m fields:\n", - "File \u001b[0;32m~/opt/miniconda3/envs/benv/lib/python3.10/site-packages/zarr/core.py:2409\u001b[0m, in \u001b[0;36mArray._decode_chunk\u001b[0;34m(self, cdata, start, nitems, expected_shape)\u001b[0m\n\u001b[1;32m 2407\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_filters:\n\u001b[1;32m 2408\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m f \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mreversed\u001b[39m(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_filters):\n\u001b[0;32m-> 2409\u001b[0m chunk \u001b[38;5;241m=\u001b[39m \u001b[43mf\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdecode\u001b[49m\u001b[43m(\u001b[49m\u001b[43mchunk\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 2411\u001b[0m \u001b[38;5;66;03m# view as numpy array with correct dtype\u001b[39;00m\n\u001b[1;32m 2412\u001b[0m chunk \u001b[38;5;241m=\u001b[39m ensure_ndarray_like(chunk)\n", - "File \u001b[0;32m~/dev/poisson-numcodecs/src/poisson_numcodecs/Poisson.py:45\u001b[0m, in \u001b[0;36mPoisson.decode\u001b[0;34m(self, buf, out)\u001b[0m\n\u001b[1;32m 43\u001b[0m lookup \u001b[38;5;241m=\u001b[39m estimate\u001b[38;5;241m.\u001b[39mmake_anscombe_lookup(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mphoton_sensitivity)\n\u001b[1;32m 44\u001b[0m inverse \u001b[38;5;241m=\u001b[39m estimate\u001b[38;5;241m.\u001b[39mmake_inverse_lookup(lookup)\n\u001b[0;32m---> 45\u001b[0m decoded \u001b[38;5;241m=\u001b[39m \u001b[43mestimate\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mlookup\u001b[49m\u001b[43m(\u001b[49m\u001b[43mbuf\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43minverse\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 46\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m decoded\u001b[38;5;241m.\u001b[39mastype(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdecoded_dtype)\n", - "File \u001b[0;32m~/dev/poisson-numcodecs/src/poisson_numcodecs/estimate.py:106\u001b[0m, in \u001b[0;36mlookup\u001b[0;34m(movie, LUT)\u001b[0m\n\u001b[1;32m 102\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mlookup\u001b[39m(movie, LUT):\n\u001b[1;32m 103\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 104\u001b[0m \u001b[38;5;124;03m Apply lookup table LUT to input movie\u001b[39;00m\n\u001b[1;32m 105\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[0;32m--> 106\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m LUT[np\u001b[38;5;241m.\u001b[39mmaximum(\u001b[38;5;241m0\u001b[39m, \u001b[43mnp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mminimum\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmovie\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mLUT\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msize\u001b[49m\u001b[38;5;241;43m-\u001b[39;49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m)\u001b[49m)]\n", - "\u001b[0;31mUFuncTypeError\u001b[0m: ufunc 'minimum' did not contain a loop with signature matching types (dtype('S375000'), dtype('int64')) -> None" - ] - } - ], + "outputs": [], "source": [ "data_read = photon_data[:]" ] @@ -206,6 +136,16 @@ "id": "328f8c2f", "metadata": {}, "outputs": [], + "source": [ + "photon_data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "69bf017b", + "metadata": {}, + "outputs": [], "source": [] } ], diff --git a/src/poisson_numcodecs/Poisson.py b/src/poisson_numcodecs/Poisson.py index 2d15e21..09f1cd9 100644 --- a/src/poisson_numcodecs/Poisson.py +++ b/src/poisson_numcodecs/Poisson.py @@ -37,12 +37,17 @@ def __init__(self, def encode(self, buf): lookup = estimate.make_anscombe_lookup(self.photon_sensitivity) encoded = estimate.lookup(buf, lookup) - return encoded.astype(self.encoded_dtype) + shape = [encoded.ndim] + list(encoded.shape) + shape = np.array(shape, dtype='uint8') + return shape.tobytes() + encoded.astype(self.encoded_dtype).tobytes() def decode(self, buf, out=None): lookup = estimate.make_anscombe_lookup(self.photon_sensitivity) inverse = estimate.make_inverse_lookup(lookup) - decoded = estimate.lookup(buf, inverse) + ndims = int(buf[0]) + shape = [int(_) for _ in buf[1:ndims+1]] + arr = np.frombuffer(buf[ndims+1:], dtype='uint8').reshape(shape) + decoded = estimate.lookup(arr, inverse) return decoded.astype(self.decoded_dtype)