Atcoder173反省会(Bit全探索,strからchar変換,etc)
Python使用者です。慣れたらC++の訓練所としても用いたいなぁと思ってます,
Atcoder173所感
- 数え方にまつわる問題が多い?A~Dを解いた。
- C:全探索
- D:中学入試っぽいパズル問題
20分遅れで始めたがギリギリ4問解けた。E,Fが時間内に解ける日は遠そう…
各設問の反省や学習事項
C:Bit全探索
maskを作成してnumpyで行列のAndを*
演算子で取る手法を思いついた。OpenCV脳である。
自分的には初めてBit全探索を行った。正攻法ならitertools
を使うらしい。
Pythonでお手軽にbit全探索を行う方法【itertoolsを使おう!】 | プログラミングの教科書
itertools.product( “候補となるオブジェクトの集合”, “選ぶ回数” )
で書けるため以下のように簡単にできる。
print(list(itertools.product([0,1], repeat=2))) #[(0, 0), (0, 1), (1, 0), (1, 1)]
今回,itertools.product([0,1], repeat=W)
などと書けば簡単にBit演算表が作れていた。
2進数変換を用いたBit全探索
試験中はググる前に自分で書けそうなので自分で書いた。(時間がかかった)
大枠としては以下の通り。
for h in range(2 ** H): for w in range(2 ** W): # 各要素1 or 0 のiteratorリストを作る … #ループさせる関数 …
iterのリストの作り方
hやwが特定の値の時にその値をH桁,W桁の2進数表記リストにしたかった。
hが3,Hが4の時
[0,1,1,1]
のような出力が欲しい。
用いた要素は以下の3つ。
bin()
:2進数表記へ変換する関数。0b~~
のstrで値を出してくる。zfill(n)
:strの先頭をn桁になるまで'0'で埋めてくれる関数- split:
'10010'
みたいなstrを数のリスト[1, 0, 0, 1, 0]
に変換する自作関数
まず,文字列を得るには:
# 7を4桁の2進数にする。binの後ろ二桁を抜き出して桁数に会うように0でfill w0b = bin(7)[2:].zfill(4)
その後,
# splitは予約されていることが多いので関数名は別にするのが良い。 def split(word): return [int(char) for char in word] # we got [0,1,1,1] split(w0b)
余談:Str から Charの変換で沼った
for文で抜き出すか,iterで一個一個読むか? 後で考える。
D
ひらめき問題だったので今のとこ特に書くことなし。
.sort()
は元の関数の順序を変えるので使わない- sortは基本昇順だが
sorted(A, reverse=True)
のように書けば降順になる - 復習:ソートの計算量はNlogN
Python Numpyを用いてナップザック問題をDPで解く(Atcoder例題)
Pythonでナップザック問題どうやって解くんだっけ?というときに参照するページです。 Atcoderなどリアルタイム性が必要なときはC++かPyPyで実装すること(戒め)
ナップザック問題説明
省略。Wikiとかを見てください。アルゴリズムの理解は以下の記事がわかりやすいと思います。
Atcoder問題例
2020年6月13日に行われた東京海上主催のAtcoderのD問題のために書き起こしました。
なお,私は Pythonでの高速化に失敗しTLEを連発し敗北しました。
解決策として Numpyを使いながらjitなどで高速化するか,Numpyを廃してPyPyで実装するか,C++に乗り換えるかしましょう。
PythonのDPコード Numpy有
入力は4つ,今回は入力は全て正の整数とします。唯一価値だけは非整数でも大丈夫です。
- N:品物の数
- W:重さの制限
- weight:価値のリスト
- weight:重さのリスト
def solveDP(N, W, value, weight): dp = np.zeros((N+1, W+1)) for i in range(N): for w in range(W+1): if w >= weight[i]: dp[i + 1, w] = max(dp[i, w - weight[i]] + value[i], dp[i, w]) else: dp[i + 1, w] = dp[i, w] return dp[N , W]
PythonのDPコード Numpyなし
以下のサイトから拝借しました。
Pythonで解くナップサック問題【動的計画法(DP)入門】 - nashidos’s diary
やってることは全く同じです。ただ,こちらはNumpyを使わないのでPyPyでも使えるという利点があります。 Atcoderではこちらを使いましょう(涙)。
def solveDP(N,W,v,w): dp = [[0]*(W+1) for j in range(N+1)] # DPテーブルの作成 for i in range(N): for j in range(W+1): if j < w[i]: # 選ばない時 dp[i+1][j] = dp[i][j] else: # 選ぶ時 dp[i+1][j] = max(dp[i][j],dp[i][j-w[i]]+v[i]) return dp[N][W]
ちなみに6/13に行われたこのコンテスト,Python勢には辛かったらしく,PythonでC問題を通したのが3人,Dが1人でした。
Pythonはプレミ。
ベイズの定理を用いてカルマンゲインを導出する(行列版)
Background
カルマンフィルタにはたくさんの導出がありますが, 自分的には大まかに以下の2つのパターンを把握していれば実用上は十分だと考えています。
(なお超初心者の場合はとりあえずコードを書いて動かして見た方が理解しやすいと思います。)
オブザーバから導出するパターン
前者の例として,足立先生の「カルマンフィルタの基礎」をおすすめします。
ネタバレすると,証明は線形の(濾波型)オブザーバを設計し,ガウス分布で表される誤差が線形に伝搬する性質を用いて推定後の共分散を最小化するオブザーバゲインKを求める(平方完成)となっています。
似たアプローチとして超平面に垂線をおろす図形的なアプローチが合った気がしますが忘れてしまいました… 思い出したら書きます。
ベイズの定理から導くパターン
こちらは「確率ロボティクス」の書籍を見ると詳しくわかると思います。
確率ロボティクス (Mynavi Advanced Library)
- 作者:Sebastian Thrun,Wolfram Burgard,Dieter Fox
- 発売日: 2015/04/02
- メディア: Kindle版
以下のベイズの定理と,
の式から導出できます。
ベイズの定理から多変数カルマンフィルタのゲインを導出
確率ロボティクスに倣って導出します。 基本的な流れは先程のブログとほぼ同じです。書きやすいように表記を少しいじっていますが,恐らく意味を大きく損なわないと思います。
前提
とりあえずよく見る線形状態方程式を仮定します。
はそれぞれシステムノイズと観測ノイズでその分散は,とします。
予測
予測にはベイズの定理を使いません。
nステップでの推定値の分布の平均を 分散とすると, 予測値の分布の平均と分散は,
となります。
計測更新
ベイズの定理から予測における推定値とセンサ出力の分布からセンサ情報を考慮したときの推定値の分布がわかります。
ここで,は平均と分散のガウス分布なので,
また,観測の分布は
と表せます。
したがって,ベイズの定理を用いてこれらをかけ合わせた場合の推定値の確率分布は
となります。
このexpの肩が極小値になる時がガウス分布の極大,すなわち分布の平均値,つまり最尤値になるので,
が極大となるを求めます。
一回微分して=0の条件から,
よって共分散行列は対称行列より
したがって推定値の平均は,
また,分散はJの二階微分から明らかで,
となります。
式変形によるカルマンゲインの導出
先程の展開からカルマンゲインは
を満たすので,係数比較から以下のように導けます。
見慣れた形と違いますね?この式に右からをかけて整理することでよく見るカルマンゲインの式が得られます。
長くなりましたが,これが確率ロボティクスの教科書に倣ったベイズの定理からのカルマンゲインの導出になります。
教科書のほうが丁寧なのでそちらを参照していただければと思いますが,研修中や電車の中など時間のあるときに自分で1から計算することで理解がより深まるのではないかと思います。
余談
はてなでTex記法
はてなブログでTex記法を書こうとすると通常の書き方から大きく変えることが多かったため,回避策として以下のブログを参考にしました。
親知らずなど抜歯後にも噛まずに食べられるもののおすすめリスト
先週末に下の埋没した親知らずを手術によって取り出しました。 はっきりいって人生1,2を争う痛さです。フガフガ。
- 親知らず抜歯後の食事
- 流動食できちんと栄養をとるのは大変!
- 1日に必要なカロリー・栄養分
- 流動食 Level1:完全な液体
- 流動食 Level2:ゼリー状の食事
- 流動食? Level3:食事を刻む
- まとめ
- 番外編:失敗
親知らず抜歯後の食事
親知らずの抜歯,痛いですよね。
親知らず抜歯後の食事を妨げる要因として以下の2つが考えられます。
- 顎の痛みがひどくて噛んだり飲んだりが難しい
- 出血によって食べ物が血の味がする
無論,抜いた歯の状況(上顎か下顎か,埋没しているかどうか)によって抜歯後の状況は変わってきます。 一応参考までに載せます。
上顎・非埋没歯
上顎の非埋没歯の抜歯はあまり痛みを感じず,すぐに抜くことができます。
痛みも一時的で出血も1日程度で止むため2,3日すれば通常復帰できます。
私は抜いた日の晩にはラーメンを食べてました。
下顎・埋没歯
下顎は太い神経が近いため痛みがひどくなりやすく,埋没してる場合は切開なども入るので最悪です。3日間は顔がパンパンに腫れ,痛み止めとともに暮らしました。
母曰く出産の6割程度の痛みだそうです。お母さんたちすご…
ここで最大の問題となるのは抜歯後には痛みなどで噛んで食事をとることができないということです。
特に私の場合,縫合した部分が上の歯に引っかかって少なくとも抜糸までの14日間噛めない生活が続きそうです。
流動食できちんと栄養をとるのは大変!
本来の流動食の定義と少しずれますが,ここでは噛まずに食べれるものを流動食と呼称します。
流動食生活7日目を終えた感想としては,きちんとカロリーを摂取するのがとても大変!ということです。
1日に必要なカロリー・栄養分
1日に最低限必要なカロリーを「代謝で使われる分」だと仮定します。
以下のサイトで説明されていますが標準体型の男性では1500kcal前後のようです。 女性や小柄な方は1200kcalでも良さそうですが,とにかくそれくらい必要なのです。
例えばウィダーゼリーやカロリーメイトのゼリー飲料などは100-200kcal程度しかありません。 1日に7~8個飲む必要がありますが,体感なかなかそこまでの量を飲めないと思います。
ゼリーだけで食事をするのは栄養価意外の面でも少しキツイです。(ただ,飲み物を飲んで200kcal取れるのは破格です。)
大塚製薬 カロリーメイト ゼリー アップル味 215g×24袋
- 発売日: 2016/05/23
- メディア: 食品&飲料
なお,筆者は決して少食ではなく二郎系ラーメンが好物でヤサイマシマシを食える程度には胃の容量がある方で,単に食事を全てゼリー飲料に代替するのは結構辛いということだと思います。
流動食 Level1:完全な液体
- ○:術後すぐに飲める
- ○:飲みやすい
- △:味が薄いと血がにじむ
- ✖:カロリーが取りづらい
牛乳,飲むヨーグルト等
最初に手を出したのが牛乳や飲むヨーグルトです。 どちらも,カロリーは60kcal/100ml 程度です。
- 飲むヨーグルトは甘いので牛乳で割ってラッシー風にすると飲みやすい
- 牛乳はプレーンなのでミロやココアなど味変がしやすい
- 味が濃く,出血時も血の味を感じにくい
- 牛乳だけで最低限の栄養をとろうとすると2L飲まなければ行けない
飲みやすいですがカロリーをとるのが大変です。 この他にもプロテイン飲料や豆乳もこのカテゴリに入ります。
コーンスープ(うらごし)
塩気に飢えていたときに飲んだので非常に美味しかったと印象に残っています。
スジャータ コーンクリームポタージュ 裏ごし 900g紙パック×6本入
- メディア: その他
カップスープや味噌汁も飲みましたが,具材が極力ないものを選ぶ必要があったり飲んでもたいしてカロリーを稼げないものが多かった中でコーンスープは重宝しました。
- 液体系でカロリーがそこそこある(85kcal/dL)
- 飲みやすく食事感もある
- 一週間くらい飲み続けていると流石に飽きる
これは主戦力足り得るので常備しました。
栄養ドリンク・野菜ジュースなど
- ビタミンなどを摂取するのには良い
- 甘すぎるのでたくさん飲めない場合が多い
- 味が濃いので出血してても美味しく飲める
- 患部にしみる場合があり注意が必要
ジューサーがある人は生搾りのジュースを作っても良いと思います。
これも貴重な栄養源なので常備しました。
カロリーメイト ドリンク
常備その3。
- 量あたりのカロリーが高く飲みやすい(牛乳の約二倍の効率)
- ちょっと高い
朝食やちょっとしたエネルギー不足を補うにはもってこいでした。やカ神。
流動食 Level2:ゼリー状の食事
- ○:食べやすく,一部食べごたえもある
- ○:栄養価もそこそこ
- ✖:高いことが多い
ゼリー飲料・ゼリー
ゼリー飲料は飲みやすく,カロリーもそれなりに取れるので最初の方はよくのんでました。
しかし想像以上にゼリーというのは飲みづらいものです。 牛乳を1L飲むのはそう苦ではないですが,ゼリーを1L飲むのはまぁまぁ大変です。
大塚製薬 カロリーメイト ゼリー アップル味 215g×24袋
- 発売日: 2016/05/23
- メディア: 食品&飲料
- 簡単に食べれる
- ちょっと高め
- たくさん食べるのに向いていない
豆腐料理
食べやすさ,味付けの多彩さ,食べごたえ全て◎の無敵超人,それが豆腐料理です。
私が食べてたスンドゥブは200kcal前後ですが,そこに生卵を割り入れることで栄養的にも幾分マシなものができます。
- 食べやすさ,味付けの多彩さ,食べごたえ全て◎
- これに頼りすぎるかもしれない
甘酒
実家では風邪ひきの時に甘酒に卵を入れて煮込んだものをよく食べてました。 安い缶のやつではダメで,でろっとした濃いものを使ってください。うまいです。高いけど。
- うまい
- 高い
流動食? Level3:食事を刻む
- 汁物の食事などをぐでぐでにするか,刻むなどして食べる
この段階まで来ると流動食?って感じですが食べた中ではワンタンが食べやすかったのでおすすめです。
イメージ画像がないので以下載せますが私が食べたのはチルドのワンタンです。
まとめ
手間を掛けないなら牛乳系と豆腐料理で凌ぐのが楽そうです。
スムージーやミキサーがあればもうちょっと幅が出て良いかもしれません。
短期決戦における1日の流動食メニュー例
現時点では以下のように落ち着きつつあります。
体調について
1日の摂取カロリーが少ないのでなんかやたら眠くなったり,一気に3キロ位痩せたりしました。俺の筋肉を返せ
多分致命的には悪くなってないはず。
ダイエットにも効果的でしょうが身体を壊しては元も子もないので気をつけて。
https://www.buzzfeed.com/jp/carolinekee/liquid-diets-cleanses-help-lose-weight-1
余談:ディスカバリーチャンネル
関係ないけど飢えといえばエドスタフォードのサバイバルを思い出します。 面白いので是非見てください。
番外編:失敗
お粥など
風邪ひきの定番といえばお粥です。 なんどかチャレンジしましたが,
- 食えることは食える
- ✖:血の味がつきやすくそうなると非常にまずい
ということで以後作るのはやめました。
ちねりうどん?
もう少しマシな選択肢として,うどんを細かくしたものをグデグデになるまで煮込むというのがあります。
- めんつゆなどの濃い味付けで血の味が気になりにくい
- それでもあんまり量は食べられなかった(~4日目の感想)
8日目とかならもっとガンガン食べれるのかな?
焼き鳥(しかも鶏皮)
途中で油分のカロリーが高いことに気づいて買いましたが,ただでさえ噛むのが大変な鶏皮をどうして噛まずに食えると思ったのか…
判断力の低下には気をつけなくてはいけません。もったいないので包丁で微塵にして飲みました。 ミキサーがあれば手っ取り早くカロリーを摂取できるかもしれませんね。
味は保証しませんが。
ポテチ
ポテチもカロリー面につられて買いました。 堅揚げポテトなんかは一袋500kcalを越す夢のカロリーダイナマイトなので粉状にして摂取するのを検討しましたが口の中をパサパサするので食べにくさもダイナマイト級で断念しました。
唯一味はポテチだったので味だけ見ればかなり良い体験でした。飲み込むまでが食事なんですけどね。
vscode上でマークダウンを使ってスライドを作る。(Marp, Reveal.js)
スライドをいちいちGUIで作るのはだるい,時々よくあることだと思います。
Markdown形式のメモをそのままスライドにする(実際はちょっといじるんだけど)手法について個人的な設定をメモ・紹介します。
Abstract
- マークダウン形式で簡単に発表資料を作る。
- 2020年5月現在,Marpがオススメできる。
本記事における環境
手法紹介・総評・雑感
Markdownでスライドのようなものを作成する手法にはいくつかあります。 例えば以下の記事でもいくつか紹介されてますね。
今回は手元のvscode上で書いてその場でPreviewしたいので以下のものを試しました。
- Reveal.js:動きがかっこ良く,発表向け。スライドはカスタマイズしないと大味な感じ。
- Marp:静的なスライド作成。設定がデフォルトでもそこそこ見やすい。
ということでReveal.jsよりも今回はMarpを重点において紹介します。
Marp書き方
Marpの基礎的な文法について述べます。
まずはvscode-marp
を拡張機能からインストールしてきます。
スライドを構成する最小要素は
--- marp: true --- # ページ1 `---`でスライド追加 --- # ページ2
です。ここから設定を追加していきます。
現時点での個人設定例
- themeをgaiaに
- headerとfooterを追加
- 16:9に
- ページナンバーをつける
- 図を中央に表示
--- marp: true theme: gaia header: '' footer: '@ossyaritoori' size: 16:9 page_number: true paginate: true --- <!-- コメント:画像を中央に配置する centerコマンドを有効に --> <style> img[alt~="center"] { display: block; margin: 0 auto; } </style>
一部,個別に見ていきましょう。
スライドのテーマ
デフォルトではスライドのテーマは以下の3つのようです。
default
: 白色中央寄せgaia
: クリーム色タイトル上部固定(一番使いやすい)uncover
: 書式なし
また,サブテーマというものがあり,各ページごとに設定できます。 gaiaの場合はデフォルト含めて4種類あります。
書き方は以下の通り。全体をいじるか,1スライド毎に設定もできます。
<!-- 全体を色反転 --> <!-- class : invert --> <!-- 1スライドを色反転 --> <!-- _class : invert -->
個人的に使えると思ったのは,タイトルを色反転かつ中心揃えにすることで,以下のように書けます。
<!-- タイトル用書式:色反転+中央寄せ --> <!-- _class : lead invert-->
ページ番号
古い記述ではpage_number
を用いていますが,2020年5月のv0.13.0
では,
paginate: true
のみでページ番号をFooterの位置に出現させられます。
全体のページ数をカウントして表示するのも欲しいですね。
図を中央に配置する
- デフォルトでは図は左に配置されます。
- 改行なしで並べると図は下面を揃えて左右に並びます。
テンプレにある書き方をすることで図を左右中央揃えに制御できます。上下も中央揃えにしたいですね。
図の貼り付け・サイズ調整
図はMarkdown,htmlの両方の記法が使えます。
縦・横を指定して画像を貼る
他の文献では![倍率%](画像url)
で画像のサイズ調整ができたようですが,手元のv0.13.0
ではまだできません。
代わりに,![w:300](画像URL)
と書いています。
元のサイズとの比を見るより横幅などで指定した方がよく見えます(縦指定でも可)。
背景として画像を貼る
また,![bg w:300](画像URL)
のようにbgを入れることにより背景画像としても指定できます。
これはデフォルトで中央揃えです。
また背景と文章を分割することも出来,以下のように書きます。
# 背景 右50%領域に ![bg right:50% cover](sky.jpg)
- cover(default): 縦か横に合わせる
- contain(fit):はみ出ないように合わせる
- auto:オリジナルサイズで貼る
おそらくよくつかうのはcoverかcontainだと思います。
数式
数式はKatex形式をサポートしているようです。 今の所特に語ることはないですが,項目として残しておきます。
サンプルスライド(自分テンプレート)
--- marp: true theme: gaia header: 'header text' footer: '@ossyaritoori' size: 16:9 paginate: true --- <!-- コメント:画像を中央に配置する centerコマンドを有効に --> <style> img[alt~="center"] { display: block; margin: 0 auto; } </style> <!-- タイトル用書式:色反転+中央寄せ --> <!-- _class : lead invert--> # タイトルスライド - 日付:名前 - 概要: - Issue1 - Issue2 --- ## 普通のスライド - Problem1 - Answer1
こうなります。
Marpの参考資料
- 基礎的な文法(vscode版に準拠しておらず,動かないコードもある)
- Advancedな内容
www.slideshare.net
- 自分でMarpのThemeをカスタマイズする
- Marpの開発に関わる話
余談:GIF画像をキャプチャするソフト
Reveal.jsの紹介に使った,スクリーンをGIFでキャプチャするソフトです。 結構便利。
オンラインで友人とボードゲームが遊べるボードゲームアリーナをやってみた所感
ボードゲームアリーナとは
という自宅待機民にうってつけのサービスです。 一部人気ゲーム(カルカソンヌ等)は有料ですが,無料のものだけでも十分に楽しむことができると思います。
ボードゲームはセットアップや片付けが大変なので非常に便利です。
同じ様な紹介記事を書いているかたがこちら。
環境と登録方法
PC版はインストールも不要で非常に便利です。Google連携が楽かなと思います。
友達と遊ぶまでに必要なステップ
- 友人にアカウントを作ってもらう
- 「username」を検索してフレンド追加
でOKです。
ボードゲームアリーナを友達とプレイする方法! - せいたかのっぽの備忘録
(補足)画面共有をすれば1人分のアカウントでもできるかもしれませんが
「今すぐプレイ」から以下のように追加していきます。
ゲーム画面に移行後,相手が「承認」してくれるのを待ちます。
ゲームを受ける人は,画面上に出てくるポップアップから承認をします。
友人と遊ぶ際の通話環境
プレミアム会員になるとビデオやチャットを使えますが,普通に外部のサービスで通話すればいいです。
使ったことがあるのは以下の通りです。
- LINE:手軽,大体の人が持っている。
- Skype:年代によっては結構な人が持っている。
- Zoom:画面共有がルール解説に非常に便利。近年普及したので持っている人は多いかもしれない。
- discord:音声通話の品質が高い。あまり使ってる人がいない?
2人ゲーム初プレイ所感
ここから本題ですがいくつかのゲームを2人でやったのでその感想についてレビューしていきます。
なお,筆者のボードゲーム経験は中程度(~30種類程度)である程度ボードゲーム慣れしている側の意見です。
- 運要素がある程度強いゲームの方が盛り上がりやすい印象
- ガチガチの戦略ゲームはよほど雑談ができる人じゃないと厳しいかも?
こいこい
- プレイ時間:30分~(ルールを熟知してるなら半分以下でできる)
- 難易度:☆
- 動きと基本的な役を覚えれば良いので簡単です。
- ただ,ゲームとしては単調寄り。こいこいの駆け引きで頑張って盛り上げてください。
タルギ
- プレイ時間:60分~
- 難易度:☆☆☆
商人になって「資源」を集めつつ,得点になる「部族カード」を購入していくゲーム。
- ボードゲームによくある設定なので,中級者的にはプレイの難易度は比較的低い
- 各カードの効果や最終得点のボーナス点など勝敗を左右する要素が非常に多く,最適な立ち回りを考え出すと結構難しくなる
- どのカードがサプライに置かれるか,山札をめくって入手するなどのランダム要素もある程度あり,やってて楽しかった
それはオレの牧場だ!(Battle Sheep)
- プレイ時間:~20分
- 難易度:☆
16匹いる羊を分割していって領地を広げる陣取りゲーム。
- 囲碁っぽい。
- 簡単だけど戦略性が高い。
クアルト
- プレイ時間:~10分
- 難易度:☆
相手にコマを選ばせる,複雑化した四目並べ
- 色,形状などの複数の条件を気にする四目並べ
- 簡単だけど戦略性が高いっぽい。
キャントストップ
- プレイ時間:~20分
- 難易度:☆
サイコロを降ってその和を使って複数のルートからゴールを目指すすごろく?的なゲーム。
- 運要素や駆け引き要素が強く初心者でも盛り上がりやすい
- サイコロの出目の確率について知っているとちょっと戦略的になる?
バトルフォーヒル
- プレイ時間:20分~
- 難易度:☆☆☆
兵隊カードと爆撃カードを駆使して相手の陣地へと攻め込むカードゲーム調。
- 攻撃や補給などのルールが地味に分かりづらかった
- どういう戦略が良さそうか初プレイではわからなかった
まとめ
プレイし次第追記します。
今の所は
- キャントストップ
が手軽で運要素で盛り上がれそうなので初心者とやる分にはおすすめです。
どうやらwikiがあるのでここも参照したほうが良いかもしれません。
anacondaを使った仮想環境上のjupyterがmoduleをimportできない問題の解決 / jupyter上で環境を切り替える
起こった問題
- condaで作った仮想環境上であるパッケージ(lightgbm)をインストールした
- コマンドライン上で起動したpython環境では動く
- がjupyter notebook上からはそのようなmoduleはないと言われた
要は入れたはずのライブラリがnotebookからインポートできないという状況になりました。
原因
- 仮想環境上にはjupyterを入れてなかった
- base環境のjupyterが起動し,仮想環境上でのライブラリ追加が
解決策
したがって簡単なことですが,これだけです。
- 仮想環境上にjupyter notebookを入れる。
conda install jupyter notebook
余談ですが,juptyerのnotebook上でも戦闘に!
をつけた行はコマンドライン上の入力として実行されるので,notebook上で
!pip install ~~
と実行しても良いです。
ただし,condaはyes/noの入力が必要になるので
!echo y|conda install ~~
とすること。
注意点:condaとpipをまぜるな
anacondaとpipでは扱うパッケージの形式が異なり,混ぜると環境を壊す恐れがあります。
https://insilico-notebook.com/conda-pip-install/
jupyter上で仮想環境を切り替えられるようにする
バクを調べてる時に知ったのですが,jupyer上でKernel→Change Kernelの欄から仮想環境を切り替えることができて非常に便利です。
手順概略
手順は,
- base環境で,
pip install environment_kernels
jupyter notebook --generate-config
で.jupyter以下に設定を作成(すでに出ている場合は変更なし)- 生成される
jupyter_notebook_config.py
に下記を追記
c.NotebookApp.kernel_spec_manager_class = 'environment_kernels.EnvironmentKernelSpecManager' c.EnvironmentKernelSpecManager.env_dirs=['C:/Program Files/Anaconda3/envs/'] # envsが保存されている場所
最後に使いたい環境にjupyterを入れpip install environment_kernels
を実行で完了です。
condaとpipをまぜるなといったそばからこれですが,environment_kernelsをcondaで入れている文献を見てないので仕方なくやってます。 best solutionでないのは確か。
ハマリぽいんと
3つ目の手順でenvsが保存されている場所というのが厄介で,windows機の場合,\
をエスケープする必要があります。
したがって,わたしの場合は
c.EnvironmentKernelSpecManager.conda_env_dirs = [ 'C:\\Users\\username\\AppData\\Local\\conda\\conda\\envs\\' ]
としなくてはいけませんでした。あと,最後に仮想環境上でのpip installを忘れないようにというのもポイントです。
これができると,環境ごとにコマンドプロンプトを立ち上げなくていいので気持ちが楽になります。