Python

2023年11月 7日 (火)

[Python]condaでパッケージをアップデートしようすると失敗する

condaコマンドを実行して、すべてのパッケージをアップデートしてみる。

>conda update --all
Collecting package metadata (current_repodata.json): failed
CondaHTTPError: HTTP 000 CONNECTION FAILED for url <https://repo.anaconda.com/pkgs/main/win-64/current_repodata.json>
Elapsed: -
An HTTP error occurred when trying to retrieve this URL.
HTTP errors are often intermittent, and a simple retry will get you on your way.
If your current network has https://www.anaconda.com blocked, please file
a support request with your network engineering team.
'https//repo.anaconda.com/pkgs/main/win-64'

上記のように表示された場合は、接続に失敗している。会社などの環境であれば、プロキシの設定を行うことで解決できる場合があるため、プロキシの設定を行う。

フォルダー「C:\Users\○○○\anaconda3」(○○○はアカウント名)にテキストファイル.condarcを作成(既にある場合はそれを使用)し、以下の3行を追加する。

proxy_servers:
http: http://○○○:×××@proxy.company.co.jp:8080
https: https://○○○:×××@proxy.company.co.jp:8080

それぞれ以下のとおり。なお、「http:」や「https:」の前は必ずスペース(0x20)でインデントすること。タブ文字や全角空白(0x8140)は絶対に使用してはいけない。

○○○: プロキシに接続するためのアカウント
×××: プロキシに接続するためのパスワード
proxy.company.co.jp: プロキシのアドレス
8080: プロキシのポート

設定が反映されて確認をする。以下のコマンドを実行する。

>conda config --show proxy_servers
proxy_servers:
http: http://○○○:×××@proxy.company.co.jp:8080
https: https://○○○:×××@proxy.company.co.jp:8080

設定したとおりに表示されればよい。行頭の空白の数は同じでなくてもかまわない。

再度、condaですべてのパッケージをアップデートしてみる。

>conda update --all
Collecting package metadata (current_repodata.json): done
Solving environment: done
(表示省略)
Proceed ([y]/n)?

最後に「Proceed ([y]/n)?」と表示されてキー入力の状態になれば、接続は成功。ここで「y」を選択すると全パッケージのアップデートが始まる。取りやめる場合は「n」を選択する。

なお、正しく設定しているのにどうしてもうまくいかない場合は、以下のように「http:」も「https:」も「http://~」と設定してみること。

proxy_servers:
http: http://○○○:×××@proxy.company.co.jp:8080
https: http://○○○:×××@proxy.company.co.jp:8080

2023年6月 5日 (月)

[Python]等差数列を作成する

numpyのlinspaceメソッドを使う。

>>> import numpy as np
>>> print(np.linspace(0, 12, 2))
[ 0. 12.]
>>> print(np.linspace(0, 12, 3))
[ 0. 6. 12.]
>>> print(np.linspace(0, 12, 4))
[ 0. 4. 8. 12.]
>>> print(np.linspace(0, 12, 5))
[ 0. 3. 6. 9. 12.]
>>> print(np.linspace(0, 12, 6))
[ 0. 2.4 4.8 7.2 9.6 12. ]

2023年4月26日 (水)

[Python]連立一次方程式を解く

solveメソッドを使う。以下の連立一次方程式を解く(解はx=3,y=2)。

 x + 2y = 7
3x - 4y = 1

解いてみる。

>>> import numpy as np
>>> mxaa = np.array([[1, 2], [3, -4]])
>>> mxy = np.array([7, 1])
>>> mxaa
array([[ 1, 2],
[ 3, -4]])
>>> mxy
array([7, 1])
>>> np.linalg.solve(mxaa, mxy)
array([3., 2.])

同じく以下の連立一次方程式を解く(解はx=2,y=-3,z=-14)。

 3x - 3y + z =  1
3x + 2y = 0
-1x - 5y + z = -1

解いてみる。

>>> mxaa = np.array([[3, -3, 1], [3, 2, 0], [-1, -5, 1]])
>>> mxy = np.array([1, 0, -1])
>>> mxaa
array([[ 3, -3, 1],
[ 3, 2, 0],
[-1, -5, 1]])
>>> mxy
array([ 1, 0, -1])
>>> np.linalg.solve(mxaa, mxy)
array([ 2., -3., -14.])

2023年4月15日 (土)

[Python]ファイルのハッシュ値を得る

hashlibライブラリを使う。以下はPHPの圧縮ファイルのハッシュ値(SHA256)を求めた例。

R_hash

>>> import hashlib
>>> f = open('php-8.2.4-Win32-vs16-x64.zip', 'br')
>>> b = f.read()
>>> hashlib.sha256(b).hexdigest()
'a3601fe23adfb4985be52eb3a7365716350e4b857c47583673a9aa53162885a3'
>>> f.close()

