TIM Labs
今年3月、グーグル・ディープマインドの人工知能囲碁プログラムアルファ碁と、世界最強の囲碁棋士イ セドルの対戦が行われた。全5局の対戦で、賞金として百万ドルがかかっていた。
試合前の予想では、イセドルが勝つだろうとの予測が多かったが、結果はアルファ碁の4勝1敗に終わった。

現在のゲームの中では最も難しく、まだ10年くらいは人工知能はトップ棋士には勝てないだろうと言われていた。
それが、多くの人の予想に反して、アルファ碁の圧勝になってしまった。
これを契機に、知的ゲームだけでなく、人間のあらゆる知的な作業が人工知能に取って代わられるのではないかという危機感が急に沸いてきた、あるいは現実味を持ってきたと思った人が激増し、人工知能について考えざるをえない風潮になったと思う。

さて、これだけ有名になってしまった歴史的な試合だったので、インターネット上に多数の情報が存在する。
また、試合のビデオは5試合ともYouTubeに存在する。
Match 1 - Google DeepMind Challenge Match: Lee Sedol vs AlphaGo (第2局以降省略)alha-go (279x400).jpg

技術的なことも含めて、ネット上に大量に情報はあり、さらにNatureに記事も載り、さらに様々なところで取り上げられた。
そんな中、7月28日に、東京創元社から、『アルファ碁 vs イ セドル』という本試合の解説書の翻訳が出た。
帯には人工知能学会の前会長の松原氏の言葉「人工知能ではなく、囲碁棋士を内心応援していました」とあるが、この本、人工知能の解説書ではない。
多数の棋譜があり、アルファ碁の手も、イセドルの手も、さらには解説者の考えた変化などもかなり細かく解説されている。また、プロ棋士たちが、この試合の進行をどのように見ていたかもいろいろ書かれていて興味深い。

対局のレベルは高く、アルファ碁の打った手は良くない手と思っていたら、手が進むに従い非常に良い手だったということが何度も出てくる。もはやプロ棋士も判断に困る程度のレベルになっていることが分かる。

でも、アルファ碁の打った手が全てすばらしいかったかというと、そうではない。私にさえ良くないと分かるような手もときには打つようだ。実際、バグにより評価を間違えて変なところに打ってしまったこともあるようだ。
つまり、まだアルファ碁は発展の途中で、まだ何段階か強くなりそうな印象を受けた。

私も、2020年頃までは、人工知能が勝つのはないだろうと思っていたのだが、グーグル・ディープマインドは膨大なリソースをつぎ込んで、数年の時間を乗り越えた感じである。毎年毎年かなりのペースでCPUやGPUの性能、とくにコア数など並列処理能力の向上が著しいので、そのあたりをお金で数年縮めることは普通にあるだろう。

それに、人工知能は疲れない。対戦相手が人間だと練習が限られるが、対戦相手もコンピュータにしてしまえば、24時間連続で強化学習が可能になる。こうして、一度枠組みができてしまうと、一気に強くする手立ては存在する。

さて、ちょっとハード的な話を書いておこうと思う。情報は色々あるのだが、試合前に出されたアルファ碁の紹介記事
AlphaGo and AI Progress  2/28/2016 には、アルファ碁の強さと、ハードウェア資源についてのグラフなどもあり興味深い。
この記事によると、アルファ碁が非常に手強い相手だということだが、どこまで信じればよいのか不明であった。
アルファ碁は色々なバージョンがあるようで、最大スケールの AlphaGo Distributed では、280GPU、1920CPUで動くようだ。

この試合以降、囲碁ソフトに深層学習を入れたものが増え、ますます強くなったようだ。
UEC杯コンピュータ囲碁大会は毎年電気通信大学で行われており、優勝プログラムが何子か置いてプロに指導碁を打ってもらうという風になっている。来年春の第10回記念大会では大きな変化が起きるかも知れない。


英国の子供(7年生)全員に無償配布さているというBBC提供のmicro:bitがなぜかやってきた。
次に写真のように、しっかりBBCのロゴが印刷されている。その他のチップなどの説明も分かりやすく印刷されていて、とても教育的だ。向こうではBBCが無償配布するんだから、日本ではNHKが子供に無償配布し、連動した番組があったりして欲しいところだ。
左側がCPUで、今話題のARMのチップである。

