numpy-100 日本語翻訳 (81-100)
これは、
の22日目の記事です。
趣味で統計と機械学習を学んでいます Pythonが好きになりました
というか、numpy が好きみたいです numpy100 を翻訳したので100 numpy exercises (日本語翻訳版)、ブログにします
1. numpy パッケージを `np` の名前でインポートする (★☆☆)
答え
import numpy as np
2. numpy バージョンとその設定を表示する (★☆☆)
答え
print(np.__version__)
np.show_config()
3. 大きさ 10 の零ベクトルを生成する (★☆☆)
答え
Z = np.zeros(10)
print(Z)
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
4. 配列のメモリーサイズを知る方法は (★☆☆)
答え
Z = np.zeros((10,10))
print(Z.size*Z.itemsize)
800
5. コマンドラインからの、numpy add 関数のドキュメントの取得方法は? (★☆☆)
答え
python -c "import numpy; numpy.info(numpy.add)"
6. 5番目の値だけ 1 の大きさ 10 の零ベクトルを生成する (★☆☆)
答え
Z = np.zeros(10)
Z[4] = 1
print(Z)
[0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]
7. 値の範囲が 10 から 49 であるようなベクトルを生成する (★☆☆)
答え
Z = np.arange(10,50)
print(Z)
[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]
8. ベクトルを逆転する (最初の要素が最後に) (★☆☆)
答え
Z = np.arange(50)
Z = Z[::-1]
print(Z)
[49 48 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26
25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2
1 0]
9. 値の範囲が 0 から 8 であるような 3x3 マトリクスを生成する (★☆☆)
答え
Z = np.arange(9).reshape(3,3)
print(Z)
[[0 1 2]
[3 4 5]
[6 7 8]]
10. [1,2,0,0,4,0] からゼロでない要素の添え字を見つける (★☆☆)
答え
nz = np.nonzero([1,2,0,0,4,0])
print(nz)
(array([0, 1, 4]),)
答え
np.eye(3)
array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])
12. 乱数で 3x3x3 配列を生成する (★☆☆)
答え
Z = np.random.random((3,3,3))
print(Z)
[[[0.52139159 0.71417179 0.98566575]
[0.71946288 0.55356541 0.46827844]
[0.14190383 0.78303101 0.42199173]]
[[0.79905955 0.23618193 0.6525496 ]
[0.78334409 0.34081869 0.50622032]
[0.23197788 0.27511517 0.58518794]]
[[0.71064867 0.88496634 0.44757271]
[0.36761105 0.29457499 0.26001356]
[0.40253981 0.13853578 0.56675828]]]
13. 乱数で 10x10 配列を生成して、その最小値と最大値を見つける (★☆☆)
答え
Z = np.random.random((10,10))
Zmin, Zmax = Z.min(), Z.max()
print(Zmin, Zmax)
0.0013772822154449749 0.9929879247278675
14. 大きさ 30 の乱数のベクトルを生成して、その平均を求める (★☆☆)
答え
Z = np.random.random(30)
m = Z.mean()
print(m)
0.5043710617045838
15. 周囲が 1 で内部が 0 であるような2次元配列生成する (★☆☆)
答え
Z = np.ones((10,10))
Z[1:-1,1:-1] = 0
print(Z)
[[1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
[1. 0. 0. 0. 0. 0. 0. 0. 0. 1.]
[1. 0. 0. 0. 0. 0. 0. 0. 0. 1.]
[1. 0. 0. 0. 0. 0. 0. 0. 0. 1.]
[1. 0. 0. 0. 0. 0. 0. 0. 0. 1.]
[1. 0. 0. 0. 0. 0. 0. 0. 0. 1.]
[1. 0. 0. 0. 0. 0. 0. 0. 0. 1.]
[1. 0. 0. 0. 0. 0. 0. 0. 0. 1.]
[1. 0. 0. 0. 0. 0. 0. 0. 0. 1.]
[1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]]
16. 既存の配列の周囲を 0 で囲む方法は? (★☆☆)
答え
Z = np.ones((5,5))
Z = np.pad(Z, pad_width=1, mode="constant", constant_values=0)
print(Z)
[[0. 0. 0. 0. 0. 0. 0.]
[0. 1. 1. 1. 1. 1. 0.]
[0. 1. 1. 1. 1. 1. 0.]
[0. 1. 1. 1. 1. 1. 0.]
[0. 1. 1. 1. 1. 1. 0.]
[0. 1. 1. 1. 1. 1. 0.]
[0. 0. 0. 0. 0. 0. 0.]]
17. 以下の式の結果は何か? (★☆☆)
0 * np.nan np.nan == np.nan np.inf > np.nan np.nan - np.nan 0.3 == 3 * 0.1
答え
print(0 * np.nan)
print(np.nan == np.nan)
print(np.inf > np.nan)
print(np.nan - np.nan)
print(0.3 == 3 * 0.1)
nan
False
False
nan
False
18. 対角成分の直下に 1,2,3,4 の成分を持つ 5x5 行列を生成する (★☆☆)
答え
Z = np.diag(1+np.arange(4), k=-1)
print(Z)
[[0 0 0 0 0]
[1 0 0 0 0]
[0 2 0 0 0]
[0 0 3 0 0]
[0 0 0 4 0]]
19. 8x8 行列を生成して、市松模様で埋める (★☆☆)
答え
Z = np.zeros((8,8), dtype=int)
Z[1::2,::2] = 1
Z[::2,1::2] = 1
print(Z)
[[0 1 0 1 0 1 0 1]
[1 0 1 0 1 0 1 0]
[0 1 0 1 0 1 0 1]
[1 0 1 0 1 0 1 0]
[0 1 0 1 0 1 0 1]
[1 0 1 0 1 0 1 0]
[0 1 0 1 0 1 0 1]
[1 0 1 0 1 0 1 0]]
20. shape属性が (6,7,8) の配列のとき、100 番目の要素の添え字 (x,y,z)は?
答え
np.unravel_index(100, (6,7,8))
(1, 5, 4)
numpy-100 日本語翻訳 (61-80)
numpy100 を翻訳したので100 numpy exercises (日本語翻訳版)、ブログにしました
61. 与えられた値から最も近い値を配列の中に見つける (★★☆)
答え
Z = np.random.uniform(0,1,10)
z = 0.5
m = Z.flat[np.abs(Z - z).argmin()]
print(m)
0.48621646764171333
62. shape属性が (1,3) と (3,1) の2つの配列があるとき、イテレータを使ってその和を計算する方法は? (★★☆)
答え
A = np.arange(3).reshape(3,1)
B = np.arange(3).reshape(1,3)
it = np.nditer([A,B,None])
for x,y,z in it: z[...] = x + y
print(it.operands[2])
[[0 1 2]
[1 2 3]
[2 3 4]]
63. name属性を持つ配列クラスを作成する (★★☆)
答え
class NamedArray(np.ndarray):
def __new__(cls, array, name="no name"):
obj = np.asarray(array).view(cls)
obj.name = name
return obj
def __array_finalize__(self, obj):
if obj is None: return
self.info = getattr(obj, 'name', "no name")
Z = NamedArray(np.arange(10), "range_10")
print (Z.name)
range_10
64. あるベクトルが与えられたとき、第2のベクトルにより添え字指定されたそれぞれの要素に 1 を加える方法は (添え字は繰り返されることに注意)? (★★★)
答え
# Author: Brett Olsen
Z = np.ones(10)
I = np.random.randint(0,len(Z),20)
Z += np.bincount(I, minlength=len(Z))
print(Z)
# Another solution
# Author: Bartosz Telenczuk
np.add.at(Z, I, 1)
print(Z)
[2. 3. 2. 3. 3. 4. 2. 2. 1. 8.]
[ 3. 5. 3. 5. 5. 7. 3. 3. 1. 15.]
65. 添え字リスト (I) に基づきベクトル (X) の要素を配列 (F) に累積する方法は? (★★★)
答え
# Author: Alan G Isaac
X = [1,2,3,4,5,6]
I = [1,3,9,3,4,1]
F = np.bincount(I,X)
print(F)
[0. 7. 0. 6. 5. 0. 0. 0. 0. 3.]
66. 画像が (w, h, 3) (dtype=ubyte) のとき、ユニークな色の数を計算する(★★★)
答え
# Author: Nadav Horesh
w,h = 16,16
I = np.random.randint(0,2,(h,w,3)).astype(np.ubyte)
F = I[...,0]*256*256 + I[...,1]*256 +I[...,2]
n = len(np.unique(F))
print(np.unique(I))
[0 1]
67. 4次元配列のとき、一気に最後の2軸で合計する方法は? (★★★)
答え
A = np.random.randint(0,10,(3,4,3,4))
# solution by passing a tuple of axes (introduced in numpy 1.7.0)
sum = A.sum(axis=(-2,-1))
print(sum)
# solution by flattening the last two dimensions into one
# (useful for functions that don't accept tuples for axis argument)
sum = A.reshape(A.shape[:-2] + (-1,)).sum(axis=-1)
print(sum)
[[48 56 68 41]
[71 54 49 66]
[55 42 35 55]]
[[48 56 68 41]
[71 54 49 66]
[55 42 35 55]]
68. 1次元ベクトル D を考えたとき、部分集合を添え字で記述する同じサイズのベクトル S を使用して、D の部分集合の平均を計算する方法は?
答え
# Author: Jaime Fernández del Río
D = np.random.uniform(0,1,100)
S = np.random.randint(0,10,100)
D_sums = np.bincount(S, weights=D)
D_counts = np.bincount(S)
D_means = D_sums / D_counts
print(D_means)
# Pandas solution as a reference due to more intuitive code
import pandas as pd
print(pd.Series(D).groupby(S).mean())
[0.60751631 0.68402626 0.43938439 0.51212031 0.45235217 0.50947915
0.52321953 0.29345941 0.56430143 0.43939577]
0 0.607516
1 0.684026
2 0.439384
3 0.512120
4 0.452352
5 0.509479
6 0.523220
7 0.293459
8 0.564301
9 0.439396
dtype: float64
69. ドット積の対角要素を取得する方法は? (★★★)
答え
# Author: Mathieu Blondel
A = np.random.uniform(0,1,(5,5))
B = np.random.uniform(0,1,(5,5))
# Slow version
np.diag(np.dot(A, B))
# Fast version
np.sum(A * B.T, axis=1)
# Faster version
np.einsum("ij,ji->i", A, B)
array([1.92289093, 1.09022359, 0.80127718, 0.80379736, 1.05785065])
70. ベクトル \[1, 2, 3, 4, 5\] があるとき、それぞれの値の間に連続する3つのゼロをはさむ新しいベクトルを生成する方法は? (★★★)
答え
# Author: Warren Weckesser
Z = np.array([1,2,3,4,5])
nz = 3
Z0 = np.zeros(len(Z) + (len(Z)-1)*(nz))
Z0[::nz+1] = Z
print(Z0)
[1. 0. 0. 0. 2. 0. 0. 0. 3. 0. 0. 0. 4. 0. 0. 0. 5.]
71. (5,5,3) 次元の配列があるとき、それに (5,5) 次元の配列を掛ける方法は? (★★★)
答え
A = np.ones((5,5,3))
B = 2*np.ones((5,5))
print(A * B[:,:,None])
[[[2. 2. 2.]
[2. 2. 2.]
[2. 2. 2.]
[2. 2. 2.]
[2. 2. 2.]]
[[2. 2. 2.]
[2. 2. 2.]
[2. 2. 2.]
[2. 2. 2.]
[2. 2. 2.]]
[[2. 2. 2.]
[2. 2. 2.]
[2. 2. 2.]
[2. 2. 2.]
[2. 2. 2.]]
[[2. 2. 2.]
[2. 2. 2.]
[2. 2. 2.]
[2. 2. 2.]
[2. 2. 2.]]
[[2. 2. 2.]
[2. 2. 2.]
[2. 2. 2.]
[2. 2. 2.]
[2. 2. 2.]]]
72. 配列の2つの行を交換する方法は? (★★★)
73. 10個の三角形を記述する10個の三つ組みがあるとき (共有された頂点を持つ) 、すべての三角形を構成するユニークな線分の集合を見つける (★★★)
答え
# Author: Nicolas P. Rougier
faces = np.random.randint(0,100,(10,3))
F = np.roll(faces.repeat(2,axis=1),-1,axis=1)
F = F.reshape(len(F)*3,2)
F = np.sort(F,axis=1)
G = F.view( dtype=[('p0',F.dtype),('p1',F.dtype)] )
G = np.unique(G)
print(G)
[( 8, 47) ( 8, 92) (11, 50) (11, 61) (14, 14) (14, 98) (17, 48) (17, 76)
(18, 61) (18, 75) (21, 36) (21, 71) (24, 78) (24, 91) (34, 53) (34, 86)
(36, 71) (44, 78) (44, 84) (47, 92) (48, 76) (50, 61) (53, 86) (61, 75)
(67, 76) (67, 79) (76, 79) (78, 84) (78, 91)]
74. bincountで与えられる配列 C があるとき、np.bincount(A) == C であるような配列 A の生成方法は? (★★★)
答え
# Author: Jaime Fernández del Río
C = np.bincount([1,1,2,3,4,4,6])
A = np.repeat(np.arange(len(C)), C)
print(A)
[1 1 2 3 4 4 6]
75. 配列にスライドウィンドウを使って平均を計算する方法は? (★★★)
答え
# Author: Jaime Fernández del Río
def moving_average(a, n=3) :
ret = np.cumsum(a, dtype=float)
ret[n:] = ret[n:] - ret[:-n]
return ret[n - 1:] / n
Z = np.arange(20)
print(moving_average(Z, n=3))
[ 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.]
76. 1次元の配列 Z があるとき、最初の行が (Z\[0\],Z\[1\],Z\[2\]) で、それに続く行はそれぞれ 1 だけシフトされた2次元配列を生成する (最後の行は、(Z\[-3\],Z\[-2\],Z\[-1\]) になる) (★★★)
答え
# Author: Joe Kington / Erik Rigtorp
from numpy.lib import stride_tricks
def rolling(a, window):
shape = (a.size - window + 1, window)
strides = (a.itemsize, a.itemsize)
return stride_tricks.as_strided(a, shape=shape, strides=strides)
Z = rolling(np.arange(10), 3)
print(Z)
[[0 1 2]
[1 2 3]
[2 3 4]
[3 4 5]
[4 5 6]
[5 6 7]
[6 7 8]
[7 8 9]]
77. ブール値を否定する方法、また、浮動小数点の符号を変更する方法は? (★★★)
答え
# Author: Nathaniel J. Smith
Z = np.random.randint(0,2,100)
np.logical_not(Z, out=Z)
Z = np.random.uniform(-1.0,1.0,100)
np.negative(Z, out=Z)
array([ 6.66898337e-01, -6.98527739e-04, 9.20447662e-02, -5.73084574e-02,
-6.53843844e-02, -9.91554888e-01, -9.13247565e-01, -3.97117480e-01,
-2.39728156e-01, -8.17936435e-01, -7.16220887e-01, -4.50298191e-01,
-3.87611399e-01, 1.93408286e-01, 2.57558774e-01, -2.65953798e-01,
-3.53615965e-01, 1.08129061e-02, 8.79310991e-01, -4.05659194e-01,
2.88015696e-01, -5.07333423e-01, -3.07480683e-02, 6.62792058e-01,
6.40187694e-01, -9.84522055e-01, 5.67391835e-01, -4.99376218e-01,
-6.19606963e-01, -4.01239902e-01, 3.62533032e-01, -7.20593105e-01,
1.05007658e-01, 9.37454411e-01, 9.56880248e-01, -6.87804748e-01,
1.22142154e-02, 3.59736011e-02, -1.59751748e-01, -4.09656167e-01,
3.28994958e-01, 8.46701615e-01, 4.18183319e-01, 8.11740559e-01,
-5.74192505e-01, 3.07455282e-01, -8.56346769e-01, 1.75783012e-01,
-3.29576220e-01, 2.11181297e-01, 3.10209125e-01, 8.93834215e-01,
-6.96852422e-01, 3.89852980e-01, 8.04869146e-01, 4.80201513e-01,
5.60469139e-01, -2.70319847e-01, 8.01106341e-01, 7.11306274e-01,
5.40219612e-01, -5.44787360e-01, 4.80961559e-01, -1.62117647e-01,
-3.88579077e-01, 8.97179975e-01, -2.39643365e-01, 6.39871872e-01,
3.48702200e-01, 6.86647145e-01, 2.25676066e-01, 5.93469341e-02,
-3.63841598e-01, 9.00214436e-01, 2.67690114e-01, -5.13486996e-01,
-2.51272595e-01, -6.91807367e-02, -9.04999894e-01, -8.64407656e-02,
-9.06695725e-01, 6.72690131e-01, -9.74125086e-01, -7.81823233e-01,
-8.86791167e-01, 9.11039945e-01, 1.88707089e-01, -1.78731880e-01,
-3.09510067e-02, 7.96961668e-01, 6.71530888e-01, -6.46892404e-01,
-7.30535643e-01, 4.05945868e-01, -5.43933229e-01, 2.33200937e-01,
-6.84542747e-01, -6.58881534e-01, 9.18060795e-01, -8.66962555e-01])
78. 直線 (2次元) を記述する2組の点 P0、P1そして点 p があるとき、点 p から直線 i (P0\[i\],P1\[i\]) までの距離を計算する方法は? (★★★)
答え
def distance(P0, P1, p):
T = P1 - P0
L = (T**2).sum(axis=1)
U = -((P0[:,0]-p[...,0])*T[:,0] + (P0[:,1]-p[...,1])*T[:,1]) / L
U = U.reshape(len(U),1)
D = P0 + U*T - p
return np.sqrt((D**2).sum(axis=1))
P0 = np.random.uniform(-10,10,(10,2))
P1 = np.random.uniform(-10,10,(10,2))
p = np.random.uniform(-10,10,( 1,2))
print(distance(P0, P1, p))
[ 0.7226039 1.74754301 3.9490312 1.42006718 5.44462552 1.15105765
3.42139445 10.15384561 2.61928783 4.91884265]
79. 直線 (2次元) を記述する2組の点 P0、P1 そして1組の点 P があるとき、それぞれの点 (P\[j\]) から各線 i (P0\[i\],P1\[i\]) までの距離を計算する方法は? (★★★)
答え
# Author: Italmassov Kuanysh
# based on distance function from previous question
P0 = np.random.uniform(-10, 10, (10,2))
P1 = np.random.uniform(-10,10,(10,2))
p = np.random.uniform(-10, 10, (10,2))
print(np.array([distance(P0,P1,p_i) for p_i in p]))
[[9.98756271e+00 2.34704447e+00 9.97834806e-02 2.57026169e+00
5.04216551e+00 3.91132449e+00 7.18967689e+00 6.02350716e+00
1.05165640e+00 3.68076127e+00]
[1.83277951e+01 8.78620184e-02 6.79192484e+00 2.48600068e+00
1.16547097e+01 4.38650385e-01 1.55870665e+01 1.34332685e+01
7.10214556e+00 1.09984504e+01]
[7.04576863e-03 1.08440837e+01 4.20935929e+00 3.22858524e+00
1.52264075e+00 2.11280475e+00 2.14734189e+00 7.11347051e-01
8.62907352e+00 7.50194529e+00]
[1.03580725e+01 2.45984233e+00 3.16653178e+00 6.73608883e+00
1.75530750e+00 8.60202639e+00 6.97248436e+00 3.45269953e+00
2.47277467e+00 5.96778238e+00]
[1.78814722e+00 1.46284952e+01 3.34615542e-01 1.84363281e+00
6.19500070e+00 3.03098868e+00 1.95737750e-01 4.93769777e+00
5.25580460e+00 7.70710690e+00]
[1.76140340e+01 2.41584465e-01 5.82747522e+00 1.56560370e+00
1.06910794e+01 1.27401054e+00 1.48028514e+01 1.24770151e+01
6.20624979e+00 1.05901258e+01]
[1.61500892e+00 4.71978411e-01 1.06637460e+01 1.23914551e+01
5.46604846e+00 1.26340574e+01 1.87820747e+00 4.54936210e+00
1.11645543e+01 1.54476255e+00]
[3.23456564e+00 5.21794419e+00 4.93342259e+00 5.69255437e+00
4.80533239e-01 5.65080569e+00 5.21034449e-01 6.65736349e-01
7.25900656e+00 2.67851598e+00]
[1.76621308e+01 7.38610617e+00 1.13429040e+01 8.72235461e+00
1.65420981e+01 6.61149793e+00 1.58094945e+01 1.72276677e+01
9.14841151e+00 7.44725533e+00]
[9.54322480e+00 1.14113904e-01 2.15342470e+00 5.03489344e+00
2.89954185e+00 6.51885356e+00 6.44716933e+00 4.17873216e+00
2.37774627e+00 4.27188182e+00]]
80. 任意の配列に対して、定められたshape属性で、指定された要素が中央に配置されるような一部分を抽出する関数を書く(必要に応じて `fill` 値でパディング) (★★★)
答え
# Author: Nicolas Rougier
Z = np.random.randint(0,10,(10,10))
shape = (5,5)
fill = 0
position = (1,1)
R = np.ones(shape, dtype=Z.dtype)*fill
P = np.array(list(position)).astype(int)
Rs = np.array(list(R.shape)).astype(int)
Zs = np.array(list(Z.shape)).astype(int)
R_start = np.zeros((len(shape),)).astype(int)
R_stop = np.array(list(shape)).astype(int)
Z_start = (P-Rs//2)
Z_stop = (P+Rs//2)+Rs%2
R_start = (R_start - np.minimum(Z_start,0)).tolist()
Z_start = (np.maximum(Z_start,0)).tolist()
R_stop = np.maximum(R_start, (R_stop - np.maximum(Z_stop-Zs,0))).tolist()
Z_stop = (np.minimum(Z_stop,Zs)).tolist()
r = [slice(start,stop) for start,stop in zip(R_start,R_stop)]
z = [slice(start,stop) for start,stop in zip(Z_start,Z_stop)]
R[r] = Z[z]
print(Z)
print(R)
[[1 7 3 6 6 4 9 4 8 4]
[7 1 1 7 0 0 1 1 1 5]
[3 2 6 4 8 8 9 9 0 4]
[7 0 3 8 9 8 4 4 2 6]
[8 3 4 1 9 9 0 0 1 9]
[7 8 4 4 2 7 8 8 4 0]
[2 1 7 6 2 9 4 5 0 3]
[5 1 0 4 2 0 5 6 4 4]
[9 4 4 2 4 8 4 3 8 9]
[8 4 2 6 6 0 0 8 8 1]]
[[0 0 0 0 0]
[0 1 7 3 6]
[0 7 1 1 7]
[0 3 2 6 4]
[0 7 0 3 8]]
numpy-100 日本語翻訳 (41-60)
numpy100 を翻訳したので100 numpy exercises (日本語翻訳版)、ブログにしました
41. np.sumより高速に小さい配列を集計する方法は? (★★☆)
答え
Z = np.arange(10)
%timeit np.add.reduce(Z)
%timeit Z.sum()
3.69 µs ± 162 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
6.33 µs ± 362 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
42. A と B の2つの乱数配列があるとき、それらが等しいかをチェックする (★★☆)
答え
A = np.random.randint(0,2,5)
B = np.random.randint(0,2,5)
# Assuming identical shape of the arrays and a tolerance for the comparison of values
equal = np.allclose(A,B)
print(equal)
# Checking both the shape and the element values, no tolerance (values have to be exactly equal)
equal = np.array_equal(A,B)
print(equal)
False
False
43. イミュータブル(読み取り専用)の配列を生成する (★★☆)
答え
Z = np.zeros(10)
Z.flags.writeable = False
Z[0] = 1
1 Z = np.zeros(10)
2 Z.flags.writeable = False
----> 3 Z[0] = 1
ValueError: assignment destination is read-only
44. 直交座標で 10x2 行列があるとき、それらを極座標に変換する (★★☆)
答え
Z = np.random.random((10,2))
X, Y = Z[:,0], Z[:,1]
R = np.sqrt(X**2+Y**2)
T = np.arctan2(Y,X)
print(R)
print(T)
[0.87681217 0.3161743 0.90135585 0.6531784 0.64847374 0.68742857
0.84485734 1.12235679 0.62017815 1.0990964 ]
[0.38481736 1.46375703 0.99300613 0.22501077 1.3079256 0.5497876
0.44970742 0.92537148 1.02306295 1.064497 ]
45. 大きさ 10 の乱数のベクトルを生成して、その最大値を 0 に置き換える (★★☆)
答え
Z = np.random.random(10)
Z[Z.argmax()] = 0
print(Z)
[0.29018266 0.2156002 0.68783096 0.51589855 0.10440006 0.10542743
0.5956617 0.06487708 0. 0.3238788 ]
46. [0,1]x[0,1] 領域を網羅する `x` 座標と `y` 座標を持つ構造化配列を生成する (★★☆)
答え
Z = np.zeros((5,5), [('x',float),('y',float)])
Z['x'], Z['y'] = np.meshgrid(np.linspace(0,1,5),
np.linspace(0,1,5))
print(Z)
[[(0. , 0. ) (0.25, 0. ) (0.5 , 0. ) (0.75, 0. ) (1. , 0. )]
[(0. , 0.25) (0.25, 0.25) (0.5 , 0.25) (0.75, 0.25) (1. , 0.25)]
[(0. , 0.5 ) (0.25, 0.5 ) (0.5 , 0.5 ) (0.75, 0.5 ) (1. , 0.5 )]
[(0. , 0.75) (0.25, 0.75) (0.5 , 0.75) (0.75, 0.75) (1. , 0.75)]
[(0. , 1. ) (0.25, 1. ) (0.5 , 1. ) (0.75, 1. ) (1. , 1. )]]
47. 2つの配列 X と Y が与えられたとき、コーシー行列 C (Cij =1/(xi - yj)) を作成する
答え
# Author: Evgeni Burovski
X = np.arange(8)
Y = X + 0.5
C = 1.0 / np.subtract.outer(X, Y)
print(np.linalg.det(C))
3638.163637117973
48. numpy スカラー型のそれぞれについて、表現可能な最小値と最大値を表示する (★★☆)
答え
for dtype in [np.int8, np.int32, np.int64]:
print(np.iinfo(dtype).min)
print(np.iinfo(dtype).max)
for dtype in [np.float32, np.float64]:
print(np.finfo(dtype).min)
print(np.finfo(dtype).max)
print(np.finfo(dtype).eps)
-128
127
-2147483648
2147483647
-9223372036854775808
9223372036854775807
-3.4028235e+38
3.4028235e+38
1.1920929e-07
-1.7976931348623157e+308
1.7976931348623157e+308
2.220446049250313e-16
49. 配列のすべての値を表示する方法は? (★★☆)
答え
np.set_printoptions(threshold=np.nan)
Z = np.zeros((16,16))
print(Z)
[[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]]
50. ベクトルの中で指定したスカラーに最も近い値を見つける方法は? (★★☆)
答え
Z = np.arange(100)
v = np.random.uniform(0,100)
index = (np.abs(Z-v)).argmin()
print(Z[index])
27
51. 位置 (x,y) と 色 (r,g,b) を表現する構造化配列を生成する (★★☆)
答え
Z = np.zeros(10, [ ('position', [ ('x', float, 1),
('y', float, 1)]),
('color', [ ('r', float, 1),
('g', float, 1),
('b', float, 1)])])
print(Z)
[((0., 0.), (0., 0., 0.)) ((0., 0.), (0., 0., 0.))
((0., 0.), (0., 0., 0.)) ((0., 0.), (0., 0., 0.))
((0., 0.), (0., 0., 0.)) ((0., 0.), (0., 0., 0.))
((0., 0.), (0., 0., 0.)) ((0., 0.), (0., 0., 0.))
((0., 0.), (0., 0., 0.)) ((0., 0.), (0., 0., 0.))]
52. shape属性が (100,2) の座標を表現する乱数のベクトルがあるとき、各点ごとの距離を求める (★★☆)
答え
Z = np.random.random((10,2))
print(Z)
X,Y = np.atleast_2d(Z[:,0], Z[:,1])
print(X)
print(Y)
D = np.sqrt( (X-X.T)**2 + (Y-Y.T)**2)
print(D)
# Much faster with scipy
import scipy
# Thanks Gavin Heverly-Coulson (#issue 1)
import scipy.spatial
Z = np.random.random((10,2))
D = scipy.spatial.distance.cdist(Z,Z)
#print(D)
[[0.7980893 0.33239862]
[0.97533603 0.42018656]
[0.85555926 0.98653372]
[0.48482279 0.0796708 ]
[0.16214624 0.86730474]
[0.2950525 0.74110581]
[0.48556481 0.85537827]
[0.40602013 0.21004549]
[0.5410404 0.14348235]
[0.51723398 0.67408857]]
0.7980893 0.97533603 0.85555926 0.48482279 0.16214624 0.2950525
0.48556481 0.40602013 0.5410404 0.51723398
0.33239862 0.42018656 0.98653372 0.0796708 0.86730474 0.74110581
0.85537827 0.21004549 0.14348235 0.67408857
[[0. 0.19779567 0.6566548 0.40250126 0.83099226 0.64814164
0.60924484 0.41071708 0.31900391 0.44230276]
[0.19779567 0. 0.57887441 0.59712162 0.92800448 0.75218006
0.65518522 0.60686066 0.51495429 0.52375922]
[0.6566548 0.57887441 0. 0.97971726 0.70358878 0.61188454
0.39255273 0.89722874 0.89980983 0.46052792]
[0.40250126 0.59712162 0.97971726 0. 0.85116825 0.68811993
0.77570783 0.15233981 0.08504313 0.59530075]
[0.83099226 0.92800448 0.70358878 0.85116825 0. 0.18327641
0.32363839 0.70104508 0.81699427 0.40425214]
[0.64814164 0.75218006 0.61188454 0.68811993 0.18327641 0.
0.22215565 0.54253007 0.64626918 0.23206878]
[0.60924484 0.65518522 0.39255273 0.77570783 0.32363839 0.22215565
0. 0.6502167 0.71405416 0.18403503]
[0.41071708 0.60686066 0.89722874 0.15233981 0.70104508 0.54253007
0.6502167 0. 0.15053612 0.47718393]
[0.31900391 0.51495429 0.89980983 0.08504313 0.81699427 0.64626918
0.71405416 0.15053612 0. 0.53114001]
[0.44230276 0.52375922 0.46052792 0.59530075 0.40425214 0.23206878
0.18403503 0.47718393 0.53114001 0. ]]
53. 浮動小数点 (32 bits) 配列を整数型 (32 bits) 配列に変換する方法は?
答え
Z = np.arange(10, dtype=np.float32)
Z = Z.astype(np.int32, copy=False)
print(Z)
[0 1 2 3 4 5 6 7 8 9]
54. 以下のファイル(文字列)を読む方法は? (★★☆)
1, 2, 3, 4, 5 6, , , 7, 8 , , 9,10,11
答え
from io import StringIO
# Fake file
s = StringIO("""1, 2, 3, 4, 5\n
6, , , 7, 8\n
, , 9,10,11\n""")
Z = np.genfromtxt(s, delimiter=",", dtype=np.int)
print(Z)
[[ 1 2 3 4 5]
[ 6 -1 -1 7 8]
[-1 -1 9 10 11]]
55. numpy 配列で enumerate に相当するものは何ですか?
答え
Z = np.arange(9).reshape(3,3)
for index, value in np.ndenumerate(Z):
print(index, value)
for index in np.ndindex(Z.shape):
print(index, Z[index])
(0, 0) 0
(0, 1) 1
(0, 2) 2
(1, 0) 3
(1, 1) 4
(1, 2) 5
(2, 0) 6
(2, 1) 7
(2, 2) 8
(0, 0) 0
(0, 1) 1
(0, 2) 2
(1, 0) 3
(1, 1) 4
(1, 2) 5
(2, 0) 6
(2, 1) 7
(2, 2) 8
56. 一般的な2次元正規分布の配列を生成する (★★☆)
答え
X, Y = np.meshgrid(np.linspace(-1,1,10), np.linspace(-1,1,10))
D = np.sqrt(X*X+Y*Y)
sigma, mu = 1.0, 0.0
G = np.exp(-( (D-mu)**2 / ( 2.0 * sigma**2 ) ) )
print(G)
[[0.36787944 0.44822088 0.51979489 0.57375342 0.60279818 0.60279818
0.57375342 0.51979489 0.44822088 0.36787944]
[0.44822088 0.54610814 0.63331324 0.69905581 0.73444367 0.73444367
0.69905581 0.63331324 0.54610814 0.44822088]
[0.51979489 0.63331324 0.73444367 0.81068432 0.85172308 0.85172308
0.81068432 0.73444367 0.63331324 0.51979489]
[0.57375342 0.69905581 0.81068432 0.89483932 0.9401382 0.9401382
0.89483932 0.81068432 0.69905581 0.57375342]
[0.60279818 0.73444367 0.85172308 0.9401382 0.98773022 0.98773022
0.9401382 0.85172308 0.73444367 0.60279818]
[0.60279818 0.73444367 0.85172308 0.9401382 0.98773022 0.98773022
0.9401382 0.85172308 0.73444367 0.60279818]
[0.57375342 0.69905581 0.81068432 0.89483932 0.9401382 0.9401382
0.89483932 0.81068432 0.69905581 0.57375342]
[0.51979489 0.63331324 0.73444367 0.81068432 0.85172308 0.85172308
0.81068432 0.73444367 0.63331324 0.51979489]
[0.44822088 0.54610814 0.63331324 0.69905581 0.73444367 0.73444367
0.69905581 0.63331324 0.54610814 0.44822088]
[0.36787944 0.44822088 0.51979489 0.57375342 0.60279818 0.60279818
0.57375342 0.51979489 0.44822088 0.36787944]]
57. 2次元配列中に p 個の要素をランダムに配置する方法は? (★★☆)
答え
# Author: Divakar
n = 10
p = 3
Z = np.zeros((n,n))
np.put(Z, np.random.choice(range(n*n), p, replace=False),1)
print(Z)
[[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[1. 1. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]]
58. 行列の各行からその平均を減算する (★★☆)
答え
# Author: Warren Weckesser
X = np.random.rand(5, 10)
# Recent versions of numpy
Y = X - X.mean(axis=1, keepdims=True)
# Older versions of numpy
Y = X - X.mean(axis=1).reshape(-1, 1)
print(Y)
[[ 0.17467156 0.39610569 -0.15474385 -0.10768295 -0.30852725 -0.23045708
0.30775199 -0.20708909 0.31331994 -0.18334896]
[-0.34197514 -0.25747791 0.20978006 0.29652348 0.1252613 -0.01937976
0.19479692 -0.36073304 0.28232472 -0.12912062]
[-0.32253107 0.12600989 -0.47445115 0.27678715 -0.04236603 -0.49955442
0.3475865 0.33831996 -0.04925552 0.29945469]
[-0.32450816 -0.0818643 0.29232411 0.31703995 0.54894657 -0.31751116
0.48092611 -0.3087898 -0.33459605 -0.27196727]
[-0.30280297 -0.23644529 -0.20628806 -0.30144542 0.25597645 -0.01116676
0.45472822 0.0503685 -0.30044417 0.5975195 ]]
59. 配列を n 番目の列でソートする方法は? (★★☆)
答え
# Author: Steve Tjoa
Z = np.random.randint(0,10,(3,3))
print(Z)
print(Z[Z[:,1].argsort()])
[[0 3 9]
[8 0 7]
[8 3 1]]
[[8 0 7]
[0 3 9]
[8 3 1]]
60. 与えられた2次元配列に全てがゼロの列があるかを調べる方法は? (★★☆)
答え
# Author: Warren Weckesser
Z = np.random.randint(0,3,(3,10))
print(Z)
print((~Z.any(axis=0)).any())
[[1 2 2 2 2 2 0 0 1 2]
[2 1 2 1 1 2 1 0 2 2]
[2 1 1 0 0 1 1 0 2 1]]
True
numpy-100 日本語翻訳 (21-40)
numpy100 を翻訳したので100 numpy exercises (日本語翻訳版)、ブログにしました
21. tile 関数を使って 8x8 の市松模様の行列を生成する (★☆☆)
答え
22. 5x5 の乱数の行列を正規化する (★☆☆)
答え
23. 色を 4 個の符号なしバイト型 (RGBA) で表現するカスタム dtype を作成する (★☆☆)
答え
24. 5x3 行列と 3x2 行列の掛け算 (実数の行列積) (★☆☆)
答え
25. 1次元配列が与えられたとき、3番目から8番目の全要素を-1にする (★☆☆)
答え
26. 以下のスクリプトの出力は? (★☆☆)
# Author: Jake VanderPlas print(sum(range(5),-1)) from numpy import * print(sum(range(5),-1))
答え
27. Z が整数型のベクトルのとき、これらの式のどれが適切か? (★☆☆)
Z**Z 2 << Z >> 2 Z <- Z 1j*Z Z/1/1 ZZ
答え
28. 以下の式の結果は何か?
print(np.array(0) / np.array(0)) print(np.array(0) // np.array(0)) print(np.array([np.nan]).astype(int).astype(float)
答え
29. ゼロから遠くなるように浮動小数点型の配列の小数点を丸める方法は? (★☆☆)
答え
30. 2つの配列に共通する値の見つけ方は? (★☆☆)
答え
31. すべての numpy の警告を無視する方法は (非推奨)? (★☆☆)
答え
32. 以下の式は正しいですか? (★☆☆)
np.sqrt(-1) == np.emath.sqrt(-1)
答え
33. 昨日、今日、明日の日付の取得方法は? (★☆☆)
答え
34. 2016年7月のすべての日付の取得方法は? (★★☆)
答え
35.
((A+B)*(-A/2))
の計算方法は (copyせずに)? (★★☆)
答え
36. 乱数の配列から整数部分を抽出する5種類の方法は (★★☆)
答え
37. 行の値が 0 から 4 の 5x5 行列を生成する (★★☆)
答え
38. 10個の整数を生成するジェネレータ関数があるとき、それを使って配列を生成する (★☆☆)
答え
39. 0 から 1 の範囲の値を持つ大きさ 10 のベクトルを生成する (ただし、両端の 0 と 1 は含めない) (★★☆)
答え
40. 大きさが 10 の乱数を生成して、それを並びかえる (★★☆)
答え
Z = np.random.random(10)
Z.sort()
print(Z)
[0.05927249 0.08552114 0.12987335 0.20097557 0.22175876 0.37299276
0.39795321 0.40155124 0.64217058 0.98197582]
numpy-100 日本語翻訳 (1-20)
これは、
の22日目の記事です。
1. numpy パッケージを `np` の名前でインポートする (★☆☆)
答え
import numpy as np
2. numpy バージョンとその設定を表示する (★☆☆)
答え
print(np.__version__)
np.show_config()
3. 大きさ 10 の零ベクトルを生成する (★☆☆)
答え
Z = np.zeros(10)
print(Z)
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
4. 配列のメモリーサイズを知る方法は (★☆☆)
答え
Z = np.zeros((10,10))
print(Z.size*Z.itemsize)
800
5. コマンドラインからの、numpy add 関数のドキュメントの取得方法は? (★☆☆)
答え
python -c "import numpy; numpy.info(numpy.add)"
6. 5番目の値だけ 1 の大きさ 10 の零ベクトルを生成する (★☆☆)
答え
Z = np.zeros(10)
Z[4] = 1
print(Z)
[0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]
7. 値の範囲が 10 から 49 であるようなベクトルを生成する (★☆☆)
答え
Z = np.arange(10,50)
print(Z)
[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]
8. ベクトルを逆転する (最初の要素が最後に) (★☆☆)
答え
Z = np.arange(50)
Z = Z[::-1]
print(Z)
[49 48 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26
25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2
1 0]
9. 値の範囲が 0 から 8 であるような 3x3 マトリクスを生成する (★☆☆)
答え
Z = np.arange(9).reshape(3,3)
print(Z)
[[0 1 2]
[3 4 5]
[6 7 8]]
10. [1,2,0,0,4,0] からゼロでない要素の添え字を見つける (★☆☆)
答え
nz = np.nonzero([1,2,0,0,4,0])
print(nz)
(array([0, 1, 4]),)
答え
np.eye(3)
array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])
12. 乱数で 3x3x3 配列を生成する (★☆☆)
答え
Z = np.random.random((3,3,3))
print(Z)
[[[0.52139159 0.71417179 0.98566575]
[0.71946288 0.55356541 0.46827844]
[0.14190383 0.78303101 0.42199173]]
[[0.79905955 0.23618193 0.6525496 ]
[0.78334409 0.34081869 0.50622032]
[0.23197788 0.27511517 0.58518794]]
[[0.71064867 0.88496634 0.44757271]
[0.36761105 0.29457499 0.26001356]
[0.40253981 0.13853578 0.56675828]]]
13. 乱数で 10x10 配列を生成して、その最小値と最大値を見つける (★☆☆)
答え
Z = np.random.random((10,10))
Zmin, Zmax = Z.min(), Z.max()
print(Zmin, Zmax)
0.0013772822154449749 0.9929879247278675
14. 大きさ 30 の乱数のベクトルを生成して、その平均を求める (★☆☆)
答え
Z = np.random.random(30)
m = Z.mean()
print(m)
0.5043710617045838
15. 周囲が 1 で内部が 0 であるような2次元配列生成する (★☆☆)
答え
Z = np.ones((10,10))
Z[1:-1,1:-1] = 0
print(Z)
[[1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
[1. 0. 0. 0. 0. 0. 0. 0. 0. 1.]
[1. 0. 0. 0. 0. 0. 0. 0. 0. 1.]
[1. 0. 0. 0. 0. 0. 0. 0. 0. 1.]
[1. 0. 0. 0. 0. 0. 0. 0. 0. 1.]
[1. 0. 0. 0. 0. 0. 0. 0. 0. 1.]
[1. 0. 0. 0. 0. 0. 0. 0. 0. 1.]
[1. 0. 0. 0. 0. 0. 0. 0. 0. 1.]
[1. 0. 0. 0. 0. 0. 0. 0. 0. 1.]
[1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]]
16. 既存の配列の周囲を 0 で囲む方法は? (★☆☆)
答え
Z = np.ones((5,5))
Z = np.pad(Z, pad_width=1, mode="constant", constant_values=0)
print(Z)
[[0. 0. 0. 0. 0. 0. 0.]
[0. 1. 1. 1. 1. 1. 0.]
[0. 1. 1. 1. 1. 1. 0.]
[0. 1. 1. 1. 1. 1. 0.]
[0. 1. 1. 1. 1. 1. 0.]
[0. 1. 1. 1. 1. 1. 0.]
[0. 0. 0. 0. 0. 0. 0.]]
17. 以下の式の結果は何か? (★☆☆)
0 * np.nan np.nan == np.nan np.inf > np.nan np.nan - np.nan 0.3 == 3 * 0.1
答え
print(0 * np.nan)
print(np.nan == np.nan)
print(np.inf > np.nan)
print(np.nan - np.nan)
print(0.3 == 3 * 0.1)
nan
False
False
nan
False
18. 対角成分の直下に 1,2,3,4 の成分を持つ 5x5 行列を生成する (★☆☆)
答え
Z = np.diag(1+np.arange(4), k=-1)
print(Z)
[[0 0 0 0 0]
[1 0 0 0 0]
[0 2 0 0 0]
[0 0 3 0 0]
[0 0 0 4 0]]
19. 8x8 行列を生成して、市松模様で埋める (★☆☆)
答え
Z = np.zeros((8,8), dtype=int)
Z[1::2,::2] = 1
Z[::2,1::2] = 1
print(Z)
[[0 1 0 1 0 1 0 1]
[1 0 1 0 1 0 1 0]
[0 1 0 1 0 1 0 1]
[1 0 1 0 1 0 1 0]
[0 1 0 1 0 1 0 1]
[1 0 1 0 1 0 1 0]
[0 1 0 1 0 1 0 1]
[1 0 1 0 1 0 1 0]]
20. shape属性が (6,7,8) の配列のとき、100 番目の要素の添え字 (x,y,z)は?
答え
np.unravel_index(100, (6,7,8))
(1, 5, 4)
pdf が好き、なければ自炊だな
これは、
の14日目の記事です。
そもそも
昨年末に、
iPadで電子書籍を読み、書き込みをする喜びを知ってしまった
趣味やら仕事やらの技術書の自炊生活が始まった
ときどき、自炊方法を聞かれるので、書きます
1. 使っているツール
スキャナーはScanSnap ix500、無水エタノールとメガネ拭きは、スキャナーのセンサー面の汚れを取るために使っています、pdfエディターは目次作成と圧縮用です
2. 手順一覧
ローラーカッターが約50枚程度の裁断ができるので、カッターで50枚程度に小分けしてスキャンします
スキャナーの設定をカラーと白黒を自動判定させるとイマイチなので、表紙はカラーで本文はグレースケールでスキャン(300dpi)して、pdfエディタでまとめます
- 本の背を手で割る
- 本の背をアートナイフで切る
- ローラーカッターで裁断
- Snapscanでスキャン + OCR
- pdfExpert で表紙と本文をまとめる
- pdfExpert で目次を作る
- pdfExpert で圧縮
3. 手順の詳細背
1. 本の背を手で割る
ノリづけされている本の背を手で、50ページ程度で小分けするために、ノリ部分を外側に折って割れ目を付けます(ほどほどで)
2. 本の背をアートナイフで切る
手で割ったノリの部分を、アートカッターで切ります
アートナイフの刃は引いてはいけません、少しずつ真下に押して切ります(重要)
引くと勢いがついて背でなくページそのものを切るので注意!
3. ローラーカッターで裁断
50ページずつ、ローラーカッターで裁断します
本格的な裁断機は魅力的ですが個人で持つには大げさ過ぎなので
4. Snapscanでスキャン + OCR
ページが完全に1枚ごとになっているか確認します
本文が白黒の場合には、本文はグレースケール、表紙はカラーで別々にスキャンします
5. pdfExpert で表紙と本文をまとめる
表紙と本文を別々にスキャンした場合、pdfエディタで編集して一つにします
6. pdfExpert で目次を作る
これは、一番地味で時間のかかる行程ですが、自分はマストだと思います
やり方は、目次にする項目を選択して、右クリック、Add Outline itemです
7. pdfExpert で圧縮
iPadで表示させるとき、pdf の容量が大きいとのろまになります
適当に圧縮します、圧縮前のものはバックアップに別に取っておきます
4. 目次についての詳細
自炊したものに目次をつけるってのは、
OCRしたことで、イメージの上に透明な文字が配置された状態になっています
pdfエディタでの目次作成は、本文中の各章の透明な文字を選択する作業です
必ずしも完全に読み取られないので、間違ったOCRに対しては手で修正します
まあ、地味な作業ですけど
5. ツールの詳細
川が好き、カヤックが好き
もう、30年以上、川に通ってカヤックで遊んでいます
いつも決まって聞かれる質問と回答を書きます(いまさらですが)
ひっくり返っても大丈夫ですか?
大丈夫なはずがありません
転覆のことを『沈』、更に泳いでしまうことを『脱』といいます
合わせて『沈脱』ですが、『沈脱』はまずいです
『沈』しても『脱』しないようにロールという技術で復帰します
危なくないですか?
危ないです、ケガもします
自然相手なので当然そうなります
川は岩があるので、ヘルメットをかぶります
冬も漕ぐんですか、寒くないですか?
漕ぎます、寒いです
ドライウェアがあるので、以外に大丈夫ですが
冬は寒いに決まっています
川下りした後は、どうやって戻るの?
1台の自動車は、下流において、着替えもおいて、
もう1台の自動車で、上流までカヤックを運んで川下りします
1人の時は、上流までバスや電車で移動します
カヤックってカヌーですよね?
大きな意味で、カヌーはカヤックかな
カヤックのパドルは、棒の両側にブレードがありますが
カヌーのパドルは、一方だけにしかブレードがありません
シーカヤックはしないのですか?
個人的志向ですが、自分は川が好きです
海はうねりや潮流があり、気が抜けません