2023年4月13日 (木)

[Python]一般逆行列を求める

linalg.pinvメソッドを使う。

>>> import numpy as np
>>> mx = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]])
>>> print(mx)
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]
[13 14 15 16]]
>>> np.linalg.det(mx)
-1.820448242817726e-31
>>> np.linalg.inv(mx)
array([[ 1.50119988e+15, -3.75299969e+14, -3.75299969e+15,
2.62709978e+15],
[-1.95155984e+16, 1.95155984e+16, 1.95155984e+16,
-1.95155984e+16],
[ 3.45275971e+16, -3.79052969e+16, -2.77721977e+16,
3.11498974e+16],
[-1.65131986e+16, 1.87649984e+16, 1.20095990e+16,
-1.42613988e+16]])
>>> np.linalg.pinv(mx)
array([[-0.285 , -0.145 , -0.005 , 0.135 ],
[-0.1075, -0.0525, 0.0025, 0.0575],
[ 0.07 , 0.04 , 0.01 , -0.02 ],
[ 0.2475, 0.1325, 0.0175, -0.0975]])

一般逆行列の定義を満たしているか否か確認。

>>> mxi = np.linalg.pinv(mx)
>>> np.dot(np.dot(mx, mxi), mx)
array([[ 1., 2., 3., 4.],
[ 5., 6., 7., 8.],
[ 9., 10., 11., 12.],
[13., 14., 15., 16.]])

当然、正方行列でなくとも求めることができる。

>>> mx = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])
>>> print(mx)
[[1 2 3 4]
[5 6 7 8]]
>>> np.linalg.det(mx)
(表示省略)
numpy.linalg.LinAlgError: Last 2 dimensions of the array must be square
>>> np.linalg.inv(mx)
(表示省略)
numpy.linalg.LinAlgError: Last 2 dimensions of the array must be square
>>> np.linalg.pinv(mx)
array([[-5.50000000e-01, 2.50000000e-01],
[-2.25000000e-01, 1.25000000e-01],
[ 1.00000000e-01, -1.38777878e-17],
[ 4.25000000e-01, -1.25000000e-01]])
>>> mxi = np.linalg.pinv(mx)
>>> np.dot(np.dot(mx, mxi), mx)
array([[1., 2., 3., 4.],
[5., 6., 7., 8.]])

linalg.pinvメソッドはムーア・ペンローズ一般逆行列を数値的に求めるメソッドのため、求まった一般逆行列は近似値であることに注意。ムーア・ペンローズ一般逆行列の定義の4つの式について、比較をした例は以下のとおり。すべての要素がTrueにならないことがわかる。

>>> np.dot(np.dot(mx, mxi), mx) == mx
array([[False, False, False, True],
[False, False, False, False]])
>>> np.dot(np.dot(mxi, mx), mxi) == mxi
array([[False, False],
[False, True],
[False, False],
[False, False]])
>>> np.dot(mx, mxi).T == np.dot(mx, mxi)
array([[ True, False],
[False, True]])
>>> np.dot(mxi, mx).T == np.dot(mxi, mx)
array([[ True, False, False, False],
[False, True, False, True],
[False, False, True, True],
[False, True, True, True]])

2023年4月12日 (水)

[Python]逆行列を求める

linalg.invメソッドを使う。

>>> mx = np.array([[3]])
>>> mx
array([[3]])
>>> np.linalg.inv(mx)
array([[0.33333333]])
>>> mx = np.array([[1, 2], [3, 4]])
>>> mx
array([[1, 2],
[3, 4]])
>>> np.linalg.inv(mx)
array([[-2. , 1. ],
[ 1.5, -0.5]])
>>> mx = np.array([[3, -3, 1], [3, 2, 0], [-1, -5, 1]])
>>> mx
array([[ 3, -3, 1],
[ 3, 2, 0],
[-1, -5, 1]])
>>> np.linalg.inv(mx)
array([[ 1. , -1. , -1. ],
[-1.5, 2. , 1.5],
[-6.5, 9. , 7.5]])

正則ではない行列(行列式の値が0)の場合は、linalg.invメソッドはエラーを返す。

>>> mx = np.array([[1, 4, 7], [2, 5, 8], [3, 6, 9]])
>>> mx
array([[1, 4, 7],
[2, 5, 8],
[3, 6, 9]])
>>> np.linalg.det(mx)
0.0
>>> np.linalg.inv(mx)
Traceback (most recent call last):
(表示省略)
numpy.linalg.LinAlgError: Singular matrix

2023年3月14日 (火)

[Python]行列式を求める

linalg.detメソッドを使う。