DSCF4791 (400x300).jpg
上の写真は裏面で、下が表面で、小さなLEDが5x5個並んでいる。そして、両側にボタンがついている。
拡張ボードに挿したりしなければ、基本の入出力はこれだけである。
他に、加速度センサーと磁気センサーがついている。

DSCF4799 (400x300).jpg
詳しいことは、micro:bitのホームページが用意されているので、詳細はそちらで調べて欲しい。
※うまく表示できないときは、新しいタブまたは新しいウィンドウで開いてください。

さて、プログラム開発のほうだが、ホームページに行くと、Create Code があり、4つのプログラミング言語が用意されていて、これらは、全てブラウザ上で動作するので、OSについては気にする必要がないので、Ubuntu/Linuxで試した。

  1. JavaScript
  2. Block Editor
  3. Touch Develop
  4. Python

Block Editor はScratchみたいな感じで、それをもうちょっと普通のエディタっぽくした感じのがTouch Developである。上の3つは、用意されている命令などをツンツンするこでプログラミングをしていく。

Pythonは、普通のエディタを使ってコーディングする感じである。なので、とりあえず、Pythonを使ってみた。
Pythonといっても、標準のPythonではなく、MicroPythonである。当然、あれこれimportして使うなどできない(はず)。microbitを動かすためには、とりあえず、最初に、 import microbit と書き、その後、ごちゃごちゃ書けば良いらしい。

ということで、ちょっとプログラムを作って走らそうとしたが、他のエディタと違って、ブラウザ上ではシミュレートできない。プログラムをパソコンにダウンロード(.hexファイル)し、micro:bitをUSBでパソコンにつないで、.hexファイルをmicro:bitに投げ込むと動き出す。

しかし、当然プログラムをミスして動かないことがある。すると、micro:bit の LEDに想定外のメッセージらしきものが流れるのだ。よく見ると、英語でエラーメッセージが流れていることが分かり、行番号が含まれていることが分かる。
なんと、シンタックスエラーがあっても、エディタ上では何も出ず、micro:bit上で走り始めたときにやっと分かる。したがって、Pythonでプログラミングするときは、エラーフリーで書けるプログラミング能力が要求される。あるいは、英語で流れるエラーメッセージをすばやく読み取れる動体視力と英語力が要求される。

なぜこんなことになっているのかというと、Pythonはコンパイルされず、テキストのままmicro:bitに転送されるのだそうだ。そのとき、つくったPythonのプログラムだけでなく、MicroPythonのインタープリタも転送されるので、.hexファイルが小さなプログラムであるにもかかわらず600キロバイトと巨大な理由らしい。これは、近いうちにmicro:bitの互換機を出すスイッチサイエンスビデオからの情報だ。

ドキュメントはかなりしっかり用意されている(もちろん英語)ので、あまりプログラミングには困らないと思う。とても困るのは、5x5のLEDだけで何か面白いことをしようとすると、プログラミングよりもはるかに頭を使わないといけない。これこそ頭の訓練になりそうだ。





現在、機械学習や深層学習に関する本が非常にたくさん出ている。
どうせ出ているのなら、世界で一番良さそうな教科書的な本はないものかちょっと考えてみた。
今、世界の有名大学が、これらの授業を公開していて、誰でも好きなだけ勉強できる状況にある。
人工知能系の講義ビデオなどについては、別の機会に紹介する。

そんな情報の渦中をさまよっていたら、MIT Press の Deep Learning の本のサイトが見つかった。

著者は、Ian Goodfellow(モントリオール大->Google->OpenAI), Yoshua Bengio(モントリオール大) and Aaron Courville(モントリオール大)ということで、この分野ではモントリオール大、トロント大などカナダが有力である。

この本のサイト、とてもショボイ感じなのだけれど、MIT Press がそんないい加減な本を出すとも思えないと思ってみていくと、800ページもある本になっていて、ほとんど仕上がっているように見える。
Deep Learingで必要となる線型代数、統計学についての説明もあり、学部、院の両方を対象としたDeep Learningの入門書のようだ。

既に、amazonでも予告がされており、それによると、2016年12月9日に発売である。
ハードカバーで$80とある。日本で入手すると、約1万円の本だろう。
これだけ書きあがっていれば、もっと早く出せると思うのだが、表紙などはこれから作るということだろうか。

でも、この本、ネットで読むと、全部無料で読めてしまう。
それも、紙の本が出る前に読めてしまう。
日本語訳が出るかも知れないが、それは早くても2017年であろう。

