リストの活用例1
その1:ベクトルの計算過程
code:python
import numpy
x_list = []
x1, x2 = 1, 1
for i in range(10):
x_list.append(numpy.array(x1, x2))
x1, x2 = x1/2, x2/3
print(x_list)
ここで、x_listは10個のndarrayを有するリストとなる。
code:text
[array(1, 1), array(0.5 , 0.33333333), array(0.25 , 0.11111111), array(0.125 , 0.03703704), array(0.0625 , 0.01234568), array(0.03125 , 0.00411523), array(0.015625 , 0.00137174), array(0.0078125 , 0.00045725), array(0.00390625, 0.00015242), array(1.95312500e-03, 5.08052634e-05)]
この形式では、例えばx1の系列のみの抽出などを行うことができない。あくまでもこのリストが保持するndarrayはそれぞれ独立したオブジェクトであるからだ。
そこで次のように変換すると
code:python
x_array = numpy.array(x_list)
10×2のサイズをもつ1つのndarray型オブジェクトが得られる。
code:text
array([1.00000000e+00, 1.00000000e+00,
5.00000000e-01, 3.33333333e-01,
2.50000000e-01, 1.11111111e-01,
1.25000000e-01, 3.70370370e-02,
6.25000000e-02, 1.23456790e-02,
3.12500000e-02, 4.11522634e-03,
1.56250000e-02, 1.37174211e-03,
7.81250000e-03, 4.57247371e-04,
3.90625000e-03, 1.52415790e-04,
1.95312500e-03, 5.08052634e-05])
この形式にすれは、スライスによる各系列を容易に行うことが可能となる。
code:python
import matplotlib.pyplot as plt
plt.plot(x_array:,0) # x1を抽出
plt.show()
その2:行列の計算過程
例えば、計算過程の各ステップにおいて得られる$ 2\times 2行列$ Qの各要素をあとでプロットしたい場合を考える。2次元の行列を束ねた3次元配列を作ってもよいがそれでは添字の指定がややこしくなるので、安直に
code:text
[ q00 q01
q10 q11 ]
は
code:text
q00 q01 q10 q11
という具合にflattenメソッドを用いてベクトル化したうえで、その1のようにまとめてみよう。
code:python
import numpy
Q_list = []
q00, q01, q10, q11 = 1, 2, 3, 4
for i in range(10):
Q = numpy.array(q00, q01], [q10, q11)
Q_list.append(Q.flatten())
q00, q01, q10, q11 = q00/2, q01/3, q10/4, q11/5
print(Q_list)
Q_array = numpy.array(Q_list)
print(Q_array)
実行結果
code:text
[array(1, 2, 3, 4), array(0.5 , 0.66666667, 0.75 , 0.8 ), array(0.25 , 0.22222222, 0.1875 , 0.16 ), array(0.125 , 0.07407407, 0.046875 , 0.032 ), array(0.0625 , 0.02469136, 0.01171875, 0.0064 ), array(0.03125 , 0.00823045, 0.00292969, 0.00128 ), array(0.015625 , 0.00274348, 0.00073242, 0.000256 ), array(7.81250000e-03, 9.14494742e-04, 1.83105469e-04, 5.12000000e-05), array(3.90625000e-03, 3.04831581e-04, 4.57763672e-05, 1.02400000e-05), array(1.95312500e-03, 1.01610527e-04, 1.14440918e-05, 2.04800000e-06)]
これが、以下のようになる。
code:text
[1.00000000e+00 2.00000000e+00 3.00000000e+00 4.00000000e+00
5.00000000e-01 6.66666667e-01 7.50000000e-01 8.00000000e-01
2.50000000e-01 2.22222222e-01 1.87500000e-01 1.60000000e-01
1.25000000e-01 7.40740741e-02 4.68750000e-02 3.20000000e-02
6.25000000e-02 2.46913580e-02 1.17187500e-02 6.40000000e-03
3.12500000e-02 8.23045267e-03 2.92968750e-03 1.28000000e-03
1.56250000e-02 2.74348422e-03 7.32421875e-04 2.56000000e-04
7.81250000e-03 9.14494742e-04 1.83105469e-04 5.12000000e-05
3.90625000e-03 3.04831581e-04 4.57763672e-05 1.02400000e-05
1.95312500e-03 1.01610527e-04 1.14440918e-05 2.04800000e-06]