Pythonゼミ 第3回 行列の操作とnumpy基礎


Last updated: 2024/03/07

1 行列の操作

m = list(range(10))
m.append(-10)
print(m)
m.insert(2, 11)
print(m)
>>
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -10]
[0, 1, 11, 2, 3, 4, 5, 6, 7, 8, 9, -10]

m = [9, 7, 1, 6, 2]
m.remove(7)
print(m)
>>
[9, 1, 6, 2]

m = [9, 7, 1, 6, 2]
del m[2]#ここのdelと上のremoveとの違いに注意
print(m)
>>
[9, 7, 6, 2]

m = [9, 7, 1, 6, 2, 5, 3]
print(m[0:6:2])
print(m[0::2])
print(m[-1::-1])
>>
[9, 1, 2]
[9, 1, 2, 3]
[3, 5, 2, 6, 1, 7, 9]

m = [9, 7, 1, 6, 2, 5, 3]
m.sort()
print(m)
m.sort(reverse=True)
print(m)
>>
[1, 2, 3, 5, 6, 7, 9]
[9, 7, 6, 5, 3, 2, 1]

m = [9, 7, 1, 6, 2, 5, 3]
print(max(m), min(m), sum(m)/len(m))
>>
9 1 4.714285714285714

m = [9, 7, 1, 6, 2, 5, 3]
print(m.index(6))
>>
3

m = [9, 7, 1, 6, 2, 5, 3]
n = [x*2 for x in m]
print(n)
>>
[18, 14, 2, 12, 4, 10, 6]


2 numpy基礎

「行列の操作」で紹介したように、もともとpythonでは行列の操作ができるが、もっと効率的な操作をするため(特に行列が非常に大きい、あるいは2次元以上の行列の場合)、numpy (numerical python)を使ったほうが便利です。


import numpy as np #いつもimportする必要がある(以下省略)
m = np.arange(10)
n = np.array([9, 7, 1, 6, 2, 5, 3])
print(m)
print(n)
m = np.arange(0, 1, 0.1)
n = np.linspace(0, 1, 10)
print(m)
print(n)
>>
[0 1 2 3 4 5 6 7 8 9]
[9 7 1 6 2 5 3]
[0.  0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9]
[0.         0.11111111 0.22222222 0.33333333 0.44444444 0.55555556
 0.66666667 0.77777778 0.88888889 1.        ]

n = np.array([9, 7, 1, 6, 2, 5, 3])
print(n.max(), n.min(), n.mean(), n.argmax(), n.argmin(), np.median(n))
>>
9 1 4.714285714285714 0 2 5.0

n = np.array([9, 7, 1, 6, 2, 5, 3])
indexMat = n.argsort()
print(indexMat)
>>
[2 4 6 5 3 1 0]

n = np.zeros(10)
print(n)
>>
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]

n = np.zeros((3, 4)) #2重括弧
print(n)
>>
[[0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]]

n = np.arange(12)
m = np.reshape(n, (3, 4))
print(m)
print(m[0, 2], m[1, 0])
m[2, 3] += 1
print(m)
>>
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
2 4
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 12]]

#pythonの行列とnumpy行列の操作方法は違うので、時々互いに変換する必要がある
m = []
m.append(3)
print(m)
m = np.array(m)
m = np.append(m, 8)
print(m)
m = list(m)
m.append(10)
print(m)
>>
[3]
[3 8]
[3, 8, 10]

#numpy行列とpython行列との重要な違い
n = np.array([9, 7, 1])
m = n+2
print(m)
m = n*2
print(m)
n = list(n)
m = n*2
print(m)
>>
[11  9  3]
[18 14  2]
[9, 7, 1, 9, 7, 1]

numpyのできることは非常に多いです。今後具体的な問題に合わせて少しずつ紹介します。

興味があれば、numpyのホームページを見てください:https://numpy.org/


問題


(第2回で使っていたファイルpython02-2.txtを使います。)

1.ファイルpython02-2.txtに1万行のデータがあります。各行10個の数字の平均値を計算すれば、1万個の平均値があります。その中に、最大の平均値は何ですか?そして、この平均値は何行目にありますか?


2.ファイルpython02-2.txtの各行の10個の数字の中に、最大値と最小値を除いて、残りの8個の数字の平均値をこの行の平均値にする。これで、1万行の最大の平均値は何ですか?そして、この平均値は何行目にありますか?


3.ファイルpython02-2.txtに10万個の数字があります。以下の各範囲にある数字の個数を求めよ。
[0, 1000), [1000, 2000), [2000, 3000), …, [9000, 10000)
*[0, 1000) というのは 0<=x<1000