From 5c323aaf85ec017efd04da7198a89a0240020fe4 Mon Sep 17 00:00:00 2001 From: chzhang Date: Sun, 5 Mar 2023 23:12:53 +0800 Subject: CartPole digitize --- rl/tutorials/07_cart_pole_digitize_space.ipynb | 6117 ++++++++++++++++++++++++ 1 file changed, 6117 insertions(+) create mode 100644 rl/tutorials/07_cart_pole_digitize_space.ipynb diff --git a/rl/tutorials/07_cart_pole_digitize_space.ipynb b/rl/tutorials/07_cart_pole_digitize_space.ipynb new file mode 100644 index 0000000..cb5f703 --- /dev/null +++ b/rl/tutorials/07_cart_pole_digitize_space.ipynb @@ -0,0 +1,6117 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "ExecuteTime": { + "end_time": "2023-03-05T14:51:06.799512Z", + "start_time": "2023-03-05T14:51:05.341809Z" + } + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "import gym\n", + "import matplotlib.pyplot as plt\n", + "from matplotlib import animation" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "ExecuteTime": { + "end_time": "2023-03-05T14:51:07.700234Z", + "start_time": "2023-03-05T14:51:07.690354Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'0.15.4'" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "gym.version.VERSION" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "ExecuteTime": { + "end_time": "2023-03-05T14:51:34.744085Z", + "start_time": "2023-03-05T14:51:31.888070Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Looking in indexes: http://mirrors.aliyun.com/pypi/simple/\r\n", + "Requirement already satisfied: JSAnimation in /Users/chunhuizhang/anaconda3/envs/py3/lib/python3.7/site-packages (0.1)\r\n" + ] + } + ], + "source": [ + "!pip install JSAnimation" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "ExecuteTime": { + "end_time": "2023-03-05T14:51:38.591872Z", + "start_time": "2023-03-05T14:51:38.580628Z" + } + }, + "outputs": [], + "source": [ + "from JSAnimation.IPython_display import display_animation\n", + "from IPython.display import display, HTML" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 重新认识 cartpole 环境" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 小滑块/倒立摆\n", + "- 典型的 mdp(markov decision process)\n", + " - 下一时刻的状态(转移)$s_{t+1}$ 只跟当前状态 $s_t$ 和(当前状态下采取的)$a_t$ 有关\n", + "- action space is discrete and finite\n", + "- state(observation)space is continuous" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "ExecuteTime": { + "end_time": "2023-03-05T14:53:41.857560Z", + "start_time": "2023-03-05T14:53:41.825470Z" + } + }, + "outputs": [], + "source": [ + "env = gym.make('CartPole-v0')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### state/space" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "ExecuteTime": { + "end_time": "2023-03-05T14:54:05.707101Z", + "start_time": "2023-03-05T14:54:05.702533Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([-0.03813489, -0.01010649, -0.02614457, -0.03172028])" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# init space\n", + "env.reset()" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "ExecuteTime": { + "end_time": "2023-03-05T14:54:13.406970Z", + "start_time": "2023-03-05T14:54:13.403812Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Discrete(2)\n" + ] + } + ], + "source": [ + "# action space\n", + "print(env.action_space)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "ExecuteTime": { + "end_time": "2023-03-05T14:54:28.389268Z", + "start_time": "2023-03-05T14:54:28.385064Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2\n" + ] + } + ], + "source": [ + "print(env.action_space.n)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "ExecuteTime": { + "end_time": "2023-03-05T14:55:34.934436Z", + "start_time": "2023-03-05T14:55:34.930442Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Box(4,)\n", + "[-4.8000002e+00 -3.4028235e+38 -4.1887903e-01 -3.4028235e+38]\n", + "[4.8000002e+00 3.4028235e+38 4.1887903e-01 3.4028235e+38]\n" + ] + } + ], + "source": [ + "# observation space\n", + "# https://www.gymlibrary.dev/environments/classic_control/cart_pole/\n", + "print(env.observation_space)\n", + "print(env.observation_space.low)\n", + "print(env.observation_space.high)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### one episode" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "ExecuteTime": { + "end_time": "2023-03-05T14:57:32.225046Z", + "start_time": "2023-03-05T14:57:31.832564Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "step: 1, state: [-0.02012693 0.20925067 0.03958993 -0.29435305]\n", + "step: 2, state: [-0.01594191 0.40378649 0.03370287 -0.57429172]\n", + "step: 3, state: [-0.00786618 0.20820864 0.02221704 -0.27118479]\n", + "step: 4, state: [-0.00370201 0.01277682 0.01679334 0.02842187]\n", + "step: 5, state: [-0.00344647 -0.18258188 0.01736178 0.32635562]\n", + "step: 6, state: [-0.00709811 0.01228863 0.02388889 0.03919801]\n", + "step: 7, state: [-0.00685234 -0.18316759 0.02467285 0.33932136]\n", + "step: 8, state: [-0.01051569 -0.37863177 0.03145928 0.63968147]\n", + "step: 9, state: [-0.01808833 -0.18396223 0.04425291 0.35706915]\n", + "step: 10, state: [-0.02176757 -0.37968447 0.05139429 0.66337121]\n", + "step: 11, state: [-0.02936126 -0.18531377 0.06466172 0.38730339]\n", + "step: 12, state: [-0.03306753 0.00883356 0.07240779 0.1156883 ]\n", + "step: 13, state: [-0.03289086 -0.18724716 0.07472155 0.43030799]\n", + "step: 14, state: [-0.03663581 0.00674154 0.08332771 0.16208459]\n", + "step: 15, state: [-0.03650098 -0.18946834 0.0865694 0.47984822]\n", + "step: 16, state: [-0.04029034 -0.38569887 0.09616637 0.79851137]\n", + "step: 17, state: [-0.04800432 -0.19201853 0.11213659 0.53756254]\n", + "step: 18, state: [-0.05184469 0.00136303 0.12288785 0.28221117]\n", + "step: 19, state: [-0.05181743 0.19453743 0.12853207 0.0306729 ]\n", + "step: 20, state: [-0.04792668 0.38760429 0.12914553 -0.21885405]\n", + "step: 21, state: [-0.0401746 0.19089548 0.12476845 0.1116153 ]\n", + "step: 22, state: [-0.03635669 -0.00577295 0.12700075 0.44091157]\n", + "step: 23, state: [-0.03647215 -0.20244188 0.13581898 0.770777 ]\n", + "step: 24, state: [-0.04052098 -0.00942435 0.15123452 0.52372515]\n", + "step: 25, state: [-0.04070947 -0.20631499 0.16170903 0.85998375]\n", + "step: 26, state: [-0.04483577 -0.0137211 0.1789087 0.62219743]\n", + "step: 27, state: [-0.04511019 0.17851121 0.19135265 0.39077045]\n", + "step: 28, state: [-0.04153997 -0.01873813 0.19916806 0.73715912]\n", + "step: 29, state: [-0.04191473 0.17315764 0.21391124 0.51317475]\n" + ] + } + ], + "source": [ + "env = gym.make('CartPole-v0')\n", + "# observation = env.reset()\n", + "state = env.reset()\n", + "steps = 0\n", + "frames = []\n", + "while True:\n", + " frames.append(env.render(mode='rgb_array'))\n", + " action = env.action_space.sample()\n", + " state, reward, done, info = env.step(action)\n", + " steps += 1\n", + " print(f'step: {steps}, state: {state}')\n", + " if done:\n", + " break" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "ExecuteTime": { + "end_time": "2023-03-05T14:58:23.485976Z", + "start_time": "2023-03-05T14:58:23.446404Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[array([[[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " ...,\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]]], dtype=uint8),\n", + " array([[[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " ...,\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]]], dtype=uint8),\n", + " array([[[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " ...,\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]]], dtype=uint8),\n", + " array([[[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " ...,\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]]], dtype=uint8),\n", + " array([[[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " ...,\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]]], dtype=uint8),\n", + " array([[[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " ...,\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]]], dtype=uint8),\n", + " array([[[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " ...,\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]]], dtype=uint8),\n", + " array([[[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " ...,\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]]], dtype=uint8),\n", + " array([[[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " ...,\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]]], dtype=uint8),\n", + " array([[[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " ...,\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]]], dtype=uint8),\n", + " array([[[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " ...,\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]]], dtype=uint8),\n", + " array([[[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " ...,\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]]], dtype=uint8),\n", + " array([[[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " ...,\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]]], dtype=uint8),\n", + " array([[[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " ...,\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]]], dtype=uint8),\n", + " array([[[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " ...,\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]]], dtype=uint8),\n", + " array([[[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " ...,\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]]], dtype=uint8),\n", + " array([[[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " ...,\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]]], dtype=uint8),\n", + " array([[[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " ...,\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]]], dtype=uint8),\n", + " array([[[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " ...,\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]]], dtype=uint8),\n", + " array([[[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " ...,\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]]], dtype=uint8),\n", + " array([[[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " ...,\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]]], dtype=uint8),\n", + " array([[[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " ...,\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]]], dtype=uint8),\n", + " array([[[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " ...,\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]]], dtype=uint8),\n", + " array([[[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " ...,\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]]], dtype=uint8),\n", + " array([[[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " ...,\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]]], dtype=uint8),\n", + " array([[[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " ...,\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]]], dtype=uint8),\n", + " array([[[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " ...,\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]]], dtype=uint8),\n", + " array([[[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " ...,\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]]], dtype=uint8),\n", + " array([[[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " ...,\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]],\n", + " \n", + " [[255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " ...,\n", + " [255, 255, 255],\n", + " [255, 255, 255],\n", + " [255, 255, 255]]], dtype=uint8)]" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "frames" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "ExecuteTime": { + "end_time": "2023-03-05T14:58:41.531828Z", + "start_time": "2023-03-05T14:58:41.527026Z" + } + }, + "outputs": [], + "source": [ + "def display_frames_as_gif(frames, output):\n", + " \"\"\"\n", + " Displays a list of frames as a gif, with controls\n", + " 以gif格式显示关键帧列,带有控件\n", + " \"\"\"\n", + " \n", + " fig = plt.figure(figsize=(frames[0].shape[1]/72.0, frames[0].shape[0]/72.0),dpi=72)\n", + " patch = plt.imshow(frames[0])\n", + " plt.axis('off')\n", + " \n", + " def animate(i):\n", + " img = patch.set_data(frames[i])\n", + " return img ## *** return是必须要有的 ***\n", + " \n", + " anim = animation.FuncAnimation(plt.gcf(), animate, frames=len(frames), interval=50)\n", + " \n", + " anim.save(output)\n", + " return HTML(anim.to_jshtml()) ## *** 返回一个HTML对象,以便被调用者显示。 ***\n", + " # display(display_animation(anim, default_mode='loop'))" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "ExecuteTime": { + "end_time": "2023-03-05T14:59:09.169623Z", + "start_time": "2023-03-05T14:58:48.224146Z" + }, + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + " \n", + "
\n", + " \n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + "
\n", + "
\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA5gAAAJqCAYAAABO5e8bAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8/fFQqAAAACXBIWXMAAAsTAAALEwEAmpwYAAAZ0ElEQVR4nO3d24+c9X3H8e8zswevd9c2azBgDDjYhFKcQBNOappDISGVorYJyUW5iSKlaar0pv9Aep8qV1V70fYiPYioEWlaNQpNEwRtmjSQACKACWAOBtvYgI9r7N317szTizgujbC9O/7O/GZ2Xi/JF+tnft7P3ejtZw5VXdcBAAAAF6pRegAAAACrg8AEAAAghcAEAAAghcAEAAAghcAEAAAghcAEAAAgxch5rvsOEwAAAN6uOtsFdzABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIMVJ6AAAMo7kj+2NpbjYiIsbXXxpjkxvKDgKABAITAAo48MR34/CuhyMiYt2VO2LtxVedubZpxx0xOjFdahoAdExgAkBhs3uejtk9T5/5+dirT0VjZCwiIhojY7H941+KqKrTV6toND19A9Cfqrquz3X9nBcBgJVbnJuN3Q/9Xczu3bmsx1eN/wvKtRdfGdd89I9ibGqmW/MA4Hyqs13wIT8A0GOze3YuOy4jIur20pk/J954OQ6dfmktAPQbgQkAA2TtxVfFzPbbSs8AgHckMAFggDTH1sb49MbSMwDgHQlMAOih1qm5OPbqU6VnAEBXCEwA6KHWqbk48tJjnf8D1Vk/VwEAihOYADAgGiNjse1jXyw9AwDOSmACwAD55fdjAkA/EpgA0CN1Xcfeh79ZegYAdI3ABIAeeuvACx2fHZu+OHEJAOQTmAAwILZ+5HNRNZqlZwDAWQlMAAAAUghMAOiRV//73lg8OVt6BgB0jcAEgB5pLc5HRN3R2clN74rRiencQQCQTGACwADY8K73xdjUTOkZAHBOAhMAeqB1aj7aSwulZwBAVwlMAOiBIy89GsdeebL0DADoKoEJAH1uYmZLrL9qR+kZAHBeAhMAuqxut2Jp4UTH50cn18fERZsTFwFAdwhMAOiyheOHYt8j3yo9AwC6TmACQB+rmqOxacedpWcAwLIITADoY1WjGeu2XF96BgAsi8AEgC6q6zqO73u29AwA6AmBCQBd9tqj/1Z6AgD0hMAEgD52zZ1fiIiq9AwAWBaBCQB9bGzqoqgqgQnAYBCYANBFh577UbQW50vPAICeEJgA0EXH9uyMurXY0dmqORrh7iUAA0RgAkCfuuLWT8WaDZeXngEAyyYwAaCPef8lAINEYAJAlxx+8adxfN/PS88AgJ4RmADQJUvzJ6J1aq6jsyNrpmN8emPyIgDoLoEJAH1o8tJrYsPWm0rPAIAVEZgA0AV1XUfdXio9AwB6SmACQBcsHHs99j78zdIzAKCnBCYAdEtdd3Ssao7GzPZbk8cAQPcJTADoM42R0bjomveXngEAKyYwASBZXddx8tDe0jMAoOcEJgB0was//HrpCQDQ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UghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUoyc53rVkxUAAAAMPHcwAQAASCEwAQAASCEwAQAASCEwAQAASCEwAQAASCEwAQAASPG/e2QgBt5rhWsAAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA5gAAAJqCAYAAABO5e8bAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8/fFQqAAAACXBIWXMAAAsTAAALEwEAmpwYAAAZ0ElEQVR4nO3d24+c9X3H8e8zswevd9c2azBgDDjYhFKcQBNOappDISGVorYJyUW5iSKlaar0pv9Aep8qV1V70fYiPYioEWlaNQpNEwRtmjSQACKACWAOBtvYgI9r7N317szTizgujbC9O/7O/GZ2Xi/JF+tnft7P3ejtZw5VXdcBAAAAF6pRegAAAACrg8AEAAAghcAEAAAghcAEAAAghcAEAAAghcAEAAAgxch5rvsOEwAAAN6uOtsFdzABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIITABAABIMVJ6AAAMo7kj+2NpbjYiIsbXXxpjkxvKDgKABAITAAo48MR34/CuhyMiYt2VO2LtxVedubZpxx0xOjFdahoAdExgAkBhs3uejtk9T5/5+dirT0VjZCwiIhojY7H941+KqKrTV6toND19A9Cfqrquz3X9nBcBgJVbnJuN3Q/9Xczu3bmsx1eN/wvKtRdfGdd89I9ibGqmW/MA4Hyqs13wIT8A0GOze3YuOy4jIur20pk/J954OQ6dfmktAPQbgQkAA2TtxVfFzPbbSs8AgHckMAFggDTH1sb49MbSMwDgHQlMAOih1qm5OPbqU6VnAEBXCEwA6KHWqbk48tJjnf8D1Vk/VwEAihOYADAgGiNjse1jXyw9AwDOSmACwAD55fdjAkA/EpgA0CN1Xcfeh79ZegYAdI3ABIAeeuvACx2fHZu+OHEJAOQTmAAwILZ+5HNRNZqlZwDAWQlMAAAAUghMAOiRV//73lg8OVt6BgB0jcAEgB5pLc5HRN3R2clN74rRiencQQCQTGACwADY8K73xdjUTOkZAHBOAhMAeqB1aj7aSwulZwBAVwlMAOiBIy89GsdeebL0DADoKoEJAH1uYmZLrL9qR+kZAHBeAhMAuqxut2Jp4UTH50cn18fERZsTFwFAdwhMAOiyheOHYt8j3yo9AwC6TmACQB+rmqOxacedpWcAwLIITADoY1WjGeu2XF96BgAsi8AEgC6q6zqO73u29AwA6AmBCQBd9tqj/1Z6AgD0hMAEgD52zZ1fiIiq9AwAWBaBCQB9bGzqoqgqgQnAYBCYANBFh577UbQW50vPAICeEJgA0EXH9uyMurXY0dmqORrh7iUAA0RgAkCfuuLWT8WaDZeXngEAyyYwAaCPef8lAINEYAJAlxx+8adxfN/PS88AgJ4RmADQJUvzJ6J1aq6jsyNrpmN8emPyIgDoLoEJAH1o8tJrYsPWm0rPAIAVEZgA0AV1XUfdXio9AwB6SmACQBcsHHs99j78zdIzAKCnBCYAdEtdd3Ssao7GzPZbk8cAQPcJTADoM42R0bjomveXngEAKyYwASBZXddx8tDe0jMAoOcEJgB0was//HrpCQDQ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UghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUghMAAAAUoyc53rVkxUAAAAMPHcwAQAASCEwAQAASCEwAQAASCEwAQAASCEwAQAASCEwAQAASPG/e2QgBt5rhWsAAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "display_frames_as_gif(frames, output='./save/rand_cartpole.gif')\n", + "display_frames_as_gif(frames, output='./save/rand_cartpole.mp4')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 状态离散化" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "ExecuteTime": { + "end_time": "2023-03-05T15:01:26.306200Z", + "start_time": "2023-03-05T15:01:26.301178Z" + } + }, + "outputs": [], + "source": [ + "NUM_DIGITIZED = 6\n", + "\n", + "# 分桶, 5个值,对应 6 个分段,即 6 个桶 (0, 1, 2, 3, 4, 5)\n", + "def bins(clip_min, clip_max, num_bins=NUM_DIGITIZED):\n", + " return np.linspace(clip_min, clip_max, num_bins+1)[1:-1]\n", + "\n", + "# 按 6 进制映射将 4位 6 进制数映射为 id,\n", + "def digitize_state(observation):\n", + " pos, cart_v, angle, pole_v = observation\n", + " digitized = [np.digitize(pos, bins=bins(-2.4, 2.4, NUM_DIGITIZED)), \n", + " np.digitize(cart_v, bins=bins(-3., 3, NUM_DIGITIZED)), \n", + " np.digitize(angle, bins=bins(-0.418, 0.418, NUM_DIGITIZED)), \n", + " np.digitize(pole_v, bins=bins(-2, 2, NUM_DIGITIZED))]\n", + " # 3,1,2,4 (4位10进制数) = 4*10^0 + 2*10^1 + 1*10^2 + 3*10^3,最终的取值范围是 0-9999,总计 10^4 == 10000\n", + " # a,b,c,d (4位6进制数) = d*6^0 + c*6^1 + b*6^2 + a*6^3,最终的取值范围是 0-`5555`(1295),总计 6^4 == 1296\n", + " ind = sum([d*(NUM_DIGITIZED**i) for i, d in enumerate(digitized)])\n", + " return ind\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "ExecuteTime": { + "end_time": "2023-03-05T15:01:29.874797Z", + "start_time": "2023-03-05T15:01:29.871656Z" + } + }, + "outputs": [], + "source": [ + "obs = env.reset()" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "ExecuteTime": { + "end_time": "2023-03-05T15:01:31.165281Z", + "start_time": "2023-03-05T15:01:31.161059Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 0.04002152, 0.00259074, -0.03391407, -0.04418303])" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "obs" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "ExecuteTime": { + "end_time": "2023-03-05T14:25:41.628539Z", + "start_time": "2023-03-05T14:25:41.625136Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([-1.6, -0.8, 0. , 0.8, 1.6])" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bins(-2.4, 2.4, NUM_DIGITIZED)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.7.3" + }, + "toc": { + "base_numbering": 1, + "nav_menu": {}, + "number_sections": true, + "sideBar": true, + "skip_h1_title": false, + "title_cell": "Table of Contents", + "title_sidebar": "Contents", + "toc_cell": false, + "toc_position": {}, + "toc_section_display": true, + "toc_window_display": false + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} -- cgit v1.2.3