最後に一言、肝心なことを書いておこうと思う。
この本、Deep Learningの入門書であるのだが、プログラムは全然出てこない。
あくまでも理論的な基礎をきちんと学ぶための本である。
色々プログラムを弄ろうと思っているタイプの人の期待には応えない。




Dockerコンテナでsshdを動かしてはいけない

この記事ではDockerコンテナにAnsibleで接続してプロビジョニングする方法を説明します。

その前に、Dockerコンテナでsshdを動かしてAnsibleで接続しているみなさん、Ansible 2.0からDocker Connection Pluginが導入されてsshは必要なくなったので今すぐsshdを停止してください。

Dockerコンテナでsshdを動かしてはいけない理由は以下を参照してください。

Dockerコンテナ内でsshdを実行してはいけない理由

今回のファイル一式をGitHubに置きました

https://github.com/eyasuyuki/docker-ansible

AnsibleとDockerのインストール

この記事は以下の環境で試しています。

  • OS X 10.11.5
  • Ansible 2.1
  • Docker 1.11.2
  • Docker Machine 0.7.0
  • Docker Compose 1.7.1
  • VirtualBox 5.1.0

これらがインストールされていない場合は以下を実行してインストールしてください。

brew install ansible docker docker-machine docker-compose
brew cask install virtualbox
人工知能ブームは、ますます加速している感じである。
その中で、Pythonというプログラミング言語が使われていることが多いというのは既に述べた。

それならば、Pythonを使いながら人工知能を学習できるような本がないかと考えるのが普通であろう。
人工知能といっても幅がある、何をやりたいかで方向性が違うのだが、最近巷でも流行っている用語は、機械学習と深層学習が多いように思う。
PythonMachineLearning (236x300).jpg
そういうこともあってか、6月末に出版されたばかりの『Python機械学習プログラミング』が、発売以来売れ続けているようで、amazonでは、人工知能分野でトップはもちろんのこと、科学・テクノロジー分野でトップ争いをしている。Amazon全体で100位台をさまよっていて、これは書店の入り口に大量に平積みされている本と同じくらいである。つまり、多くの日本人がPythonでの機械学習プログラミングを始めたと考えてもよい。(ありえないか)

本書は、ミシガン州立大学の院生のSebastian Raschkaが2015年9月に出版したものの翻訳である。なので、Python3に準拠になっていて、Pythonのバージョンの違いに悩まされることがなく、非常に助かっている。

本書の中のコード、図、テキスト入力、テキスト出力など、つまり文章での説明部分以外はThe "Python Machine Learning" book code repository and info resource(rasbt/python-machine-learning-book)の題名でGitHubで公開されている。
そのため、本書を開き、ブラウザでGitHubのcodeをコピペしながらどんどん動作確認できるので、キーボードから延々とコードを打ち込む手間が不要だ。(便利すぎる!)

本は、400ページあまりで、日本語版には若干の付録が追加されている。全体は、簡単な理論的な説明と、それに基づいた実行例を示しながら進むのだが、たった400ページによく収めたものだと思う。

本書を読むには、若干の前提知識、経験が必要である。
  • Pythonおよびいくつかのパッケージ(Numpy,SciPy,matplotlibなど)。
  • 数学。大学初年級程度の常識的知識は欲しい。
  • パソコンを普通に使えること。

Pythonがはじめての人は、何か別の本で勉強してから本書を読み始めるのが無難だと思う。
さらに、パッケージについても、ある程度慣れてから本書に手をつけないと、厳しいと思う。

理論をしっか説明している本ではないので、数学については何も恐れる必要は無いと思う。本書は、あくまでも、機械学習について、広く、Pythonのコード、既に用意されているパッケージなどを利用して、機械学習を体験してみるような感じになっている。

と書いてきたが、まだ130ページあまりしか読んでいないので、以上は速報であり、また書くかもしれない。

最近は、猫も杓子も「人工知能」と「小学生からプログラミング」を話題にするようだ。
それで、「子供+人工知能」について考えてみた。子供向けプログラミング言語としては、MITのメディアラボが作って提供しているScratchが非常に有名であるので、これで何かAI的なものを作ってみようというのが普通の考えだろう。

Scratchのサイトに行くと、いろいろ公開されているアプリを見ることができる。簡単なゲームなどが多数あり、そのなかにはSUDOKU(ナンプレ、数独はニコリの®)というパズルを解くものも多数ある。ナンプレを解くくらいは簡単に動くだろうと思われるが、それではAIというには情けない。もっと頑張ったものを作ってみないとダメだ。

