Help us understand the problem. What is going on with this article?

授業教材のっけて解読してこう

More than 1 year has passed since last update.

東京大学 「アルゴリズム入門」 

プログラミング初心者向けの授業 必修ではないけどたくさんの人が受けてる。必修ではないけど必修の授業のようなイメージ

ちょっとずつ解読しながら更新して行くつもりです。

i2a と言うファイルをダウンロードして、授業では import i2a して先生が作った既存の関数を使って様々なプログラムを作って行く感じの授業。
とりあえず元の関数が何をしているのか知りたいから不ザイルの中身をどんどんチェックしてプログラミング初心者が頑張って調べながら意味を解読して行く。温かい目で見て、間違いの指摘、参照すべきサイトの紹介などしてくれると嬉しいです。

LICENCE
You are free to copy, redistribute, modify, and build upon the
material for any purpose, even commercially.
The matterial is provided by Akimasa Morihata "AS IS" and any express
or implied warranties are disclaimed. In no event shall Akimasa
Morihata be liable for any damages and on any theory of liability
arising in any way out of the use of this software, even if advised of
the possibility of such damage.
Akimasa Morihata, 2018 

README
これは東京大学教養学部で開講されている総合科目「アルゴリズム入門」で使
用するサポートパッケージです。不明な点がある場合やバグを発見した場合は
森畑(morihata@graco.c.u-tokyo.ac.jp)までご連絡ください。

きっと勝手に載せても大丈夫なはず
と言うことでレッツゴー

array.py
import copy

def make1d(n,value=0):
    return [copy.deepcopy(value) for i in range(0,n)]

def make2d(n,m,value=0):
    return [make1d(m,value) for i in range(0,n)]

def make3d(n,m,k, value=0):
    return [make2d(m,k,value) for i in range(0,n)]


この三つの先生自作の関数は授業でさほど使われていないからそれほど大切ではない気がする

copy.deepcopy() の意味がわからなかったのでググる
参照元: Qiita:Pythonのcopyとdeepcopyについて
    8.10. copy — 浅いコピーおよび深いコピー操作 — Python 3.6.5 ドキュメント
なんか難しい。
ミュータブルなオブジェクトは強いつながりを持っているってイメージであってるのかしら?
ミュータブルなオブジェクト(再代入可能なオブジェクト。文字列型や数字型、タプル型以外の大部分のオブジェクト)はイコールで代入するとその時点のものが代入されるのじゃなくてあとあと勝手に値が再代入されてしまうってこと?
 
つまりイコールは代入をする
代入をしたいわけじゃなくただ値をコピーしたい時にcopyをつかうのかな
それも浅い方じゃなくて深い方のcopy.deepcopyをつかえばオブジェクトをそのままコピーできるってこと?
疑問は残ったまま
pythonでもっとコードを書くようになったら理解できるのかな。

実際に使って見るとこんな感じ
スクリーンショット 2018-11-29 16.29.41.png

気にしてこなかったけどなんでn回copy.deepcopy() したらn個入ったリストになるんだろう?

bench.py
import numpy
from matplotlib import pyplot
import time
import re

def argToStr(arg):
    if isinstance(arg, list) and len(arg) > 3:
        return "[" + argToStr(arg[0]) + "," + argToStr(arg[1]) + ", ...]"
    else:
        return str(arg)

def evalWithTime(f,arg):
    fn = re.search('^([a-zA-Z0-9_]+) ', str(f)[10:]).group(0)
    s = fn + "(" + argToStr(arg) + ")"
    print("evaluating ", s, " ... ", end="")
    start = time.time()
    if isinstance(arg,tuple):
        f(*arg)
    else: 
        f(arg)
    et = time.time() - start
    print("finished in ", et, " seconds.")
    return et

def bench(f,args):
    if isinstance(args[0],tuple):
            x = [i[1] for i in args]
            y = [evalWithTime(f,i[0]) for i in args]
    else:
            x = [i for i in args]
            y = [evalWithTime(f,i) for i in args]
    return (x,y)

def xscaleLog():
    pyplot.xscale("log")

def yscaleLog():
    pyplot.yscale("log")

def xscaleLinear():
    pyplot.xscale("linear")

def yscaleLinear():
    pyplot.yscale("linear")

def plot(d):
    pyplot.plot(d[0],d[1])
    pyplot.show()

plot.py
# 補助ライブラリ:データのプロット用

import numpy
import matplotlib
import matplotlib.pyplot as plt
import matplotlib.image as image
import matplotlib.animation as animation
import copy

if 'jshtml' in matplotlib.rcsetup.validate_movie_html_fmt.valid:
  matplotlib.rc('animation', html='jshtml')
else:
  matplotlib.rc('animation', html='html5')

def plotdata(data):
    plt.plot(data)
    plt.show()

def histgram_plot(data):
    plt.hist(data)
    plt.show()

def image_preprocess(data):
    for i in range(0,len(data)):
        for j in range(0,len(data[i])):
            if isinstance(data[i][j], list):
                for k in range(0,3):
                    data[i][j][k] = float(data[i][j][k])
            else:
                v = float(data[i][j])
                data[i][j] = [v, v, v]

def image_show(data):
    tmp = copy.deepcopy(data)
    image_preprocess(tmp)
    picture = plt.imshow(tmp)
    plt.show()
    return picture

def animation_show(data):
    fig = plt.figure()
    a = []
    for i in range(0,len(data)):
        tmp = copy.deepcopy(data[i])
        image_preprocess(tmp)
        a.append([plt.imshow(tmp)])
    ani = animation.ArtistAnimation(fig, a, interval=500)
    plt.show()
    return ani

def linear_fit(data):
    xdata = [i[0] for i in data]
    ydata = [i[1] for i in data]
    fitp = numpy.poly1d(numpy.polyfit(xdata, ydata, 1))
    ma = max(xdata)
    mi = min(xdata)
    xp = numpy.linspace(mi, ma, (ma - mi))
    plt.plot(xdata, ydata, '.', xp, fitp(xp), '-')
    plt.show()

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away