# データファイルの準備
import urllib.request
basedir = 'https://amanotk.github.io/python-resume-public/data/'
files = ['helix1.dat', 'helix2.dat', 'cbinary.dat']
for f in files:
urllib.request.urlretrieve(basedir+f, f)
import numpy as np
from matplotlib import pylab as plt
np.arange(10)
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
N = 10
x = np.arange(N)/N * 2*np.pi
y = np.cos(x)
plt.plot(x, y)
[<matplotlib.lines.Line2D at 0x7fe6461d0c70>]
x = np.arange(10)
# データ型
x.dtype
dtype('int64')
# 次元数
x.ndim
1
# 全要素数
x.size
10
# 形状
x.shape
(10,)
# 2次元配列の形状
np.array([[1, 2, 3], [4, 5, 6]]).shape
(2, 3)
# 古い形式の64bit浮動小数点数
np.dtype('d')
dtype('float64')
# 古い形式の32bit整数
np.dtype('i')
dtype('int32')
# listより生成
np.array([0, 1, 2, 3, 4])
array([0, 1, 2, 3, 4])
# tupleより生成
np.array((0, 1, 2))
array([0, 1, 2])
# listのlistを2次元配列に変換
np.array([[0, 1,], [2, 3], [4, 5]])
array([[0, 1], [2, 3], [4, 5]])
# start, stop, strideの形
np.arange(10, 20, 2)
array([10, 12, 14, 16, 18])
# dtypeでデータ型を指定
np.arange(10, dtype=np.float64)
array([0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])
# ゼロで初期化(デフォルトでfloat64)
np.zeros(10)
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
# 多次元配列の場合は形状をtupleで指定
np.zeros((2, 4), dtype=np.int32)
array([[0, 0, 0, 0], [0, 0, 0, 0]], dtype=int32)
# 同じ形状・データ型の配列
x = np.zeros((3, 3), dtype=np.float32)
np.zeros_like(x)
array([[0., 0., 0.], [0., 0., 0.], [0., 0., 0.]], dtype=float32)
# 1で初期化すること以外はzerosと同じ
np.ones((3, 3))
array([[1., 1., 1.], [1., 1., 1.], [1., 1., 1.]])
# 1で初期化すること以外はzeros_likeと同じ
x = np.zeros((3, 3), dtype=np.float32)
np.ones_like(x)
array([[1., 1., 1.], [1., 1., 1.], [1., 1., 1.]], dtype=float32)
# 等間隔の配列(端点含む!)
np.linspace(0.0, 1.0, 11)
array([0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. ])
# logで等間隔の配列
np.logspace(-1, +1, 11)
array([ 0.1 , 0.15848932, 0.25118864, 0.39810717, 0.63095734, 1. , 1.58489319, 2.51188643, 3.98107171, 6.30957344, 10. ])
# logspaceと引数の意味が違う以外は同じ
np.geomspace(0.1, 10.0, 11)
array([ 0.1 , 0.15848932, 0.25118864, 0.39810717, 0.63095734, 1. , 1.58489319, 2.51188643, 3.98107171, 6.30957344, 10. ])
# geomspace / logspaceと同じ
10**np.linspace(np.log10(0.1), np.log10(10.0), 11)
array([ 0.1 , 0.15848932, 0.25118864, 0.39810717, 0.63095734, 1. , 1.58489319, 2.51188643, 3.98107171, 6.30957344, 10. ])
# 乱数配列
np.random.random(5)
array([0.69920186, 0.984085 , 0.08579051, 0.1429193 , 0.72806606])
# 整数の乱数配列
np.random.randint(0, 5, size=10)
array([4, 3, 2, 0, 2, 4, 1, 2, 4, 1])
# 2次元の乱数配列
np.random.random((3, 2))
array([[0.26798215, 0.73555338], [0.79495978, 0.54670385], [0.50731011, 0.56923991]])
# helix1.datの中身を確認
!cat helix1.dat
0.81 0.59 0.50 0.31 0.95 1.00 -0.31 0.95 1.50 -0.81 0.59 2.00 -1.00 0.00 2.50 -0.81 -0.59 3.00 -0.31 -0.95 3.50 0.31 -0.95 4.00 0.81 -0.59 4.50 1.00 -0.00 5.00 0.81 0.59 5.50 0.31 0.95 6.00 -0.31 0.95 6.50 -0.81 0.59 7.00 -1.00 0.00 7.50 -0.81 -0.59 8.00 -0.31 -0.95 8.50 0.31 -0.95 9.00 0.81 -0.59 9.50 1.00 -0.00 10.00 0.81 0.59 10.50 0.31 0.95 11.00 -0.31 0.95 11.50 -0.81 0.59 12.00 -1.00 0.00 12.50 -0.81 -0.59 13.00 -0.31 -0.95 13.50 0.31 -0.95 14.00 0.81 -0.59 14.50 1.00 -0.00 15.00 0.81 0.59 15.50 0.31 0.95 16.00
# 読み込み
x = np.loadtxt('helix1.dat')
x.shape
(32, 3)
# 読み込んだデータを出力
np.savetxt('output.dat', x, fmt='%5.2f')
# output.datの中身を確認
!cat output.dat
0.81 0.59 0.50 0.31 0.95 1.00 -0.31 0.95 1.50 -0.81 0.59 2.00 -1.00 0.00 2.50 -0.81 -0.59 3.00 -0.31 -0.95 3.50 0.31 -0.95 4.00 0.81 -0.59 4.50 1.00 -0.00 5.00 0.81 0.59 5.50 0.31 0.95 6.00 -0.31 0.95 6.50 -0.81 0.59 7.00 -1.00 0.00 7.50 -0.81 -0.59 8.00 -0.31 -0.95 8.50 0.31 -0.95 9.00 0.81 -0.59 9.50 1.00 -0.00 10.00 0.81 0.59 10.50 0.31 0.95 11.00 -0.31 0.95 11.50 -0.81 0.59 12.00 -1.00 0.00 12.50 -0.81 -0.59 13.00 -0.31 -0.95 13.50 0.31 -0.95 14.00 0.81 -0.59 14.50 1.00 -0.00 15.00 0.81 0.59 15.50 0.31 0.95 16.00
# 配列を準備
x = np.linspace(0.0, np.pi, 100)
y = np.cos(x)
# xをNPY形式で保存
np.save("binary1.npy", x)
# x, yをNPZ形式で保存(各配列に名前を付けておく)
np.savez("binary2.npz", x_name=x, y_name=y)
# NPY形式のファイルを読み込み
xx = np.load("binary1.npy")
# 値が同じことを確認
print(np.alltrue(x == xx))
True
# NPZ形式のファイルを読み込み
data = np.load("binary2.npz")
# dataはdict-likeなオブジェクト
print(list(data.keys()))
['x_name', 'y_name']
xx = data['x_name']
yy = data['y_name']
# ファイルから読んだ配列と元の配列の値が同じことを確認する
print(np.alltrue(x == xx))
print(np.alltrue(y == yy))
True True
# ファイルを開く
fp = open('cbinary.dat', 'r')
# データ型(ここではnp.float64)およびデータ数(ここでは10)はあらかじめ知っておく必要あり
z = np.fromfile(fp, np.float64, 10)
# ファイルを閉じる
fp.close()
# 値を出力
print(z)
[1. 1.5 2. 2.5 3. 3.5 4. 4.5 5. 5.5]
# モジュール読み込み
from scipy.io import FortranFile
# ファイルを開く
fp = FortranFile('helix2.dat')
# データ読み込み
x = fp.read_record(np.float64)
y = fp.read_record(np.float64)
z = fp.read_record(np.float64)
# ファイルを閉じる
fp.close()
# 結果を確認
for i in range(x.size):
print('{:5.2f} {:5.2f} {:5.2f}'.format(x[i], y[i], z[i]))
0.81 0.59 0.50 0.31 0.95 1.00 -0.31 0.95 1.50 -0.81 0.59 2.00 -1.00 0.00 2.50 -0.81 -0.59 3.00 -0.31 -0.95 3.50 0.31 -0.95 4.00 0.81 -0.59 4.50 1.00 -0.00 5.00 0.81 0.59 5.50 0.31 0.95 6.00 -0.31 0.95 6.50 -0.81 0.59 7.00 -1.00 0.00 7.50 -0.81 -0.59 8.00 -0.31 -0.95 8.50 0.31 -0.95 9.00 0.81 -0.59 9.50 1.00 -0.00 10.00 0.81 0.59 10.50 0.31 0.95 11.00 -0.31 0.95 11.50 -0.81 0.59 12.00 -1.00 0.00 12.50 -0.81 -0.59 13.00 -0.31 -0.95 13.50 0.31 -0.95 14.00 0.81 -0.59 14.50 1.00 -0.00 15.00 0.81 0.59 15.50 0.31 0.95 16.00
# 以下全てにおいて要素ごとに各種算術演算がなされる
a = np.arange(4)
b = np.arange(4) + 4
a + b
array([ 4, 6, 8, 10])
a - b
array([-4, -4, -4, -4])
a * b
array([ 0, 5, 12, 21])
a / b
array([0. , 0.2 , 0.33333333, 0.42857143])
a**2
array([0, 1, 4, 9])
# degree to radian
np.deg2rad(90.0)
1.5707963267948966
# radian to degree
np.rad2deg(np.pi/2)
90.0
# lowest common multiple
np.lcm(4, 6)
12
# greatest common divisor
np.gcd(12, 20)
4
# 複素数の偏角
np.angle(1.0 + 1.0j)
0.7853981633974483
x = np.arange(10)
np.sum(x)
45
x.sum()
45
x.max()
9
x.min()
0
x.mean()
4.5
x = np.arange(10)
# 3番目の要素
x[2]
2
# 3, 4, 5番目の要素(結果もNumPy配列)
x[2:5]
array([2, 3, 4])
# 0, 2, 4, 6番目の要素に-1を代入
x[:8:2] = -1
x
array([-1, 1, -1, 3, -1, 5, -1, 7, 8, 9])
# 順番を反転
x[::-1]
array([ 9, 8, 7, -1, 5, -1, 3, -1, 1, -1])
# 最後の要素
x[-1]
9
# 最後から2番目の要素
x[-2]
8
# インデックス配列
i = np.arange(1, 10, 2)
i
array([1, 3, 5, 7, 9])
# 指定された要素のみ2倍にする
x[i] *= 2
x
array([-1, 2, -1, 6, -1, 10, -1, 14, 8, 18])
# 1つずらしたインデックス
x[i-1]
array([-1, -1, -1, -1, 8])
# 1次元配列から2次元配列にreshape
y = np.arange(20).reshape((4, 5))
y
array([[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14], [15, 16, 17, 18, 19]])
# ':' は全ての要素
y[0,:]
array([0, 1, 2, 3, 4])
# 2次元目のみ指定
y[:,1]
array([ 1, 6, 11, 16])
# 各次元の2番目から4番目の要素のみ指定
y[1:3,1:3]
array([[ 6, 7], [11, 12]])
# 1次元配列から3次元配列にreshape
z = np.arange(18).reshape((2, 3, 3))
z
array([[[ 0, 1, 2], [ 3, 4, 5], [ 6, 7, 8]], [[ 9, 10, 11], [12, 13, 14], [15, 16, 17]]])
# 3次元目のみ指定
z[...,0]
array([[ 0, 3, 6], [ 9, 12, 15]])
# 1次元目と3次元のみ指定
z[1,...,0]
array([ 9, 12, 15])
# 1次元目のみ指定
z[1]
array([[ 9, 10, 11], [12, 13, 14], [15, 16, 17]])
# 配列の全要素に代入
x[:] = 10
x
array([10, 10, 10, 10, 10, 10, 10, 10, 10, 10])
# 整数10をxに代入(xの配列を破棄されxはスカラーになる)
x = 10
x
10