ということで、実は3年前に、ナンプレの問題を自動生成するプログラムを組んでみた。いや、正しくは、インターンシップに来た学生に作ってもらい、Scratchの評価をしたのだった。

Scratch-sudoku.jpg
Scratchで子供だましのプログラムを作って、これで小学生がプログラムを学習だけではいけないのだ。
将来のプログラミングは、Scrachの遣り方が主流になるかも知れないではないか。
このようにつまんでくっつける遣り方だと、文法エラーになる場合は、そもそもくっつかないので、文法エラーになるコードが作れない。

実際の動きをぜひ確認してみよう。http://scratch.mit.edu/projects/25661093/
この中にある旗をクリックすると、問題を自動生成し始める。 数字の個数(ヒント数)は25個に固定。でも、配置は、90度回転対称の配置を自動的に決めて、問題を作り始める。

旗を押すと盤面の上のバーが進んでいくが、右端まで到達しそうになっても消えてしまって、左端からやり直しに なることがある。これは、自動生成に失敗したことを示しているようだ。

生成時間は、運と、コンピュータの性能に依存するが、数分以内でできるはず。幸運な場合には1分以内。
Scratchはとても遅い言語で、普通にCなどで組むのに比べれば、数百倍遅くなってしまうが、これでも、ナンプレ雑誌、ナンプレ問題集に載っている普通の問題程度なら楽々できることが確認できた。

実際に自動生成された問題を解いてみよう。 ヒント数が25個だが、十分に易しい問題が出来る。 これは、自動生成から呼び出すナンプレソルバー(問題を解くプログラム)に組み込まれている手筋が、基本的なものだけになっているためだ。 インターンシップ期間が短いこともあって、手筋は基本的なものだけになった。

以上が、インターンシップの前半(1週間)で行われたのだった。


ICT教育というのがいろいろ騒がれている。そして、2020年から小学校でも電子教科書が導入されることに決まった。さらに、小学校からプログラミング教育をと騒いでいる。

ということもあり、ちょっとPythonのe-learnig事情について調べてみた。
とりあえず日本は無視して、世界の状況を知るべく、英語で無償で勉強できるところを探してみたら、余りあり過ぎて手に負えない。
MOOCやCouseraだけでも多数の大学が講義を提供してる。また、python.orgから辿れるのもあったり、Google's Python Classもある。とにかく、きりが無いのだ。

それで、機能が充実しているらしきPythonのe-learningの1つ、http://interactivepython.org を調べてみた。
登録しなくても勉強はできるのだが、練習問題で作ったプログラムを記憶してもらったりするには登録が必要なので、登録して試しつつあるところだ。

いくつかコースがあるのだが、とりあえず、How to Think Like a Computer Scientist: Interactive Editionを始めてみた。これをやると、コンピュータサイエンティストのように考えられるようになる、という謳い文句である。
テキストは、とてもインタラクティブになっている。既存の、紙や講義形式を単にe-learningにしたものではない。

たとえば、例題は雛形のプログラムが用意されていて、そのPythonのプログラムをブラウザ上で追加変更して走らすことができる。エラーも出れば、デバッガでステップ動作などもできるし、グラフィックスも可能だ。どのくらいの人がその問題を解いたかなども示してくれる。前の問題をさらに変更するという課題も多いので、セーブできていないと面倒である。

分量は、分厚い入門書1冊分くらいあり、書き方は非常に丁寧だ。練習問題は、n択と、実際にプログラムを作るのと両方があり、プログラムの課題も多く、真面目に作ると、それなりに時間がかかる。

このサイトは、高校や大学レベルの教育を提供することが目的のようである。実際、すごく丁寧な作りだ。
e-learningの世界でも、日本は箱物にばかり走っているが、一番大切なのはコンテンツである。
圧倒的なコンテンツを用意できるかどうか、それが問題なのだ。

e-learningを利用すれば、無料で、世界のいろいろな学習教材が選びたい放題である。ただ必要なのは、英語力であろうか。でも、このコースでPythonを学習するのに必要な英語力は、中学英語で十分過ぎる。各セクションのはじめに、ビデオが用意されていて、そのセクションの説明を、テキストに沿って説明してくれるが、それを聞き取れなくても、その後に書かれていることとほぼ同じなので気にするうことはなく、無視して大丈夫だ。それより、このような長大な英語でのe-learningをやれば、知らない間に英語力も身についてしまうのではないかと思う。

