<jupyter_start><jupyter_text>第2章 Python プログラミングの基本を学ぶ「pythonによる医用画像処理入門」のチャプター2を写経。一部メモ。pythonの基礎を復習します。  2.1 データ型  2.1.1 型とは リスト2.1.1<jupyter_code>print(type(10))<jupyter_output><class 'int'><jupyter_text>リスト 2.1.2<jupyter_code>print(type("foo"))<jupyter_output><class 'str'><jupyter_text>2.1.2 数値 リスト 2.1.3<jupyter_code>print(type(-5)) #整数
print(type(2.73)) #浮動小数点数
print(type(-5.0))<jupyter_output><class 'int'>
<class 'float'>
<class 'float'><jupyter_text>リスト2.1.4<jupyter_code>print(type(5+4+10))
print(type(5+4.0+10))
print(type(4.3/2))
print(type(4/2))
print(type(5//2))
print(type(5%2))<jupyter_output><class 'int'>
<class 'float'>
<class 'float'>
<class 'float'>
<class 'int'>
<class 'int'><jupyter_text>リスト2.1.5<jupyter_code>print(5+4+10)
print(5+4.0+10)
print(4.3/2)
print(4/2)
print(5//2)
print(5%2)<jupyter_output>19
19.0
2.15
2.0
2
1<jupyter_text>リスト2.1.6<jupyter_code>print(5/2)
print(6.3/2)
print(8/3.0)<jupyter_output>2.5
3.15
2.6666666666666665<jupyter_text>リスト2.1.7<jupyter_code>print(5//2)
print(6.3//2)
print(8//3.0)<jupyter_output>2
3.0
2.0<jupyter_text>2.1.3 文字列 リスト 2.1.8複数行にわたる場合,("""...""")や('''...''')を使う.<jupyter_code>print(type("foo"))
print(type('foo'))
print(type("""hogehoge
fugafuga
barbar
booboo"""))<jupyter_output><class 'str'>
<class 'str'>
<class 'str'><jupyter_text>リスト 2.1.9<jupyter_code>print("Alice" + " in " + "Wonderland")<jupyter_output>Alice in Wonderland<jupyter_text>リスト2.1.10str型とint型を+演算子で連結することはできない.<jupyter_code>print("I am " + 20 + " years old.")<jupyter_output><empty_output><jupyter_text>リスト2.1.11こうする<jupyter_code>print("I am " + str(20) + " years old.")<jupyter_output>I am 20 years old.<jupyter_text>2.2 変数  2.2.1 変数とは リスト 2.2.1<jupyter_code>a = 10
b = a + 10
print(b)<jupyter_output>20<jupyter_text>2.2.2 変数名変数名として使える文字は以下である。- 0-9- A-Z- a-z- _ リスト 2.2.2<jupyter_code>No.19 = 10 # .はエラーとなる<jupyter_output><empty_output><jupyter_text>リスト 2.2.3<jupyter_code>1a = 10 # 数字が先頭だとエラー<jupyter_output><empty_output><jupyter_text>リスト 2.2.4キーワード（予約語)はpythonでは特別な意味を持つので変数名としては使えない。以下のように確認できる。<jupyter_code>import keyword

# 横長が嫌だからforで回す
for word in keyword.kwlist:
  print(word)<jupyter_output>False
None
True
and
as
assert
break
class
continue
def
del
elif
else
except
finally
for
from
global
if
import
in
is
lambda
nonlocal
not
or
pass
raise
return
try
while
with
yield<jupyter_text>リスト 2.2.5<jupyter_code>a = 10
a = a - 3
print(a)<jupyter_output>7<jupyter_text>リスト 2.2.6<jupyter_code>a = 10
a -= 3
print(a)<jupyter_output>7<jupyter_text>リスト 2.2.7<jupyter_code>a = 10
a *= 2
print(a)<jupyter_output>20<jupyter_text>リスト 2.2.8pythonでは、変数名は小文字で始まり、"_"で単語をつなぐのが慣習。スネークケースなどという。  正式なものは[PEP8](https://pep8-ja.readthedocs.io/ja/latest/)を参照されたし。<jupyter_code>green_apple = 100
summer_orange = 500
sales_tax = 0.1
price = int((green_apple * 5 + summer_orange * 2) * (1.0 + sales_tax))
print(price)<jupyter_output>1650<jupyter_text>2.3 データ構造  2.3.1 リスト リスト 2.3.1, 2.3.2, 2.3.3<jupyter_code>p1 = 10000  # 1月分
p2 = 20000  # 2月分
p3 = 100000 # 3月分
p4 = 1000   # 4月分
p5 = 200000 # 5月分<jupyter_output><empty_output><jupyter_text>↓<jupyter_code>prices = [10000, 20000, 100000, 1000, 200000]
print(type(prices))
print(prices[0])
print(prices[0])
print(type(prices[0]))<jupyter_output>10000
10000
<class 'int'><jupyter_text>リスト 2.3.4<jupyter_code>print(prices[0])
prices[0] = 20
print(prices[0])
print(prices)<jupyter_output>10000
20
[20, 20000, 100000, 1000, 200000]<jupyter_text>リスト 2.3.5<jupyter_code>print(len(prices))<jupyter_output>5<jupyter_text>リスト 2.3.6文字列の分割<jupyter_code>string = "a new stereophonic sound spectacular"
slist = string.split(" ")
print(string)
print(slist)
print(type(string))
print(type(slist))<jupyter_output>a new stereophonic sound spectacular
['a', 'new', 'stereophonic', 'sound', 'spectacular']
<class 'str'>
<class 'list'><jupyter_text>リスト 2.3.7リストの結合にはjoin()メソッドを使う。<jupyter_code>slist = ['a', 'new', 'stereophonic', 'sound', 'spectacular']
string2 = " ".join(slist)
print(string2)<jupyter_output>a new stereophonic sound spectacular<jupyter_text>リスト 2.3.8文字列の置換にはreplace()メソッドが使える。 元の文字列は変化させない。<jupyter_code>string = "a new stereophonic sound spectacular"
srep = string.replace('s', 'S')
print(srep)
print(string)<jupyter_output>a new Stereophonic Sound Spectacular
a new stereophonic sound spectacular<jupyter_text>リスト 2.3.9空白を取り払う。- strip()  : 両端- rstrip() : 右側<jupyter_code>string = "   foo      " # 両端に空白
srp = string.strip()
print(srp)<jupyter_output>foo<jupyter_text>リスト 2.3.10スライス:- list[ 取り出す最初のインデックス値 : 取り出す最後のインデックス値 + 1] とする。- 例えば、list[2:4] ならlistのインデックス2,3の値(3,4番目の要素)が取得できる。- list[2:], list[:3], list[:]のように、数字を省略できる。<jupyter_code>prices = [1000, 20000, 100000, 1000, 200000]
p1 = prices[2:4]
p2 = prices[2:]
p3 = prices[:4]
print(p1)
print(p2)
print(p3)<jupyter_output>[100000, 1000]
[100000, 1000, 200000]
[1000, 20000, 100000, 1000]<jupyter_text>リスト 2.3.11スライスされたリストの要素を変更しても元のリストは変わらない。<jupyter_code>prices = [1000, 20000, 100000, 1000, 200000]
p1 = prices[2:4]
print(p1)
p1[0] = "hoge"
print(p1)
print(prices)<jupyter_output>[100000, 1000]
['hoge', 1000]
[1000, 20000, 100000, 1000, 200000]<jupyter_text>リスト 2.3.11と12の間<jupyter_code>prices = [10, 20000, 100000, 1000, 200000]
prices.append(1234)
print(prices)<jupyter_output>[10, 20000, 100000, 1000, 200000, 1234]<jupyter_text>リスト 2.3.12リストの連結<jupyter_code>humans = ['Alice', 'Mad Hatter', 'Queen', 'King']
animals = ['Rabbit', 'Mouse', 'Puppy', 'Caterpillar', 'Cat']
chars = humans + animals
print(chars)<jupyter_output>['Alice', 'Mad Hatter', 'Queen', 'King', 'Rabbit', 'Mouse', 'Puppy', 'Caterpillar', 'Cat']<jupyter_text>Tips- Ctrl + M + M でテキストセルに変換- Ctrl + M + Y でコードセルに変換 リスト 2.3.13sorted()関数で並び替え.  list.sort() だと、破壊的な変更.降順にするためには引数に`reverse = True`とする.<jupyter_code>prices = [10, 20000, 100000, 1000, 200000]
sprices = sorted(prices)
print(sprices)
print(prices)
prices.sort()
print(prices)<jupyter_output>[10, 1000, 20000, 100000, 200000]
[10, 20000, 100000, 1000, 200000]
[10, 1000, 20000, 100000, 200000]<jupyter_text>リスト 2.3.14リストに値が存在するかどうか<jupyter_code>humans = ['Alice', '<NAME>', 'Queen', 'King']
t = 'Rabbit' in humans
print(t)
s = 'Rabbit' not in humans
print(s)<jupyter_output>False
True<jupyter_text>2.3.2 タプル要素を変更できない. このことを"イミュータブルである"、という.対義語: ミュータブル(変更可能)  関連語: プリミティブ型 ( 言語の仕様であらかじめ定義されている型. 定義にほかのデータ型を用いない.) リスト 2.3.15<jupyter_code>prices = (1000, 20000, 100000, 1000, 200000)
print(type(prices))
print(prices)<jupyter_output><class 'tuple'>
(1000, 20000, 100000, 1000, 200000)<jupyter_text>リスト 2.3.16再代入はできない。<jupyter_code>prices = (1000, 20000, 100000, 1000, 200000)
prices[1] = 20 # 書き換えはエラーが出る
print(prices)<jupyter_output><empty_output><jupyter_text>リスト 2.3.17リストとタプルは、互いに変換できる。- list()> 引数にタプルを入れるとリストに変換する- tuple()> 引数にリストを入れるとタプルに変換する  > スペルに注意！ t**u**ple です。タプルの使われ方:- 関数の引数はタプルとして渡される.- 関数の戻り値として複数の値を返す時- 辞書のキー<jupyter_code>humans = ('Alice', '<NAME>', 'Queen', 'King') # tuple
animals = ['Rabbit', 'Mouse', 'Puppy', 'Caterpillar', 'Cat'] # list
h = list(humans)
print(h)
a = tuple(animals)
print(a)<jupyter_output>['Alice', '<NAME>', 'Queen', 'King']
('Rabbit', 'Mouse', 'Puppy', 'Caterpillar', 'Cat')<jupyter_text>2.3.3 辞書辞書のインデックスには- タプル- 整数- 浮動小数点など、イミュータブル(変更不可)であれば使える。辞書は、ほかの言語ではハッシュや連想配列などと呼ばれるデータ構造である。 リスト 2.3.18<jupyter_code>sales = {'january': 10000, 'february': 20000, 'march': 100000, 'april': 1000, 'may': 200000 }
print(sales['january'])
print(type(sales))<jupyter_output>10000
<class 'dict'><jupyter_text>リスト 2.3.19 順番はない。よって、スライスは使えない。<jupyter_code>sales = {'january': 10000, 'february': 20000, 'march': 100000, 'april': 1000, 'may': 200000 }
print(sales['january': 'april']) # この書き方はできない。
print(type(sales))<jupyter_output><empty_output><jupyter_text>リスト 2.3.20<jupyter_code>birthday = {}

birthday['Alice'] = '4/1'
birthday['Queen'] = '12/12'
birthday['King'] = '7/3'
birthday.pop('Alice')
print(birthday)<jupyter_output>{'Queen': '12/12', 'King': '7/3'}<jupyter_text>リスト 2.3.21items()でkeyとvalueのペアを取得  タプルで表現される<jupyter_code>sales = {'january': 10000, 'february': 20000, 'march': 100000, 'april': 1000, 'may': 200000 }
print(sales.items())
print(list(sales.items()))<jupyter_output>dict_items([('january', 10000), ('february', 20000), ('march', 100000), ('april', 1000), ('may', 200000)])
[('january', 10000), ('february', 20000), ('march', 100000), ('april', 1000), ('may', 200000)]<jupyter_text>リスト 2.3.22辞書のコピーにはcopy()を使う。= を使っても別名ができるだけ。<jupyter_code>sales_tokyo = {'january': 10000, 'february': 20000, 'march': 100000, 'april': 1000, 'may': 200000 }
sales_sapporo = sales_tokyo.copy()
sales_sapporo['january'] = 5000
print(sales_sapporo)
print(sales_tokyo)
print()

alias = sales_sapporo
alias['february'] = 99
print(alias)
print(sales_sapporo)<jupyter_output>{'january': 5000, 'february': 20000, 'march': 100000, 'april': 1000, 'may': 200000}
{'january': 10000, 'february': 20000, 'march': 100000, 'april': 1000, 'may': 200000}

{'january': 5000, 'february': 99, 'march': 100000, 'april': 1000, 'may': 200000}
{'january': 5000, 'february': 99, 'march': 100000, 'april': 1000, 'may': 200000}<jupyter_text>2.4 基本構文一部割愛 リスト 2.4.4複数の配列を同時にループしたいときには、**zip()**を用いる。zip()は一番少ない要素数に合わせる。一番多い要素数に合わせたいなら[itertools.zip_longest](https://note.nkmk.me/python-zip-usage-for/)を使用する。<jupyter_code>humans = ['Alice', '<NAME>', 'Queen', 'King']
animals = ['Rabbit', 'Mouse', 'Puppy', 'Caterpillar', 'Cat']
for h, a in zip (humans, animals):
  print("human = {0:10}\tanimals = {1:10}".format(h, a))

print()
print(zip(humans, animals))<jupyter_output>human = Alice     	animals = Rabbit    
human = <NAME>	animals = Mouse     
human = Queen     	animals = Puppy     
human = King      	animals = Caterpillar

<zip object at 0x7f3e45dff208><jupyter_text>リスト 2.4.5index値とvalueを同時に取得するには**enumerate()**を使う。<jupyter_code>humans = ['Alice', '<NAME>', 'Queen', 'King']
for i, name in enumerate(humans):
  print(i, name)<jupyter_output>0 Alice
1 <NAME>
2 Queen
3 King<jupyter_text>リスト　2.4.6内包表記<jupyter_code>nums = [ n for n in range(1,11)]
print(nums)<jupyter_output>[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]<jupyter_text>リスト 2.4.10<jupyter_code>nums = [ n**2 + 2*n -3 for n in range(1, 11)]
print(nums)<jupyter_output>[0, 5, 12, 21, 32, 45, 60, 77, 96, 117]<jupyter_text>リスト 2.4.11内包表記の中に条件式も追加できる<jupyter_code>nums = [ n**2 + 2*n -3 for n in range(1,11) if n%2 == 0]
print(nums)<jupyter_output>[5, 21, 45, 77, 117]<jupyter_text>2.5 関数  2.5.2 関数の作成 リスト 2.5.1def文を使って定義できる。<jupyter_code>def hello_world():
  print("hello world!")<jupyter_output><empty_output><jupyter_text>リスト 2.5.2呼び出し<jupyter_code>hello_world()<jupyter_output>hello world!<jupyter_text>リスト 2.5.4パラメータxを受け取りyを返す<jupyter_code>def f(x):
   y = 2 * x
   return y

x = 5
y = f(x)
print(y)<jupyter_output>10<jupyter_text>リスト 2.5.5引数は複数かける<jupyter_code>def gree(name, age, birth, animal):

  et = ''
  if animal == 'nezumi':
    et = 'ne'
  elif animal == 'usagi':
    et = 'u'
  elif animal == 'dragon':
    et = 'tatsu'
  elif animal == 'hebi':
    et = 'mi'
  elif animal == 'inoshishi':
    et = 'i'
  else:
    et = animal

  s  = 'Hello ' + name + '(' + str(age) + '), '
  s += birth + ' 生まれ. 干支は' + et
  return s

g = gree('yamamoto', 30, '10/22', 'inu')
print(g)<jupyter_output>Hello yamamoto(30), 10/22 生まれ. 干支はinu<jupyter_text>リスト 2.5.6`引数名=値`という形で値を渡すことで、引数の順番を気にする必要がなくなる。<jupyter_code>g = gree(name = 'yamamoto', age = 30, birth = '10/22', animal = 'inu')
print(g)<jupyter_output>Hello yamamoto(30), 10/22 生まれ. 干支はinu<jupyter_text>2.5.3 スコープ変数が通用する範囲のことをスコープと呼ぶ。例えば、関数の中で宣言した変数は、関数の外では使えない。 リスト 2.5.8p5はtest_func()のローカルスコープの中身存在する変数(ローカルスコープという)であり、ローカルスコープの外(12行目)からは見えない。よって `name'p5'is not defined (名前p5は定義されてない)`というエラーになる。  すべての関数の外にあるスコープをグローバルスコープといい、そこで定義された変数はグローバル変数という。今回だと、`array`と`b`がグローバル変数である。<jupyter_code>def test_func(arr):
  p5 = 0
  for a in arr:
    if a > 5:
      p5 = a
      break
  return p5

array = [1,2,6,10]
b = test_func(array)
print(b)
# print(p5) # エラーとなる<jupyter_output>6<jupyter_text>リスト 2.5.9グローバルスコープからはローカル変数を参照することはできないが、ローカル変数からはグローバル変数を参照できる。<jupyter_code>array = [1,2,6,10]

def test_func():
  p5 = 0
  for a in array: # グローバル変数のarrayを参照している
    if a > 5:
      p5 = a
      break
  return p5

b = test_func()
print(b)<jupyter_output>6<jupyter_text>リスト 2.5.10Pythonであｈ、for文やif文はスコープを作らない。<jupyter_code>for i in range(5):
  x = i
  s = "foo"

print("x =",x)
print("s =",s)
print("i =",i)<jupyter_output>x = 4
s = foo
i = 4<jupyter_text>リスト 2.5.11内包表記はスコープを作る.<jupyter_code>array = [p**2 for p in range(10)]
print(array)
# print(p) # エラーになる<jupyter_output>[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]<jupyter_text>2.5.4 クラスとメソッド リスト 2.5.12クラスは型のことであり、メソッドんは型を持った変数に紐づけられた関数のことである。例えば、リスト型変数animalsに対して、そこから最後の要素を取り出すpop()メソッドがある。<jupyter_code>animals = ['Rabbit', 'Mouse', 'Puppy', 'Caterpillar', 'Cat']
r = animals.pop()
print(r)
print(animals)<jupyter_output>Cat
['Rabbit', 'Mouse', 'Puppy', 'Caterpillar']<jupyter_text>リスト 2.5.13length, width, heightの3つの値を持ったCubeという新しい方を作成してみる。`__init__`は、コンストラクタである。第一引数に自分自身(self)を置く。コンストラクタ内では、selfに紐づけられるパラメータ(プロパティ)に値を格納している。  メソッドの第一引数にもselfを設定する。<jupyter_code>class Cube:
  def __init__(self, length, width, height):
    self.length = length
    self.width  = width
    self.height = height

  # 表面積を計算する
  def area(self):
    area1 = self.length * self.height
    area2 = self.length * self.width
    area3 = self.height * self.width
    area = area1 + area2 + area3
    return area

  # 体積を計算する
  def volume(self):
    vol = self.length * self.height * self.width
    return vol

c = Cube(10, 20, 30)
print("表面積\t= ", c.area())
print("体積\t= ", c.volume())<jupyter_output>表面積	=  1100
体積	=  6000<jupyter_text>2.6 ライブラリの利用 ライブラリとは、いくつかのよく使われる処理をまとめておいて、別のプログラムから呼び出して使いまわせるようにしたプログラムのことである。ライブラリはモジュール及びパッケージという単位で管理されている。  モジュールはいくつかの関数やクラスをまとめたpythonのソースファイルのことである。  パッケージはモジュールをいくつか集めてまとめたものである。標準パッケージにないモジュールは、pipコマンドを使いインストールする必要がある。  2.6.1 モジュールのインポート リスト 2.6.1あるモジュールを利用するには、import文で明示的に利用を宣言する必要がある。<jupyter_code>import math

print(type(math))
print(math)
print(math.pi)
print(math.cos(0))<jupyter_output><class 'module'>
<module 'math' (built-in)>
3.141592653589793
1.0<jupyter_text>リスト 2.6.2numpyパッケージをnpという別名で利用する<jupyter_code>import numpy as np
npa = np.array([1,2,3])
print(npa)
print(type(npa))<jupyter_output>[1 2 3]
<class 'numpy.ndarray'><jupyter_text>リスト 2.6.3必要なものだけ使えるようにする。:- from パッケージ名 import モジュール名- from モジュール名 import 関数名<jupyter_code>from math import cos
print(cos(100))
print(type(cos(199)))<jupyter_output>0.8623188722876839
<class 'float'><jupyter_text>2.6.2 モジュールの利用 リスト 2.6.4モジュールの使い方はhelp()関数を使うとよい。どんなモジュールがあるかについては、:- [Python標準ライブラリ](https://docs.python.org/ja/3/library/index.html)の説明- [Python Package Index](https://pypi.org/)...パイピーアイと読む。pipでインストールできるようになる。デビューしてえ。等を参考にするとよい。<jupyter_code>import math
help(math)<jupyter_output><empty_output><jupyter_text>[1] osモジュールとは- 標準モジュールの一つ- ファイルやディレクトリ操作ができる  - os.getcwd():     現在の作業ディレクトリ名を返す  - os.listdir(path):    pathのディレクトリやファイルの一覧をリストで返す    引数pathがないなら、現在の作業ディレクトリについて一覧を返す  - os.chdir(path):    pathへディレクトリを移動する  - os.mkdir(dir):    dirディレクトリを作成する  リスト 2.6.5<jupyter_code>import os
print(os.getcwd())
print(os.listdir())
os.chdir("sample_data")
os.mkdir('example')<jupyter_output>/content
['.config', 'sample_data']<jupyter_text>[2] datetime モジュールとは- 標準モジュール- 日付や時刻を扱う| プロパティ名 |   内容   ||     ----     |   ----   ||   datetime   |   日時   ||     date     |   日付   ||     time     |   時刻   ||  timedelta   | 時間(差) | リスト 2.6.6現在日時と各日時情報の取得<jupyter_code>import datetime
now = datetime.datetime.now() # 現在日時
print("now\t\t:",now)
print("type(now)\t:",type(now))
print("now.year\t:",now.year)
print("now.month\t:",now.month)
print("now.day\t\t:",now.day)
print("now.hour\t:",now.hour)
print("now.minute\t:",now.minute)
print("now.second\t:",now.second)
print("now.date()\t:",now.date())
print("type(now.date()):",type(now.date()))
print("now.time()\t:",now.time())
print("type(now.time()):",type(now.time()))<jupyter_output>now		: 2020-05-07 14:40:26.352945
type(now)	: <class 'datetime.datetime'>
now.year	: 2020
now.month	: 5
now.day		: 7
now.hour	: 14
now.minute	: 40
now.second	: 26
now.date()	: 2020-05-07
type(now.date()): <class 'datetime.date'>
now.time()	: 14:40:26.352945
type(now.time()): <class 'datetime.time'><jupyter_text>リスト 2.6.7本日の日付の取得  時刻情報がいらないなら、dateインスタンスを使えばよい。<jupyter_code>import datetime 
today = datetime.date.today()
print(today)
# 必要なものだけimport
from datetime import date
today = date.today()
print(today)<jupyter_output>2020-05-07<jupyter_text>リスト 2.6.8時刻の取得はtimeインスタンスが使える。  引数を省略すると、dafault値の0が入る。<jupyter_code>import datetime 

dtt = datetime.time(hour=16, minute=59, second=30)
print(dtt)
print(type(dtt))<jupyter_output>16:59:30
<class 'datetime.time'><jupyter_text>リスト 2.6.9時刻の計算を行い、時間計測ができる。  時間計測に伴い、timedeltaというインスタンスが生成される。<jupyter_code>import datetime
now = datetime.datetime.now()
dtdt = datetime.datetime(year=2019, month=11, day=16)
tdelta = now - dtdt
print(tdelta)
print(type(tdelta))
print(tdelta.days)
print(tdelta.total_seconds())
help(tdelta)<jupyter_output><empty_output><jupyter_text>リスト 2.6.10datetimeインスタンスは、strftime()メソッドを使うことで様々なフォーマットの文字列に変換できる。  %Y, %m 等は書式コードという。[(参考: Python 公式ドキュメント)](https://docs.python.org/ja/3/library/datetime.html)<jupyter_code>import datetime
now = datetime.datetime.now()
fmt = now.strftime('%Y-%m-%d (%a) %H:%M:%S')
print(fmt)<jupyter_output>2020-05-07 (Thu) 15:22:39<jupyter_text>リスト 2.6.11文字列からdatetimeインスタンスへの変換<jupyter_code>import datetime
s = '2020-1-14 17:40'
dtst = datetime.datetime.strptime(s, '%Y-%m-%d %H:%M')
print(dtst)
print(type(dtst))<jupyter_output>2020-01-14 17:40:00
<class 'datetime.datetime'><jupyter_text>2.6.3 NumPy NumPy(Numerical Python)は、数値計算、科学技術系っさんを行う際に夫もよくつかわれるパッケージであり、様々なほかのパッケージがNumPyを基礎として作られている。  これを使うことで、ディープラーニングで用いられる線形代数などの数値計算を効率よく高速に行うことができる。 NumPyで使える変数やメソッドのリストや詳細についてはhelp(np)等で参照できる。また、colab上では?npで参照できる。  [1] NumPy配列listと似ており、相互に変換も可能だが、別物である。NumPy配列はnp.array()を用いてリストから作成できる。 リスト 2.6.12リストとNumPy配列の型を比較する。また、np.tolist()を使うと、listに変換できる。<jupyter_code>import numpy as np # as hoge の形で、別名でパッケージにアクセスできる。

lst = [1,3,5,9]
nlist = np.array(lst)

print("lst\t\t:",lst)
print("type(lst)\t:",type(lst))
print()
print("nlist\t\t:",nlist)
print("type(nlist)\t:",type(nlist)) # ndarray型であることがわかる。
print()

lst0 = nlist.tolist()
print("lst0\t\t:",lst0)
print("type(lst0)\t:",type(lst0))<jupyter_output>lst		: [1, 3, 5, 9]
type(lst)	: <class 'list'>

nlist		: [1 3 5 9]
type(nlist)	: <class 'numpy.ndarray'>

lst0		: [1, 3, 5, 9]
type(lst0)	: <class 'list'><jupyter_text>リスト 2.6.13ndarrayには、dtype, shape, ndim, sizeというプロパティが設定されている。<jupyter_code>import numpy as np

a = np.array([[1,2], [3,4], [5,6], [7,8]])
print(a)
print(a.dtype)

print("a\t:")
print(a)
print("a.dtype\t:",a.dtype) # 行列要素の型を返す
print("a.shape\t:",a.shape) # (行数, 列数)のタプルを返す
print("a.ndim\t:",a.ndim)   # 階数(次元数)を返す
print("a.size\t:",a.size)   # 要素数を返す<jupyter_output>[[1 2]
 [3 4]
 [5 6]
 [7 8]]
int64
a	:
[[1 2]
 [3 4]
 [5 6]
 [7 8]]
a.dtype	: int64
a.shape	: (4, 2)
a.ndim	: 2
a.size	: 8<jupyter_text>[2] NumPy配列の初期化と配列要素へのアクセス リスト 2.6.14- np.zeros(): 要素を0ですべて初期化.- np.ones(): 要素を1ですべて初期化.- nu.full(): 任意の値ですべて初期化.<jupyter_code>import numpy as np

list0 = np.zeros(4)
print("np.zeros(4)\t:",list0)

list1 = np.ones(5)
print("np.ones(5)\t:",list1)

list2 = np.arange(4) # rangeと似てる。 0,1,2,3
print("np.arange(4)\t:",list2)

list3 = np.full(shape=4, fill_value = 100)
print("np.full(4,100)\t:",list3)<jupyter_output>np.zeros(4)	: [0. 0. 0. 0.]
np.ones(5)	: [1. 1. 1. 1. 1.]
np.arange(4)	: [0 1 2 3]
np.full(4,100)	: [100 100 100 100]<jupyter_text>リスト 2.6.15np.reshape()を用いると、行列の初期化が行える。<jupyter_code>import numpy as np
list0 = np.zeros(8)
matrix0 = list0.reshape(2,4)
print(matrix0)<jupyter_output>[[0. 0. 0. 0.]
 [0. 0. 0. 0.]]<jupyter_text>リスト .2.6.16要素へのアクセスは、リストと似ている。<jupyter_code>a = np.array([[1,2,3], [4,5,6]])
print(a[1][0])

print(a[1,0]) # a[1][0]はこのようにアクセス可能。<jupyter_output>4
4<jupyter_text>リスト 2.6.17ベクトル・行列の要素や部分配列へのアクセスはリストと同様である。  スライスも使える。<jupyter_code>lst = np.arange(51)

print(lst)
print(lst[-1])
print(lst[2:6])
print(lst[40:])<jupyter_output>[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
 48 49 50]
50
[2 3 4 5]
[40 41 42 43 44 45 46 47 48 49 50]<jupyter_text>リスト 2.6.18NumPy配列では、 __スライスによって配列はコピーされない。__したがって、スライス上での値変更は元のNumPy配列にも反映される。<jupyter_code>lst = np.arange(15)
print(lst)
dv = lst[2:6]
print(dv)
print(lst)
dv[1] = 100
print(dv)
print(lst)<jupyter_output>[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14]
[2 3 4 5]
[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14]
[  2 100   4   5]
[  0   1   2 100   4   5   6   7   8   9  10  11  12  13  14]<jupyter_text>リスト 2.6.19コピーの時はnp.copy()を使う.<jupyter_code>lst = np.arange(15)
print(lst)
dv = lst[2:6].copy() # ここだけ変更
print(dv)
print(lst)
dv[1] = 100
print(dv)
print(lst)<jupyter_output>[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14]
[2 3 4 5]
[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14]
[  2 100   4   5]
[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14]<jupyter_text>リスト 2.6.20[]の中に条件(bool値)を入れて配列を作成することも可能！この場合、NumPy配列は新しく作られている。<jupyter_code>lst = [i for i in range(10)]
# print(lst[lst>5]) # listだとエラー

a = np.array([[[1,2,3,4],[4,5,6,7],[3,4,5,6]], \
              [[7,8,9,10],[10,11,12,13],[4,5,6,7]]])
print(a>6)
print()
b = a[a>6]

b[0] = 1000
print(b)


print(b.shape)
print(a)
import numpy as np
help(np)
?np<jupyter_output><empty_output><jupyter_text>[3] NumPy配列の計算 NumPy配列を使うことで、ベクトルや行列の演算が簡単かつ高速に演算でkる。 リスト 2.6.21ベクトルの演算例<jupyter_code>import numpy as np

av = np.array([1,2,3])
bv = np.array([5,-6,-7])

# 足し引き
cp = av + bv
cm = av - bv
print(cp)
print(cm)

# スカラー積(ブロードキャスト演算)
sv = 2 * av
print(sv)

# 掛け算は要素積となる
vx = av * bv
print(vx)<jupyter_output>[ 6 -4 -4]
[-4  8 10]
[2 4 6]
[  5 -12 -21]<jupyter_text>リスト 2.6.22内積計算には、np.dot()を用いる<jupyter_code>import numpy as np

av = np.array([1 ,2 ,3])
bv = np.array([ 5 ,-6 ,-7])

ip = np.dot(av, bv)
print(ip)<jupyter_output>-28<jupyter_text>リスト 2.6.23行列の積にも、np.dot()を用いる<jupyter_code>a = np.array([[1,2,3], [4,5,6], [6,7,8], [9,10,11]]) # 4行3列
b = np.array([[2,3,4,5], [5,6,7,8], [0,1,2,3]]) # 3行4列

c = np.dot(a, b) # 4×4
d = np.dot(b, a) # 3×3
print(c)
print(d)<jupyter_output>[[ 12  18  24  30]
 [ 33  48  63  78]
 [ 47  68  89 110]
 [ 68  98 128 158]]
[[ 83  97 111]
 [143 169 195]
 [ 43  49  55]]<jupyter_text>リスト 2.6.24行列の転置にはnp.Tを用いる<jupyter_code>a = np.array([[1,2,3], [4,5,6], [6,7,8], [9,10,11]]) # 4行3列
print(a)

at = a.T
print(at)<jupyter_output>[[ 1  2  3]
 [ 4  5  6]
 [ 6  7  8]
 [ 9 10 11]]
[[ 1  4  6  9]
 [ 2  5  7 10]
 [ 3  6  8 11]]<jupyter_text>リスト 2.6.25ベクトルと行列の積  ベクトルは、縦横ベクトルを都合のよい方で計算される<jupyter_code>a = np.array([[1,2], [3,4]])
b = np.array([-1, -2])

c = np.dot(a, b)
print(c)

d = np.dot(b, a)
print(d)<jupyter_output>[ -5 -11]
[ -7 -10]<jupyter_text>2.6.4 Matplotlib  データの可視化に用いられるのがMatplotlibである。グラフの描画ができる。 リスト 2.6.26IPyhton/Jupyter上で実行する場合、以下を書くとグラフをブラウザ上でインタラクティブに見ることができる。<jupyter_code>%matplotlib inline
import matplotlib.pyplot as plt<jupyter_output><empty_output><jupyter_text>[1] figurematplotlibでは、まずfigureオブジェクトを作成する。figureオブジェクトが生成されると、何も書かれていないウインドウが作成される。<jupyter_code>fig = plt.figure()<jupyter_output><empty_output><jupyter_text>[2] plotfigureオブジェクトの上にグラフを作っていく。add_subplot()を用いて各領域を確保する。1,2行目どちらのようにもかける。  figure(nrows, ncols, index)では、figureをnrows行, ncols列に分割してindex番目のところにグラフを作る。<jupyter_code>ax1 = fig.add_subplot(1,1,1)
# ax1 = fig.add_subplot(111)<jupyter_output><empty_output><jupyter_text>リスト 2.6.29適当なデータでグラフを描画する。描画にはplot()を用いる。<jupyter_code>%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
# 数値データの作成
x = np.arange(0, 8, 0.1)
y1 = np.cos(x)
y2 = np.sin(x)
# グラフの描画
fig = plt.figure()
ax1 = fig.add_subplot(1,1,1)
ax1.plot(x, y1, label='cos')
ax1.plot(x, y2, linestyle='dashed', label='sin', marker = '>')
ax1.set_xlabel("X")
ax1.set_ylabel("Y")
ax1.set_xlim(0, 10)
ax1.set_ylim(-1, 1)
ax1.set_title("test figure")
ax1.legend()
fig.show()<jupyter_output><empty_output><jupyter_text>リスト 2.6.29_2plt.plot()について<jupyter_code>import matplotlib.pyplot as plt
import pandas as pd
print("表. plot()の引数")
plt_data = [
            ['x, y', 'x軸, y軸の値を指定'],
            ['linewidth', '線の太さ(pt)'],
            ['linestyle', "'solid', 'dashed', 'dashdot', 'dotted', 'None'を指定できる"],
            ['color', '色指定'],
            ['label', 'ラベル用テキストの指定'],
            ['marker', "マーカーの形を指定. '.', 'o', 'v'. '^', '<', '>', '*', 'x' 等が指定できる"]
            ]
df = pd.DataFrame(plt_data, columns=['引数', '説明'])
df<jupyter_output>表. plot()の引数<jupyter_text>[3] scatter散布図はscatter()を用いる<jupyter_code>import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
x = np.arange(0, 5, 0.1)
y = np.arange(0, 5, 0.1) + np.random.randn(50)
fig = plt.figure()
ax1 = fig.add_subplot(1,1,1)
ax1.scatter(x, y, color='red')
fig.show()
# 相関係数を求める
correlation  = np.corrcoef(x, y)[0, 1]
# 相関係数の表示
print("相関係数 = ",correlation)<jupyter_output>相関係数 =  0.8215254734538876<jupyter_text>[4] subplot リスト 2.6.31一つの図の中に複数のグラフを載せたいときには、add_subplot(1,1,1)を修正する。<jupyter_code>import numpy as np
import matplotlib.pyplot as plt
# 数値データの作成
x = np.arange(0, 8, 0.1)
y1 = 3*np.cos(x) - 5
y2 = 2*np.sin(x)
# Figureの作成
fig = plt.figure()
# グラフの描画(1)
ax1 = fig.add_subplot(1,2,1)
ax1.plot(x, y1, color='green')
# グラフの描画(2)
ax2 = fig.add_subplot(1,2,2)
ax2.plot(x, y2, color='cyan')
fig.show()<jupyter_output><empty_output><jupyter_text>リスト 2.6.32比較しやすいよう、y軸をそろえる**fig.ad_subplot(sharey)**のshareyにax1を指定し、y軸をax1と同じにしている<jupyter_code>import numpy as np
import matplotlib.pyplot as plt
# 数値データの作成
x = np.arange(0, 8, 0.1)
y1 = 3*np.cos(x) - 5
y2 = 2*np.sin(x)
# Figureの作成
fig = plt.figure()
# グラフの描画(1)
ax1 = fig.add_subplot(1,2,1)
ax1.plot(x, y1, color='green')
ax1.set_ylim(-8, 2)
# グラフの描画(2)
ax2 = fig.add_subplot(1,2,2,sharey=ax1)
ax2.plot(x, y2, color='cyan')
fig.show()<jupyter_output><empty_output><jupyter_text>リスト 2.6.33x軸を共有する。**axis.twinx()**で座標を共有できる。<jupyter_code>%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt

x = np.arange(0, 8, 0.1)
y1 = 1.0/np.exp(x)
y2 = 5.0/(1 + np.exp(-x)) -1

# Figure の作成
fig = plt.figure()

# グラフの描画(1)
ax1 = fig.add_subplot(1,1,1)
ax1.plot(x, y1, color='green', label='loss')
ax1.set_ylabel('loss')
ax1.set_xlabel('epoch')

# グラフの描画(2)
ax2 = ax1.twinx()
ax2.plot(x, y2, color='cyan', label='acc')
ax2.set_ylabel('acc')
plt.title('sample')
fig.legend()
fig.show()<jupyter_output><empty_output><jupyter_text>リスト 2.6.34matplotの基本は、figureインスタンスを作成し、ここから1つあるいは複数のaxisインスタンスを作成、axisインスタンス上に一つ一つのグラフを描くという流れである。しかし、figureやaxisインスタンス化せずに、pltクラスを使って以下のように簡易的に描くこともできる。<jupyter_code>import numpy as np
import matplotlib.pyplot as plt
# 数値データの作成
# ポアソン分布とは
# 遺伝子の突然変異数や火災件数などの
# 滅多に起こりえない事象の発生数の確立がとりえる分布
x = np.random.poisson(lam=3.5, size=1000)
# グラフの描画
plt.hist(x, ec='black', rwidth=0.8, bins=10, density=False)
plt.xlabel("X")
plt.ylabel("Y")
plt.title("test figure")
plt.show()<jupyter_output><empty_output><jupyter_text>[5] 画像の読み込み画像解析を行う際には、実際の画像を読み込む必要がある。 リスト 2.6.35- imread(画像ファイル名) で、画像データを取り込む。- imshow()でfigに書き出す<jupyter_code>import matplotlib.pyplot as plt
img = plt.imread('/content/drive/My Drive/Colab Notebooks/robot_bar.jpg')
fig = plt.figure()
ax1 = fig.add_subplot(111)
ax1.imshow(img)
fig.show()<jupyter_output><empty_output><jupyter_text>リスト 2.6.36画像一つだけなら、figure()でインスタンスを作らなくても表示できる。<jupyter_code>import matplotlib.pyplot as plt
img = plt.imread('/content/drive/My Drive/Colab Notebooks/robot_bar.jpg')
plt.imshow(img)
plt.show()<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.17903308259694733, 'fraction_numerical': 0.09037464397867523, 'mean_word_length': 6.034934497816594, 'pattern_counts': {'":': 0, '<': 343, '<?xml version=': 0, '>': 352, 'https://': 5, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 1, 'word_list_counts': {'cursed_substrings.json': 3, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '94', 'dir': 'jupyter-structured-clean-dedup', 'id': '598607', 'license': 'MIT', 'n_tokens_mistral': 16730, 'n_tokens_neox': 14861, 'n_words': 2098, 'path': 'chapter2/Chapter2.ipynb', 'repo_name': 'kentokura/python_medical_images', 'size': '27414'}