>>> mx = np.array([[3]])
>>> mx
array([[3]])
>>> np.linalg.det(mx)
3.0000000000000004
>>> mx = np.array([[1, 2], [3, 4]])
>>> mx
array([[1, 2],
[3, 4]])
>>> np.linalg.det(mx)
-2.0000000000000004
>>> mx = np.array([[0, 3, 2, -1], [-4, 6, 1, 5], [0, -2, 3, -1], [-1, 0, 0, 2]])
>>> mx
array([[ 0, 3, 2, -1],
[-4, 6, 1, 5],
[ 0, -2, 3, -1],
[-1, 0, 0, 2]])
>>> np.linalg.det(mx)
27.999999999999986

2023年3月 6日 (月)

[Python]転置行列を求める

Tプロパティを使う。

>>> import numpy as np
>>> mx = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
>>> print(mx)
[[1 2 3]
[4 5 6]
[7 8 9]]
>>> print(mx.T)
[[1 4 7]
[2 5 8]
[3 6 9]]
>>> mx = np.array([[1, 2, 3], [4, 5, 6]])
>>> print(mx)
[[1 2 3]
[4 5 6]]
>>> print(mx.T)
[[1 4]
[2 5]
[3 6]]

2023年2月 4日 (土)

[Python]行列の掛け算

dotメソッドを使う。最後の例のとおり、掛けられる行列の列数と掛ける行列の行数が同じでなければ計算することはできない。

>>> mx1 = np.array([[-1, 0, 3], [8, 1, -5]])
>>> mx2 = np.array([[3, 4, 0], [-2, 1, 2]])
>>> mx3 = np.array([[4, -3, 7], [2, 0, -1], [1, 5, 0]])
>>> print(mx1)
[[-1 0 3]
[ 8 1 -5]]
>>> print(mx2)
[[ 3 4 0]
[-2 1 2]]
>>> print(mx3)
[[ 4 -3 7]
[ 2 0 -1]
[ 1 5 0]]
>>> np.dot(mx1, mx3)
array([[ -1, 18, -7],
[ 29, -49, 55]])
>>> np.dot(mx2, mx3)
array([[ 20, -9, 17],
[ -4, 16, -15]])
>>> np.dot(mx1, mx2)
Traceback (most recent call last):
File "", line 1, in
File "<__array_function__ internals>", line 5, in dot
ValueError: shapes (2,3) and (2,3) not aligned: 3 (dim 1) != 2 (dim 0)

2023年1月21日 (土)

[Python]固有値、固有ベクトルを求める

eigen関数を使う。固有値、固有ベクトルを求めたい行列を引数に与えると、固有値と固有ベクトルが一緒に返ってくる。

以下に求めた例を示す。見てのとおり、対称行列でなくても求めることができる。

>>> import numpy as np
>>> mxaa = np.array([[3, -2], [1, 0]])
>>> print(mxaa)
[[ 3 -2]
[ 1 0]]
>>> l, mxxx = np.linalg.eig(mxaa)
>>> print(l)
[2. 1.]
>>> print(mxxx)
[[0.89442719 0.70710678]
[0.4472136 0.70710678]]

1つ目の戻り値が固有値、2つ目が固有ベクトル値。例えば1つ目の固有値と固有ベクトルを取り出すには、以下のようにする。

>>> l[0]
2.0
>>> mxxx[:, 0]
array([0.89442719, 0.4472136 ])

2つ目の固有値と固有ベクトル。

>>> l[1]
1.0
>>> mxxx[:, 1]
array([0.70710678, 0.70710678])

以下、2つの行列の固有値と固有ベクトルを求めた例。

>>> mxaa = np.array([[6, -3, 5], [-1, 4, -5], [-3, 3, -4]])
>>> print(mxaa)
[[ 6 -3 5]
[-1 4 -5]
[-3 3 -4]]
>>> l, mxxx = np.linalg.eig(mxaa)
>>> print(l)
[3. 2. 1.]
>>> print(mxxx)
[[ 7.07106781e-01 -3.01511345e-01 -3.49387479e-15]
[ 7.07106781e-01 -9.04534034e-01 8.57492926e-01]
[ 4.54569491e-16 -3.01511345e-01 5.14495755e-01]]
>>> mxaa = np.array([[3, -1, 1], [0, 2, 1], [0, 0, 3]])
>>> print(mxaa)
[[ 3 -1 1]
[ 0 2 1]
[ 0 0 3]]
>>> l, mxxx = np.linalg.eig(mxaa)
>>> print(l)
[3. 2. 3.]
>>> print(mxxx)
[[1. 0.70710678 0. ]
[0. 0.70710678 0.70710678]
[0. 0. 0.70710678]]

より以前の記事一覧