最後に、プログラムの実行状況を確かめるために、永久ループするプログラムを書いて[Run]ボタンを押した。
着々とprint出力が長くなって、そのうちブラウザが反応しなくなった。
止めようと思ったが、[Stop]ボタンがついていなかった。
でも、しばらくすると、ブラウザに叱られて、プログラムは強制終了になって、無事だった。こういうのを無事と言うのかな?

このところ、人工知能がブレークしまくっている。書店には、人工知能あるいは人工知能関連の専門用語をタイトルに入れた書籍が溢れている。こんなに本が増えると、どれを読むか選ぶだけでも大変である。

そんな中、人工知能学会から『人工知能とは』という本が出た。人工知能学会監修ということで、この本を読めば人工知能についてしっかり理解できるかもと思わせる。
表紙には、鉄腕アトムとその仲間たちが描かれており、とても易しい本に見える。

この本、非常に売れているようである。何しろ、販売前に予約だけで売り切れて、増刷したほどである。

人工知能とは.jpg『人工知能とは』監修:人工知能学会、編集:松尾 豊、著者:多数、出版:近代科学社

元々は、人工知能学会の学会誌の連載で、単行本化に際して人工知能学会員だけでなく、一般の人も対象に加えるため、加筆修正したようである。

この本は、現在人工知能の様々な分野で活躍しているトップ研究者13名が、自分がやっている人工知能研究についてあれこれ説明している本である。コンピュータ上だけでやっている人もいれば、ロボットなどを使っている人もいるし、脳科学の成果などを生かそうとしている人や、地球の生命の脳とは無関係な人工脳をつくろうとか、様々な立場から書かれている。

一言で言えば、ぜんぜん意見にまとまりが無い本なのである。というか、人工知能とは、そもそもそういう世界であり、今も混沌として、カオスのような状態である。今まで何度かの人工知能ブームがあったが、これまでは成果らしい成果、人間の能力を超えるような成果が出なかったのだが、今回は、たとえば囲碁のアルファ碁のように、トッププロを負かすような成果が出始めているところが違う。

「人工知能とは?」という質問に対して、決まった答え、定義などないというのが、この本の主張であろう。実用的な知識、理解が何か得られるかと思って本書を読むと撃沈するであろう。でも、人工知能が将来どのような影響を与えるかについて、いろいろ煽っている本はあるのだが、冷静に考えてみるには本書はとても良い。形而上学的な部分もあって、かなり読みにくいかもしれないが、こういうレベル、特に最先端の研究者が何を考えているかを知ることは有用である。

実際に人工知能をいじるには、ちゃんとプログラムを組んだり、ツールを使ったりしなければいけない。技術者・経営者の多くは、そういう本を求めていると思うが、人工知能が近い将来社会に影響を与えることが確実になって、人工知能と倫理問題とか考えるには、「そもそも人工知能とは何か?」という根源的なことを考えないといけない。


ちょっとNumpyで、浮動小数点数をaroundを使って丸めてみよう。

以下のようにして、0.5から1刻みで10個のちょうど中間になる値を用意した。 そして、np.aroundを用いて、一気に丸めてみた。
In [182]: np.arange((10))+0.5
Out[182]: array([ 0.5,  1.5,  2.5,  3.5,  4.5,  5.5,  6.5,  7.5,  8.5,  9.5])

In [183]: np.around(np.arange((10))+0.5)
Out[183]: array([  0.,   2.,   2.,   4.,   4.,   6.,   6.,   8.,   8.,  10.])
すると、
array([  1.,   2.,   3.,   4.,   5.,   6.,   7.,   8.,   9.,  10.])
になると思ったが、違った。 ここで、さらに、Python3 の丸め roundでも試してみた。
In [188]: round(2.5)
Out[188]: 2

In [189]: round(3.5)
Out[189]: 4

In [190]: round(4.5)
Out[190]: 4

In [191]: round(5.5)
Out[191]: 6
つまり、小数部が .5 の場合、切り上げまたは切り捨てのいずれかをするのではなくて、偶数にしてしまうのだ。実際、マニュアルにもそう書かれている。 確かに、この場合、問題になることは少ないから、これでもいいとは思うが、もうちょっとちゃんと調べてみた。

浮動小数点数をどのように処理するかについては、IEEE 754(IEEE 浮動小数点数演算標準)で詳しく規定されていて、ハードウェアレベルで実装されていることが多い。 この中では、丸めは最近接偶数への丸めが推奨されている。小数部が.5になったとき、つねに切り上げ、または切り下げを行っていると値に偏りが出てくるという考え方である。これを無くする、軽減するには、小数部が0.5のとき、1/2の確率で切り上げと切り下げになると都合が良い。そういう考え方で、この方法が最近は増えているようなのだ。

この丸め方を、偶数丸め、五捨五入とか、銀行丸めというのだそうだ。
銀行の場合、円以下の処理方法によって、処理件数が多ければかなり影響が出るかな。

この問題、Python, Numpyだけの問題ではなく、あらゆるプログラミング言語でroundをするとき発生する問題である。
これからは、roundは、小数部が0.5のとき切り上げされるとは限らないので、どう処理されても困らないように書いておこう。
細かい問題だけれど、気が付かないとハマってしまいそうだ。
最近、Pythonが流行っている。以前はコンテンツの扱いに優れているとかで流行ったようだが、今は人工知能関連で流行っているようだ。
といっても、Python自体はAI関連の処理をどんどんできるほど高速な処理系ではない。
実はいくつかの拡張モジュールが用意されていて、それを使うことで高速性が要求されるAIを実装可能にしている。
その1つというか、ベースになっているのがNumpyで、配列が導入され、かつ計算処理でよく出てくる処理が一発でできるようになっている。
今回は、その一端をちょこっと紹介しておこうと思う。

しかし、こういう新しい分野は、なかなか日本語の情報が出てこなかったり、古い情報だったりするので、そういうことに煩わされないためには、はじめから英語で読んでしまったほうが楽になる。それに、しっかりしたドキュメントが無料で入手できる可能性も高くなる。
それで見つけたのが、これ。 Scipy Lecture Notes 2015 Edition

ScipyLectureNote.png
Numpy, Scipy, プロッティングなどまとめて書かれていて、360ページ以上ある。

そのなかのNumpyのところを読んでいたら、練習問題に素数を求めるのがあったので、その解説を元に書いてみた(prime.py)。

import sys
import numpy as np
np.set_printoptions(threshold=np.inf)   # 配列の ... 表示を抑制
N = int(sys.argv[1])+1                  # 引数の上限値を含める
is_prime = np.ones((N,), dtype=bool)
is_prime[:2]=0
N_max = int(np.sqrt(N))
for j in range(2,N_max+1):
    if(is_prime[j]):
        is_prime[j*j::j] = False        # 素数jの間隔で消していく
primes = np.arange(N)[is_prime]
print(primes,'\ncount:',primes.size)
コマンドレベルから直接実行してみた。引数に、調べる上限数を指定する。

$ python prime.py 1000
[  2   3   5   7  11  13  17  19  23  29  31  37  41  43  47  53  59  61
  67  71  73  79  83  89  97 101 103 107 109 113 127 131 137 139 149 151
 157 163 167 173 179 181 191 193 197 199 211 223 227 229 233 239 241 251
 257 263 269 271 277 281 283 293 307 311 313 317 331 337 347 349 353 359
 367 373 379 383 389 397 401 409 419 421 431 433 439 443 449 457 461 463
 467 479 487 491 499 503 509 521 523 541 547 557 563 569 571 577 587 593
 599 601 607 613 617 619 631 641 643 647 653 659 661 673 677 683 691 701
 709 719 727 733 739 743 751 757 761 769 773 787 797 809 811 821 823 827
 829 839 853 857 859 863 877 881 883 887 907 911 919 929 937 941 947 953
 967 971 977 983 991 997] 
count: 168
もし、printoptionsの指定がないと、
# np.set_printoptions(threshold=np.inf)   # 配列の ... 表示を抑制
こんな風になってしまう。
$ python prime.py 1000
[  2   3   5 ..., 983 991 997] 
count: 168
つまり、長い大量の情報は、 ... に置き換えてコンパクトに表示してくれる。 これが、大きなお世話になることも多々ある。

一番Numpy的な個所は、コメントに「素数jの間隔で消していく」と書いたところ。普通だったらループを回るところだが、Numpyでは、素数jの間隔で配列要素の値を書き換えることができる。このおかげで、ループ1階層分の時間短縮ができているとも言える。

最近のコメント